参考:
1.正点原子
前言:
GPIO英文全称general purpose intput output,是通用输入输出端口的简称,可以通过软件来控制其输入和输出.GPIO是STM32F407最基础 最简单 最常用的外设。虽然简单还是有必要再总结记录GPIO的一些重点:
1.GPIO的常用8种操作模式,分别适用于什么场景。
2.HAL对GPIO的几个操作接口。
3.通过STM32CubeMX配置最基础的工程框架。
1.1 STM32F407 GPIO 简介
GPIO 是控制或者采集外部器件的信息 的外设,即负责输入输出。它按组分配存在,每组最多 16 个 IO 口,组数视芯片而定。比如:STM32F407ZGT6 芯片是 144 脚的芯片,分为 7 组,分别是:GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF 和 GPIOG,其中共有 112 个 IO口可供我们编程使用。
这里重点说一下 STM32F407 的 IO 电平兼容性问题,STM32F407 的绝大部分 IO 口,都兼容 5V,至于到底哪些是兼容 5V 的,请看 STM32F407ZG 的数据手册(注意是数据手册,不是中文参考手册),见表 5 大容量 STM32F40xxx 引脚定义,凡是有 FT 标志的,都是兼容 5V 电平的 IO 口,可以直接接 5V 的外设(注意:如果引脚设置的是模拟输入模式,则不能接 5V!),凡是不带 FT 标志的,就建议大家不要接 5V 了,可能烧坏 MCU。
1.1.1 GPIO 功能模式
GPIO 有八种工作模式,分别是:
1、输入浮空
2、输入上拉
3、输入下拉
4、模拟
5、开漏输出
6、推挽输出
7、开漏式复用功能
8、推挽式复用功能
1.1.2 GPIO 基本结构分析
我们知道了 GPIO 有八种工作模式,具体这些模式是怎么实现的?下面我们通过 GPIO 的基本结构图来分别进行详细分析,先看看总的框图,如图 13.1.2.1 所示。
如上图所示,可以看到右边只有 I/O 引脚,这个 I/O 引脚就是我们可以看到的芯片实物的引脚,其他部分都是 GPIO 的内部结构。
① 保护二极管
保护二极管共有两个,用于保护引脚外部过高或过低的电压输入。当引脚输入电压高于VDD 时,上面的二极管导通,当引脚输入电压低于 VSS 时,下面的二极管导通,从而使输入芯片内部的电压处于比较稳定的值。虽然有二极管的保护,但这样的保护却很有限,大电压大电流的接入很容易烧坏芯片。所以在实际的设计中我们要考虑设计引脚的保护电路。
② 上拉、下拉电阻
它们阻值大概在 30~50K 欧之间,可以通过上、下两个对应的开关控制,这两个开关由寄存器控制。当引脚外部的器件没有干扰引脚的电压时,即没有外部的上、下拉电压,引脚的电平由引脚内部上、下拉决定,开启内部上拉电阻工作,引脚电平为高,开启内部下拉电阻工作,则引脚电平为低。同样,如果内部上、下拉电阻都不开启,这种情况就是我们所说的浮空模式。浮空模式下,引脚的电平是不可确定的。引脚的电平可以由外部的上、下拉电平决定。需要注意的是,STM32 的内部上拉是一种“弱上拉”,这样的上拉电流很弱,如果有要求大电流还是得外部上拉。
③ 施密特触发器
对于标准施密特触发器,当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变,也就是说输出由高电准位翻转为低电准位,或是由低电准位翻转为高电准位对应的阈值电压是不同的。只有当输入电压发生足够的变化时,输出才会变化,因此将这种元件命名为触发器。这种双阈值动作被称为迟滞现象,表明施密特触发器有记忆性。从本质上来说,施密特触发器是一种双稳态多谐振荡器。施密特触发器可作为波形整形电路,能将模拟信号波形整形为数字电路能够处理的方波波形,而且由于施密特触发器具有滞回特性,所以可用于抗干扰,其应用包括在开回路配置中用于抗扰,以及在闭回路正回授/负回授配置中用于实现多谐振荡器。
下面看看比较器跟施密特触发器的作用的比较,就清楚的知道施密特触发器对外部输入信号具有一定抗干扰能力,如图 13.1.2.2 所示。
④ P-MOS 管和 N-MOS 管
这个结构控制 GPIO 的开漏输出和推挽输出两种模式。开漏输出:输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。推挽输出:这两只对称的 MOS 管每次只有一只导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载拉电流。推拉式输出既能提高电路的负载能力,又能提高开关速度。
上面我们对 GPIO 的基本结构图中的关键器件做了介绍,下面分别介绍 GPIO 八种工作模式对应结构图的工作情况。
⚫ 1、输入浮空
输入浮空模式:上拉/下拉电阻为断开状态,施密特触发器打开,输出被禁止。输入浮空模式下,IO 口的电平完全是由外部电路决定。如果 IO 引脚没有连接其他的设备,那么检测其输入电平是不确定的。该模式可以用于按键检测等场景。
2、输入上拉
输入上拉模式:上拉电阻导通,施密特触发器打开,输出被禁止。使用内部上拉电阻,引脚外部无输入时读取的引脚输入电平为高电平。
⚫ 3、输入下拉
输入下拉模式:下拉电阻导通,施密特触发器打开,输出被禁止。使用内部下拉电阻,引脚外部无输入时读取的引脚输入电平为低电平。
⚫ 4、模拟功能
模拟功能:上下拉电阻断开,施密特触发器关闭,双 MOS 管也关闭。该模式用于 ADC 输入引脚或者 DAC 输出引脚,或者低功耗下省电。
⚫ 5、开漏输出
开漏输出模式:STM32 的开漏输出模式是数字电路输出的一种,从结果上看它只能输出低电平 Vss(VSS:S=series 表示公共连接的意思,也就是负极。没有找到权威的解释,后面找到再加上) 或者高阻态(高阻态(High Impedance State)是指在数字电路中,输出端不对外提供电压信号,表现为既不输出高电平(1)也不输出低电平(0),而是等效于断开状态,类似于电路中没有连接的情况。高阻态的关键特征包括电气隔离和阻抗高)。
根据《STM32F4xx 参考手册_V4(中文版).pdf》第 183 页关于“GPIO输出配置”的描述,我们可以推知开漏模式下输出电路大致是这样工作的:
⚫ P-MOS 被“输出控制”控制在截止状态,因此 IO 的状态取决于 N-MOS 的导通状况。
⚫ 只有N-MOS还受控制于输出寄存器,“输出控制器”对输入信号进行了逻辑非的操作。
⚫ IO 到输入电路的采样电路仍被打开,且可以选择是否使用上下拉电阻。
根据参考手册的描述,我们替换了“输出控制”部分,作出了如图 13.1.2.7 的开漏模式下的简化等效图,图 13.1.2.7 中①的输入对应的②的输出是我们最关心的开漏输出的结果。简化后的图 13.1.2.7 能更好地表示开漏输出模式的输出关系。
开漏输出的具体的理解描述如下:
开漏模式下,P-MOS 管是一直截止的,所以 P-MOS 管的栅极一直接 VSS。
如果输出数据寄存器设置为 0 时,经过“输出控制”的逻辑非操作后,输出逻辑 1 到 N-MOS 管的栅极,这时 N-MOS 管就会导通,使得 I/O 引脚接到 VSS,即输出低电平。
如果输出数据寄存器设置为 1 时,经过“输出控制器”的逻辑非操作后,输出逻辑 0 到 N-MOS 管的栅极,这时 N-MOS 管就会截止。因为 P-MOS 管是一直截止的,使得 I/O 引脚呈现高阻态,即不输出低电平,也不输出高电平。因此要 I/O 引脚输出高电平就必须接上拉电阻。这时可以接内部上拉电阻,或者接一个外部上拉电阻。由于内部上拉电阻的阻值较大,所以只是“弱上拉”。需要大电流驱动,请接外部的上拉电阻。此外,上拉电阻具有线与特性,即如果有很多开漏模式的引脚连在一起的时候,只有当所有引脚都输出高阻态,电平才为 1,只要有其中一个为低电平时,就等于接地,使得整条线路都为低电平 0。我们的 IIC 通信(IIC_SDA)就用到这个原理。另外在开漏输出模式下,施密特触发器是打开的,所以 IO 口引脚的电平状态会被采集到输入数据寄存器中,如果对输入数据寄存器进行读访问可以得到 IO 口的状态。也就是说开漏输出模式下,我们可以对 IO 口进行读数据。
该模式由于只能输出低电平和高阻态的特点,一般多用于I2C驱动中(后面I2C部分再详细说明)。
⚫ 6、推挽输出
推挽输出模式:STM32 的推挽输出模式,从结果上看它会输出低电平 VSS 或者高电平 VDD。推挽输出跟开漏输出不同的是,推挽输出模式 P-MOS 管和 N-MOS 管都用上。同样地,我们根据参考手册推挽模式下的输出描述,列出等效原理如图 13.1.2.8 所示,根据手册描述可以把“输出控制”简单地等效为一个非门。
推挽输出的具体的理解描述如下:
如果输出数据寄存器设置为 0 时,经过“输出控制”的逻辑非操作后,输出逻辑 1 到 P-MOS管的栅极,这时 P-MOS 管就会截止,同时也会输出逻辑 1 到 N-MOS 管的栅极,这时 N-MOS管就会导通,使得 I/O 引脚接到 VSS,即输出低电平。
如果输出数据寄存器设置为 1 时,经过“输出控制”的逻辑非操作后,输出逻辑 0 到 NMOS 管的栅极,这时 N-MOS 管就会截止,同时也会输出逻辑 0 到 P-MOS 管的栅极,这时 PMOS 管就会导通,使得 I/O 引脚接到 VDD,即输出高电平。
上面的描述可以知道,推挽输出模式下,P-MOS 管和 N-MOS 管同一时间只能有一个 MOS管是导通的。当引脚高低电平切换时,两个管子轮流导通,一个负责灌电流,一个负责拉电流,使其负载能力和开关速度都有很大的提高。
另外在推挽输出模式下,施密特触发器也是打开的,我们可以读取 IO 口的电平状态。由于推挽输出模式输出高电平时,是直接连接 VDD ,所以驱动能力较强,可以做电流型驱动,驱动电流最大可达 25mA。该模式也是最常用的输出模式。
该模式可以驱动LED灯的亮灭,蜂鸣器的响不响,或者给引脚高低电平驱动外部设备使能或禁止。
⚫ 7、开漏式复用功能
开漏式复用功能:一个 IO 口可以是通用的 IO 口功能,还可以是其他外设的特殊功能引脚,这就是 IO 口的复用功能。一个 IO 口可以是多个外设的功能引脚,我们需要选择作为其中一个外设的功能引脚。当选择复用功能时,引脚的状态是由对应的外设控制,而不是输出数据寄存器。除了复用功能外,其他的结构分析请参考开漏输出模式。
另外在开漏式复用功能模式下,施密特触发器也是打开的,我们可以读取 IO 口的电平状态,同时外设可以读取 IO 口的信息。
⚫ 8、推挽式复用功能
推挽式复用功能:复用功能介绍请查看开漏式复用功能,结构分析请参考推挽输出模式。