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.编译及仿真

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

查阅 CRL 寄存器说明
STM32复习笔记(五) —— GPIO锁定机制
STM32复习笔记(五) —— GPIO锁定机制
可知 GPIOB 的 GPIO_Pin_0 已配置为推挽输出,10MHz,结果与预想一致

上一篇:error: command 'gcc' failed with exit status 1


下一篇:Egg.js 中入参的校验