STM32F407 GPIO引脚配置锁定序列写法疑问求助
STM32F4 GPIO配置锁定序列疑问解答
问题背景
我在开发STM32F407的GPIO驱动,实现引脚配置锁定功能时,参考了STM32F4系列参考手册第285页的内容,手册给出的锁定密钥写入序列如下:
LOCK key write sequence:
WR LCKR[16] = ‘1’ + LCKR[15:0]
WR LCKR[16] = ‘0’ + LCKR[15:0]
WR LCKR[16] = ‘1’ + LCKR[15:0]
RD LCKR
RD LCKR[16] = ‘1’ (this read operation is optional but it confirms that the lock is active)
我有两个疑问:
- 无法理解
LCKR[16] = ‘1’ + LCKR[15:0]的含义:LCKR[16]仅为1位,而‘1’+LCKR[15:0]是16位值,如何将16位值赋值给1位? ‘0’ + LCKR[15:0]的写法意义何在?它和直接写LCKR[15:0]是否等价?
解答
关于LCKR[16] = ‘1’ + LCKR[15:0]的歧义纠正
手册的写法是简化表述,并非单独给LCKR[16]位赋值,实际是向整个LCKR寄存器写入一个17位的完整值:
- LCKR是17位寄存器,第16位为锁存激活位(LCKK),低16位对应GPIO端口的16个引脚(某位置1表示对应引脚的配置将被锁定)。
- 手册里的
‘1’ + LCKR[15:0]翻译为代码逻辑是:(1 << 16) | 引脚掩码,其中引脚掩码就是你要锁定的引脚对应的LCKR[15:0]位值。
关于‘0’ + LCKR[15:0]的作用
这一步是锁定序列的强制时序要求,不能省略,也不能直接只写LCKR[15:0]:
- 它对应的代码逻辑是:
0 << 16 | 引脚掩码,也就是写入寄存器时,第16位设为0,低16位保持引脚掩码不变。 - ST的GPIO锁定机制要求严格遵循“写1+掩码 → 写0+掩码 → 写1+掩码”的三步写入时序,只有完成这三次特定写操作,硬件才会触发引脚配置的锁定。如果跳过第二步或直接写掩码,锁定请求不会被硬件识别,引脚配置仍可修改。
验证锁定状态
完成三次写入后,读取LCKR寄存器:
- 如果第16位(LCKK)变为1,说明锁定成功。
- 这一步是可选操作,但能直观确认锁存是否生效。
内容的提问来源于stack exchange,提问作者abdo Salm
相关产品推荐
相关产品推荐

