微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于STM32端口锁定寄存器的理解与疑问,IO口配置锁定只针对低8个有效么

关于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积分

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top