引脚的高、低电平控制,有3种方法(3个寄存器)

分别是通过GPIO的 3个 管脚控制寄存器:

  1. ODR寄存器, 控制管脚的高、低电平,低16位有效,写1 高电平, 写0 低电平;
  2. BSRR寄存器, 控制管脚的高、低电平,32位有效,低16位写1 高电平,高16位写1 低电平;
  3. BRR寄存器, 控制管脚的电平,低16位有效,写1 低电平;

端口位设置/清除寄存器 Port bit set/reset register (GPIOx_BSRR)

BSRR 寄存器, 控制管脚的高、低电平,32位有效,低 16 位写 1 高电平,高 16 位写1 低电平;
BSRR 寄存器并不是直接控制引脚输出的高低电平,最终还是通过改变 ODR 寄存器来间接控制的。
image.png

BSRR 寄存器存在的必要性

如何理解「只能写入」

我之前对于「只能写入」这一说法的认识是很模糊的,但今天在 Keil 实操了一次,感觉好像理解了一些。在正点原子论坛的帖子里看到一个很形象的比喻:

BSRR里面的位相当于一个个可自动弹起的“按键”,写“1”的时候相当于按键按下,完成功能后“自动”“弹起”。

在 Keil 中进入仿真,然后顶部菜单栏选择「Peripherals」—>「System Viewer」—>「GPIO」—>「GPIOB」,打开 GPIOB 的寄存器观察窗口。
image.png
下面的动图就很好地展示了何谓「按钮」:

  • 图中我手动给 BS0、BS1、BR0、BR1 置位,BS0、BS1、BR0、BR1 对应的 Value 会短暂地打勾,然后又都会很快自动恢复到未打勾状态;
  • 由此同时,当 BS0、BS1 分别置位的时候,对应的 ODR0、ODR1 也会同时置位;
  • 当 BR0、BR1 分别置位的时候,对应的 ODR0、ODR1 也会同时清除;

BSRR.gif

结合 HAL 库源码理解

参考链接

STM32开发 —- 寄存器ODR,BRR,BSRR的区别