关于STM32端口锁定寄存器的理解与疑问,IO口配置锁定只针对低8个有效么
时间:10-02
整理:3721RD
点击:
先附上个人理解吧,刚刚开始学,出错之处欢迎指正:
STM32端口配置寄存器GPIOx_LCKR可以用来锁定重要端口的配置,写入正确序列后在锁定标记位LCKK=1期间,已锁定的端口配置不会因为外部干扰而使配置改变;这些可以通过以下程序段得到验证:
u32 a,b;
GPIOB->CRL=0x33333333;
GPIOB->CRH=0x33333333;//先配置端口
GPIOB->LCKR=0x10001;
GPIOB->LCKR=0x00001;
GPIOB->LCKR=0x10001;
a=GPIOB->LCKR>>16;//写入写序列,同时写入希望锁定的端口位(B0端口)
b=GPIOB->LCKR>>16;//验证标记位确实为1
GPIOB->CRH=0x66666666;
GPIOB->CRL=0x66666666;//写入新端口配置看B0端口是否被锁定(运行结果确实B0被锁定,无法更改,其他均可以更改)
GPIOB->LCKR=0x00001;//更改一下LCKK试一下
a=GPIOB->LCKR>>16;//读出LCKK还是1,无法更改
GPIOB->CRH=0x66666666;
GPIOB->CRL=0x66666666;//端口配置也是继续被锁定
以上为本人参考STM32使用手册自己操作实验结果,但是,发现一个问题,锁定只针对0~7端口有效,尝试锁定8~15端口时则自动跳转到0~7,但是LCKR寄存器显示锁定的端口正常,试了很久没有找到原因,希望高人指点一二。
今天偶尔翻到了配套库函数,然后直接引用库函数源代码,经过试验,发现还是只有低8位有效,高位则自动跳转到低位对应位,下面是库函数源代码:
**
* @brief Locks GPIO Pins configuration registers.
* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
* @param GPIO_Pin: specifies the port bit to be written.
* This parameter can be any combination of GPIO_Pin_x where x can be (0..15).
* @retval None
*/
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
uint32_t tmp = 0x00010000;
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_Pin));
tmp |= GPIO_Pin;
/* Set LCKK bit */
GPIOx->LCKR = tmp;
/* Reset LCKK bit */
GPIOx->LCKR = GPIO_Pin;
/* Set LCKK bit */
GPIOx->LCKR = tmp;
/* Read LCKK bit*/
tmp = GPIOx->LCKR;
/* Read LCKK bit*/
tmp = GPIOx->LCKR;
}
如有错误之处,欢迎指正
已退回1积分