其他分享
首页 > 其他分享> > STM32复习笔记(五) —— GPIO锁定机制

STM32复习笔记(五) —— GPIO锁定机制

作者:互联网

STM32复习笔记(五) —— GPIO锁定机制

1.GPIO 锁定机制

锁定机制可以锁定 IO 口的配置,锁定一个端口位之后,直至下一次复位之前,将不能再更改端口位的配置

2.本例程软件设计思路

1)初始化时即锁定 GPIOB 的 GPIO_Pin_0 配置
2)确认锁定后再尝试修改 GPIOB 的 GPIO_Pin_0 配置为推挽输出模式,10MHz

GPIOx CRL and CRH 寄存器复位值为 0x44444444,即默认浮空输入模式,所以锁定后引脚当前的配置为默认配置,如尝试修改不成功,即表明锁定机制生效

3.代码编写

于 main.c 中编写代码

#include "stm32f10x.h"

#define  USE_GPIO_LCKR  1 //1锁定 0不锁定

typedef enum
{
	S_GPIO_Mode_OUT     = 0x01, //输出, 速率 10MHz
	S_GPIO_OType_PP     = 0x00  //通用推挽输出
	
}GPIOA_Config_TypeDef;

int main(void)
{
	//GPIO_Pin_0 配置
	uint32_t spinposl = 0x00;	

#if USE_GPIO_LCKR
	//读写 LCKR 寄存器
  uint32_t stmp = 0x00;
#endif
	
#if USE_GPIO_LCKR
	/* --------- 锁定 KEY IO 口 配置 --------- --------- --------- - */
	
	//GPIOB GPIO_Pin_0 的配置锁定
	GPIOB->LCKR |=  ((uint32_t)0x01 << spinposl);
	
	//写序列
	GPIOB->LCKR |=  ((uint32_t)0x01 << 16);
	GPIOB->LCKR &= ~((uint32_t)0x01 << 16);
	GPIOB->LCKR |=  ((uint32_t)0x01 << 16);
	stmp = GPIOB->LCKR;
	stmp = GPIOB->LCKR;
	
	//确认已锁定,锁定的配置为复位值 (即 KEY IO 当前配置为浮空输入模式)
	if(0x01 == stmp)
#endif
	{
		/* --------- KEY IO 口 配置 --------- --------- --------- ------ */

		//开启 GPIOB 时钟
		RCC->APB2ENR |= ((uint32_t)1 << 3);
		
		//输出模式,10MHz
		GPIOB->CRL &= ~((uint32_t)0x03 << (spinposl * 4));
		GPIOB->CRL |=  ((uint32_t)S_GPIO_Mode_OUT << (spinposl * 4));
		
		//推挽输出模式
		GPIOB->CRL &= ~((uint32_t)0x03 << ((spinposl * 4) + 2));
		GPIOB->CRL |=  ((uint32_t)S_GPIO_OType_PP << ((spinposl * 4) + 2));
	}
	
	while(1);
}

4.编译及仿真

点击编译,如无错误可进入仿真界面
SSS5.001
SSS5.002
打开 System Viewer - GPIO - GPIOB 查看 GPIOB 各个寄存器状态
SSS5.003
运行前 CRL and CRH 寄存器为复位值 0x44444444
SSS5.004
点击运行,锁定机制已生效,但 CRL 寄存器值仍保持复位值
SSS5.005
停止并退出仿真,将锁定机制去除,编译后再进入仿真,点击运行
SSS5.006
SSS5.007
可见,CRL 寄存器值变为 0x44444441,此时锁定机制并未开启

查阅 CRL 寄存器说明
SSS5.008
SSS5.009
可知 GPIOB 的 GPIO_Pin_0 已配置为推挽输出,10MHz,结果与预想一致

标签:GPIOB,复习,LCKR,STM32,GPIO,锁定,uint32,CRL
来源: https://blog.csdn.net/qq_45691873/article/details/120592623