沐印
1379 字
7 分钟
嵌入式 - GPIO

定义#

GPIO (General-Purpose Input/Output) 通用输入输出,简称为IO口。其作用是通过软件来控制连接在此GPIO口上的外设。

GPIO支持4种输入模式:

浮空输入(GPIO_Mode_IN_FLOATING) 上拉输入(GPIO_Mode_IPU) 下拉输入(GPIO_Mode_IPD) 模拟输入(GPIO_Mode_AIN) GPIO支持4种输出模式:

开漏输出(GPIO_Mode_Out_OD) 开漏复用输出(GPIO_Mode_AF_OD) 推挽输出(GPIO_Mode_Out_PP) 推挽复用输出(GPIO_Mode_AF_PP) 同时,GPIO 还支持三种最大翻转速度(2MHz、10MHz、50MHz)。每个I/O口可以自由编程,但 I/O 口寄存器必须按32位字访问。

IO模式作用/案例
上拉/下拉输入检测外部信号(按键)
模拟输入ADC模拟输入或低功耗下省电
开漏输出一般应用在I2C和SMBUS等需要线与的总线电路中
推挽输出一般应用在输出电平为0和3.3伏而且需要高速切换开关状态的场合。除了必须用开漏的场景,一般都使用推挽。
复用推挽输出片内外设(SPI, USB等)
复用开漏输出片内外设(I2C的SDA和SCL)

总结#

开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极。适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);

推挽输出:可以输出强高、低电平,连接数字器件。

image

GPIO 组成原理#

image

image

从上面原理图可以看出 STM32 的 GPIO 是由三个寄存器以及 TTL 肖特基触发器、二极管、P-MOS 管和 N-MOS 管组成。

引脚输入输出电平:0~3.3V,带 FT(Five Tolerate)即可容忍 5V 输入。

GPIO 工作原理#

推挽输出#

image

推挽输出结构是由两个 MOS 或者三极管收到互补控制的信号控制,在该图中由 N-MOS 和 P-MOS 控制。推挽输出的最大特点是可以真正能真正的输出高电平和低电平,在两种电平下都具有驱动能力。

在推挽输出模式时,N-MOS 管和 P-MOS 管都工作,如果我们控制输出为 0(低电平),则 P-MOS 管关闭,N-MOS 管导通,输出低电平;若控制输出为 1(高电平),则 P-MOS 管导通,N-MOS 管关闭,输出高电平。外部上拉和下拉的作用是控制在没有输出时的 IO 口电平。

优点:驱动能力强,电平切换能力快(根据 GPIO 的波特率可用作模拟其他协议)。

缺点:多个推挽输出端口相连时,由于通路上阻抗较小电流会从 IO 的 VDD 流向另一个 IO 的 GND,会发生短路进而对端口造成伤害。

开漏输出#

image

开漏输出时只有 N-MOS 管工作,只能输出低电平。当其输出高电平时没有驱动能力(电压会被外部阻抗拉低),需要借助外部上拉电阻完成对外驱动(通断 N-MOS 实现对路径上的电压控制),驱动能力取决于上拉电阻阻值。

如果我们控制输出为 0(低电平),则 P-MOS 管关闭,N-MOS 管导通,输出低电平;若控制输出为 1(高电平),则 P-MOS 管和 N-MOS 管都关闭,输出指令就不会起到作用,此时 I/O 端口的电平就不由输出的高低电平决定,而是由 I/O 端口外部的上拉或者下拉决定。如果没有上拉或者下拉 IO 口就处于悬空状态。

复用输出#

image

GPIO 复用为其他外设(I2C, SPI …),输出数据寄存器 GPIOx_ODR 无效, 输出的高低电平的来源于其它外设,其他功能和原理与开漏 / 推挽相同。根据具体需求选择复用开漏还是复用推挽(在 STM32CubeMX 中配置好相应的其他外设会自动生成对应 IO 复用为哪种输出)。

浮空输入#

image

浮空输入模式(可读取外部状态 0/1)下,I/O 端口的电平信号直接进入输入数据寄存器。MCU 直接读取 I/O 口电平,I/O 的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。 (用电压表测量其引脚电压为 1 点几伏) 可以用来做按键识别。

上拉输入#

image

IO 内部接上拉电阻(弱上拉,输出电流弱),IO 口默认高电平,以读取外部状态低电平。如需求大电流上拉需要添加外部上拉电阻。

下拉输入#

image

IO 内部接下拉电阻(弱下拉,输出电流弱),IO 口默认低电平,以读取外部状态高电平。

模拟输入模式#

image

当 GPIO 引脚用于 ADC 采集电压的输入通道时,用作 “模拟输入” 功能,此时信号不经过施密特触发器,直接进入 ADC 模块,并且输入数据寄存器为空,MCU 不能在输入数据寄存器上读到引脚状态。

当 GPIO 用于模拟功能时,IO 端口的上 / 下拉电阻是不起作用的,这个时候即使配置了上拉或下拉模式,也不会影响到模拟信号的输入输出。

除了 ADC 和 DAC 要将 IO 配置为模拟通道之外,其他外设功能一律配置为复用功能模式。

参考内容#

https://zhuanlan.zhihu.com/p/687626500

嵌入式 - GPIO
https://f.undf.top/posts/post/code/embedded/找工作/嵌入式---gpio/
作者
沐印
发布于
2024-07-04
许可协议
CC BY-NC-SA 4.0