前言
今天简单记录一下STM32系列单片机GPIO的八种工作模式,介绍每种工作模式的作用,以及我们初学者在什么时候该用哪种GPIO的工作模式。

一、GPIO的介绍
GPIO (general purpose input output)是通用输入输出端口的简称,通俗来讲就是单片机上的引脚,在STM32中,GPIO的工作模式被细分为8种,由4个32位寄存器共同控制。

输出和输入都是针对芯片引脚来讲的(即引脚的对外输出,和外界对引脚的输入)。

二、GPIO的八种工作模式



三、四种输入模式介绍
输入模式下可读取端口的高低电平或电压。例如各类传感器(使用ADC功能),如果要将获取的电平传送给单片机的某一个引脚,那就要将这个引脚设置为输入模式。

1、GPIO_Mode_AIN 模拟输入
这种输入模式比较特殊,该模式主要为片上外设ADC而配置,从外部读取模拟信号,当设置为模拟输入时,GPIO会失效,引脚直接接入内部ADC。特点:相较于其他输入模式只能读取到逻辑高/低电平(数字量),该模式能读取到细微变化的值(模拟量)。通俗来讲就是,别的模式只能读取0和1,而模拟输入可以读取到0-1的变化区间。

主要应用:所有要用到ADC模拟输入的外设(例如烟雾传感器,引脚需要接收模拟信号进而计算电压值),低功耗下省电。

2、GPIO_Mode_IN_FLOATING 浮空输入
数据通道中仅接入TTL触发器(作用是将相对缓慢变化的模拟信号变成矩形信号)整形,随后输入输入数据寄存器。浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空(无信号输入)的情况下,读取该端口的电平是不确定的。该种工作模式未接入任何上拉/下拉电阻。

主要应用:可用于按键KEY实验、发送接收信号RX、TX、IIC、USART等。(但按键一般更常用到上拉下拉输入,待会再重点记录)。主要还是发送和接收信号的引脚常设置为浮空输入。

3、GPIO_Mode_IPD 下拉输入

可读取引脚电平,与浮空输入相比,它内部连接下拉电阻,悬空时默认为低电平,其余相同。

4、GPIO_Mode_IPU 上拉输入

可读取引脚电平,与浮空输入相比,它内部连接上拉电阻,悬空时默认为高电平,其余相同。

主要应用:
①按键的使用
②器件的外部中断(IRQ)引脚触发中断条件为下降沿触发/低电平触发,这样在无信号输入时始终保持高电平,如果有事件触发中断IRQ可以输出一个低电平,进而可产生(下降沿/低电平)中断,此时就可以将该引脚设置为上拉输出,使中断条件满足。
③同理,器件的外部中断(IRQ)引脚触发中断条件为上升沿触发/高电平触发时,该端口可以选择下拉输入模式。

重点记录:按键与上拉/下拉输入


由图不难看出:当KEY_UP按下后,会接入VCC的高电平,而当按键不按下时,即为悬空状态(无信号输入),此时IO输入是未知的,程序可能卡死在这里或者跑飞。那我们就要用到一个下拉电阻,使该引脚在悬空状态下电平被拉低。即按键KEY_UP按下为高电平,不按下为低电平。、

同理,当KEY0、KEY1、KEY2三个按键按下时会接入GND的低电平,而不按下时输入未知。为了避免程序跑飞,采用上拉电阻,让按键按下时为低电平,按键松开为高电平。

四、四种输出模式介绍
输出模式下,可由芯片向外输出电平。例如点亮LED,就需要给LED提供高电平。

5、GPIO_Mode_Out_OD 开漏输出
当CPU输出逻辑0时,I/O端口输出低电平,而当CPU输出逻辑1时,该引脚处于开漏,也就是浮空状态(高阻态),如果想输出高电平则必须接入上拉电阻。同时IO口可以由外部电路改变为低电平或不变,即可读IO输入电平变化,实现了I/O端口的双向功能。简单来说,开漏输出只可以输出强低电平,高电平得靠外部电阻拉高。显然,这种输出方式就有一个优点,由于高电平完全由外部电阻控制,那此模式下的输出电平是可以通过改变电阻而改变的。此外,可以将多路开漏输出的引脚连接到一条线上,通过一个上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系,这也是I2C,SMBus,等总线判断总线占用状态的原理。

主要应用:该模式适用于电平不匹配场合、适合做电流型的驱动,吸收电流能力比较强。

6、GPIO_Mode_Out_PP 推挽输出
输出具有驱动能力,当CPU输出逻辑0时,I/O端口输出低电平,而当CPU输出逻辑1时,I/O端口输出高电平。相当于可以给其他元件供电,并且可以直接通过逻辑语言0和1控制是否供电。

主要应用:点灯以及其他所有需要直接提供高低电平的操作。

7、GPIO_Mode_AF_OD 复用开漏输出
当有多个不同的模块对应同一个引脚时,那这个GPIO就要使用复用功能,其他方面与开漏输出相同。即如果用在IC、SMBUS这些需要线与功能的复用场合,就使用复用开漏模式。

主要应用:片内外设功能(TX1、MOSI、MISO.SCK.SS)

8、GPIO_Mode_AF_PP 复用推挽输出

和复用开漏输出同理,当某一个GPIO对应多个复用模块时,要用到复用功能。

主要应用:片内外设功能(I2C的SCL、SDA)

作为初学者的一句话总结:
输入一般用浮空输入,如果要使引脚在悬空状态时电平确定就用上拉/下拉输入,如果要输入连续的模拟量就用模拟输入。
输出一般用推挽输出,如果要调节输出的电平就用开漏输出,如果有端口复用的情况就用复用输出模式。