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.编译及仿真
点击编译,如无错误可进入仿真界面
打开 System Viewer - GPIO - GPIOB 查看 GPIOB 各个寄存器状态
运行前 CRL and CRH 寄存器为复位值 0x44444444
点击运行,锁定机制已生效,但 CRL 寄存器值仍保持复位值
停止并退出仿真,将锁定机制去除,编译后再进入仿真,点击运行
可见,CRL 寄存器值变为 0x44444441,此时锁定机制并未开启
查阅 CRL 寄存器说明
可知 GPIOB 的 GPIO_Pin_0 已配置为推挽输出,10MHz,结果与预想一致