初次接触STM32,对GPIO的工作模式有时一脸懵,在此作个简记。
GPIO工作模式
STM32的GPIO有4种输入模式(浮空输入、上拉输入、下拉输入、模拟输入),4种输出模式(开漏输出、复用开漏输出、推挽输出、复用推挽输出)。
浮空输入
在该模式下,I/O口的电平信号直接进入GPIO端口输入数据寄存器(GPIOx_IDR)
,MCU直接读取I/O口的电平,I/O口的电平状态完全由外部输入来决定;若该引脚悬空(无信号输入),读取到的电平状态为不确定。
上拉输入
I/O口内部接上拉电阻,若引脚悬空或I/O口外部没有信号输入,I/O口默认为高电平;若I/O口输入低电平,则引脚为低电平,MCU读取到的就是低电平。
下拉输入
I/O口内部接下拉电阻,若引脚悬空或I/O口外部没有信号输入,I/O口默认为低电平;若I/O口输入高电平,则引脚就为高电平,MCU读取到的就是高电平。
模拟输入
在该模式下,GPIOx_IDR
为空,引脚的上拉/下拉电阻不起作用(即使配置了上拉/下拉模式)。
开漏输出
在该模式下,若控制输出为低电平,I/O口处于低电平状态;若控制输出为高电平,I/O口的电平状态由I/O口外部的上拉/下拉电阻来决定,若无上拉/下拉,I/O口处于悬空状态。
在该模式下,输入可用,可通过GPIOx_IDR
读取I/O口的实际状态,I/O口的电平不一定是输出的电平。
复用开漏输出
GPIO复用为其他外设,GPIO端口输出数据寄存器(GPIOx_ODR)
无效;输出的高/低电平来源于其它外设,输入可用,可通过GPIOx_IDR
获取I/O实际状态,除了输出信号的来源改变外,其它与开漏输出模式功能相同。
推挽输出
在该模式下,若控制输出为低电平,I/O口处于低电平状态;若控制输出为高电平,I/O口处于高电平状态,外部上拉/下拉可控制在没有输出时I/O口的电平。
在该模式下,输入可用,可通过GPIOx_IDR
读取I/O口的实际状态,I/O口的电平一定是输出的电平。
复用推挽输出
GPIO复用为其他外设,GPIOx_ODR
无效;输出的高/低电平来源于其它外设,输入可用,可通过GPIOx_IDR
获取I/O实际状态,除了输出信号的来源改变外,其它与推挽输出模式功能相同。
补充
推挽输出模式可以输出强高/强低电平,连接数字器件;
开漏输出模式可以输出强低电平,需要外接上拉电阻才能实现输出高电平;
任何一种开漏模式,都需要接上拉电阻,否则只能输出低电平。
上拉输入/下拉输入可用于检测外部信号(例如,按键);
开漏输出一般应用于IIC等需要
线与
功能的总线电路中;复用开漏输出/复用推挽输出应用于片内外设;
STM32的GPIO输出,除了必须用开漏模式的场合,一般都使用推挽模式。