STM32-GPIO与AFIO

GPIO的8种工作模式

1.四种输入模式

  • Analog – 模拟输入
  • Input Floating – 浮空输入
  • Input Pull-up – 上拉输入
  • Input Pull-down – 下拉输入

2.四种输出模式

  • Output Open-drain – 开漏输出
  • Output Push-pull – 推挽输出
  • Alternative Function Open-drain – 复用开漏输出
  • Alternative Function Push-pull – 复用推挽输出

GPIO部分解读

1.开漏和推挽输出的区别

  • 图中黄线为工作在推挽输出模式时可以存在的状态。设置高电平时P-MOS打开,N-MOS关闭,橘色线为高电平;设置低电平时P-MOS关闭,N-MOS打开,橘色线为低电平。
  • 图中绿线为工作在开漏输出模式时可以存在的状态。设置高电平时P-MOS关闭,N-MOS关闭,橘色线为高阻态;设置低电平时P-MOS关闭,N-MOS打开,橘色线为低电平。

2.关于5V容忍Five-Voltage Tolerant(FT)端口

  • 似乎很多小伙伴认为GPIO直接接电源或地会烧毁芯片,似乎是存在什么误区。上图来自数据手册,可以看到5V容忍的GPIO电压(大概)范围为-0.3~7.3V,非5V容忍GPIO电压范围为-0.3~4.0V。同时根据网友和我的使用经验,即使是在非5V容忍的GPIO上(如ADC口)接入5V左右的电压并不会损坏端口,只不过ADC采样值保持在4095。但设计中我们应避免长时间处于该状态,降低损坏的可能性。

GPIO输出控制寄存器

  1. 端口输出数据寄存器(GPIOx_ODR)
    • 顾名思义,该寄存器直接对应端口的输出状态,即我们可以读写该寄存器以得到/写入IO状态。
    • 由于STM32的IO实际为16位,因此只有低16位为有效数据,高16位为0。
    • 寄存器低16位:置1则设置该IO电平为高,置0则设置该IO电平为低。
  2. 端口位设置/清除寄存器(GPIOx_BSRR)
    • 为了方便用户直接操作IO的状态,STM32的这个寄存器为我们提供了极大的方便,省去了读ODR做位运算再写入的过程。因此该寄存器只可进行写入操作。
    • 同样地,STM32的IO为16位,理论只应该有16位有效数据。然而由于该寄存器可以同时设置(高电平)、清除(低电平),因此该寄存器实际为32位全有效。
    • 寄存器低16位:置1则设置该IO电平为高,置0则不改变状态。
    • 寄存器高16位:置1则设置该IO电平为低,置0则不改变状态。
    • 若不慎同时设置某IO对应的高位和低位均为1,则设置该IO电平实际为高。
  3. 端口位清除寄存器(GPIOx_BRR)
    • 似乎第一个寄存器实现了基本操作,第二个寄存器也简化了用户操作。但STM32有些完美主义:希望只操作低16位就能设置高低电平状态。高电平显然很容易,直接对BSRR寄存器的对应位置1即可;但倘若是低电平,还要左移16位再写入寄存器,即使这并不复杂,但STM32还是帮了我们。
    • 根据上述介绍,显然,BRR寄存器只有16位有效数据,因此高16位无效。
    • 寄存器低16位:置1则设置该IO电平为高,置0则不改变状态。
  4. 技巧-位运算不改变原值的两个思路:与运算该位赋1,或运算该位赋0.

AFIO

  • AFIO即Alternate Functions IO,端口复用功能,即该引脚的特殊功能。其功能对应表格可参阅datasheet或referenceManual.
  • AFIO部分寄存器承担复用功能重映射的任务。通过使能AFIO和配置寄存器即可将某复用功能转移到可转移的其它引脚。其功能对应表格可参阅datasheet或referenceManual.
  • 以下是与 AFIO 相关的寄存器,操作它们前我们要打开AFIO的时钟。
    • 事件控制寄存器(AFIO_EVCR)
    • 复用重映射和调试I/O 配置寄存器(AFIO_MAPR)
    • 外部中断配置寄存器1(AFIO_EXTICR1)
    • 外部中断配置寄存器2(AFIO_EXTICR2)
    • 外部中断配置寄存器3(AFIO_EXTICR3)
    • 外部中断配置寄存器4(AFIO_EXTICR4)