打印
[N32G03x]

GPIO锁定机制

[复制链接]
426|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sy12138|  楼主 | 2022-8-29 10:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在使用GPIO的时候,为了防止有些已经配置的GPIO被不小心重新配置,这里可以使用GPIO锁定机制,对GPIO的端口模式寄存器GPIO_PMODE,输出模式寄存器GPIO_POTYPE,端口上下拉寄存器GPIO_PUPD,翻转速率寄存器GPIO_SR,驱动能力寄存器GPIO_DC,复用寄存器GPIO_AF等寄存器进行锁定,锁定之后就不可以重新配置了。这里用到的寄存器是GPIO_PLOCK寄存器,寄存器描述如下,通过GPIOx_PLOCK[0:15]选择需要锁定的IO口,对16位即PLOCKK位写1、写0、写1、读0便可成功锁定GPIO了

224b2ce93f6d91494ef45c66ed8dd0d.png (109.79 KB )

224b2ce93f6d91494ef45c66ed8dd0d.png

使用特权

评论回复
沙发
sy12138|  楼主 | 2022-8-29 11:00 | 只看该作者
测试代码如下:
         LedInit(GPIOB, GPIO_PIN_1 | GPIO_PIN_6 | GPIO_PIN_7);
         LedOn(GPIOB, GPIO_PIN_1 | GPIO_PIN_6 | GPIO_PIN_7);
             //Delay(0x28FFFF);
             RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB|RCC_APB2_PERIPH_GPIOA|RCC_APB2_PERIPH_AFIO, ENABLE);

            
             GPIOB->PLOCK = 0x10002;  //PLOCKK写1   
                 GPIOB->PLOCK = 0x00002;  //PLOCKK写0   
                 GPIOB->PLOCK = 0x10002;  //PLOCKK写1
               
                 read = GPIOB->PLOCK;  //读0
                 read = GPIOB->PLOCK;  //读1
       
                 GPIO_InitStruct(&GPIO_InitStructure);
         GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_6 | GPIO_PIN_7;
         GPIO_InitStructure.GPIO_Mode = GPIO_MODE_INPUT;
         GPIO_InitPeripheral(PORT_GROUP, &GPIO_InitStructure);
while (1)
    {

      LedBlink(PORT_GROUP, LED1_PIN | LED2_PIN | LED3_PIN);
      Delay(0x28FFFF);
    }
可以看到代码中将PB1锁定,然后对PB1、PB6、PB7重新配置,再进行翻转。如图所示,只有PB1控制的LED在闪烁,PB6、PB7控制的LED熄灭

432542185f373212e33048d62774049.jpg (191.42 KB )

432542185f373212e33048d62774049.jpg

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

92

主题

404

帖子

15

粉丝