GPIO
文章目录
1. 什么是 GPIO ?
GPIO(General Purpose Input/Output)是通用输入输出引脚的缩写,是嵌入式系统中非常重要的基本硬件资源之一。
芯片上大部分引脚都是 GPIO引脚,作为这类引脚,它的功能和特点是可以被编程控制它的工作模式,也可以编程控制它的电压高低等 1。
GPIO 可以用于控制 LED 灯、蜂鸣器,也可以用作按键输入、ADC 采样,从而实现单片机与外部硬件之间的连接与数据交互2。
2. GPIO 内部电路结构
每个 GPIO 内部的电路结构,如图2所示。上方是输入电路,输入的是外部电路的电平信号;下方是输出电路,输出的是微控制器内部的控制信号。2
- 保护二极管:IO 引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。当引脚电压高于 VDD 时,上方的二极管导通;当引脚电压低于 VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。但是尽管如此,还是不能直接外接大功率器件,须加大功率及隔离电路驱动,防止烧坏芯片或者外接器件无法正常工作。
VDD 通常指的是正电源电压或者是芯片的工作电压,对于 ESP32 来说,VDD = 3.3V
VSS 通常指的是地(GND),也就是电路中的零点压参考点。
- P-MOS 管和 N-MOS 管:由 P-MOS 管和 N-MOS 管组成的单元电路使得 GPIO 具有“推挽输出”和“开漏输出”的模式。
- TTL肖特基触发器:信号经过触发器后,模拟信号转化为0和1的数字信号。但是,当 GPIO 引脚作为 ADC 采集电压的输入通道时,用其“模拟输入”功能,此时信号不再经过触发器进行 TTL 电平转换。ADC 外设要采集到的原始的模拟信号。3
3. GPIO 的工作模式
GPIO 一共有8种模式:上拉输入、下拉输入、浮空输入、模拟输入、推挽输出、开漏输出、复用推挽输出、复用开漏输出。
3.1. 输入3
- GPIO 的输入模式有4种:上拉输入、下拉输入、浮空输入、模拟输入。
- 上拉输入和下拉输入顾名思义,分别是连接了上拉电阻和下拉电阻的输入模式。上拉输入在引脚没有数据输入的情况下默认为高电平,下拉输入在引脚没有信号的情况下默认为低电平。
- 既没有连接上拉电阻、也没有下拉电阻,就是浮空输入。浮空输入在引脚悬空的情况下电平是不确定的,可能是高电平也可能是低电平。
- 模拟输入中外部信号并没有经过模拟信号向数字信号的转换过程,传递的是模拟信号。
3.1.1. 浮空输入
对于浮空输入而言,IO 端口的电平信号直接进入输入数据寄存器,其电平状态完全由外部输入决定。
如果在引脚悬空(无信号输入)的情况下,该端口的电平是不确定的。
3.1.2. 上拉输入
对于上拉输入而言,IO 端口的电平信号直接进入输入数据寄存器。
如果在引脚悬空(无信号输入)的情况下,该端口的电平为高电平。
通过在 GPIO 引脚和电源(VDD)之间连接一个电阻,可以确保在没有外部信号驱动时,引脚被“拉”到高电平。这个电阻称为上拉电阻。
3.1.3. 下拉输入
对于下拉输入而言,IO 端口的电平信号直接进入输入数据寄存器。
如果在引脚悬空(无信号输入)的情况下,该端口的电平为低电平。
通过在 GPIO 引脚和地(GND 或 VSS)之间连接一个电阻,可以确保在没有外部信号驱动时,引脚被“拉”到低电平。这个电阻称为下拉电阻。
3.1.4. 模拟输入
模拟输入模式下,IO 端口的模拟信号(电压信号,而非电平信号)不经过 TTL 施密特触发器2,直接输入到片上外设模块,比如 ADC 模块等。
3.2. 输出4
- GPIO 的输出模式有4种:通用推挽输出、通用开漏输出、复用推挽输出、复用开漏输出。观察一下我们可以发现,只要掌握推挽和开漏、通用和复用之间的区别,就可以掌握所有的输出模式。
3.2.1. 推挽和开漏之间的区别
回顾一下 图2:GPIO 内部电路结构图,重点关注输出驱动器部分,有一对 MOS 管,我们把这部分放大,可以得到图8。
上面的 MOS管 为 P-MOS,下面的 MOS 管为 N-MOS,P-MOS 的漏极接高电压 Vdd,N-MOS 的源极接低电压 Vss,两个 MOS 管之间有一条导线连接到 IO 引脚。
-
推挽输出模式下,一对 MOS 管交替导通:上面的导通,下面的就关断;下面的导通,上面的就关断
-
向 IO 写 0,P-MOS 关断,N-MOS 导通,引脚通过下方的 N-MOS 与 Vss 相连,输出低电压
-
向 IO 写 1,P-MOS 导通,N-MOS 关断,引脚通过上方的 P-MOS 与 Vdd 相连,输出高电压
-
开漏输出模式下,P-MOS 一直处于关断状态
-
向 IO 写 0,P-MOS 恒断,N-MOS 导通,引脚通过下方的 N-MOS 与 Vss 相连,输出低电压
-
向 IO 写 1,P-MOS 恒断,N-MOS 关断,引脚处于悬空状态,无论引脚侧电压有多大,电流恒为 0,根据欧姆定律,此时电阻无穷大。这种状态被称为高阻抗
总结:
- 推挽模式下,一对 MOS 管交替导通,对外输出低电压或高电平
- 开漏模式下,P-MOS保持关断,对外输出低电平或高阻抗
3.2.2. 通用和复用之间的区别
- 通用:直接控制 IO 引脚输出电压的方式
- 复用:把 IO 引脚控制权交由其他模式托管,比如串口模块、定时器模块等。
4.1 中也有对于复用的相关描述
3.2.3. 输出模式的选择3
- 推挽输出可以输出低电平和高电平两种状态,可以用于驱动 LED、蜂鸣器等外设。
- 开漏输出只能输出低电平,高电平输出依赖外部的上拉电阻实现,输出电平完全由上拉电阻所连接的电源电平决定。
- 这一特性使其可以很方便地调节输出电平,适用于需要电平转换的场景,
- 也使其可以实现“线与”功能。
所谓的“线与”指的是多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线为高电平;只要有任意一个或者多个信号为低电平,则总线为低电平。
4. IO 复用和复用功能重映射5
4.1. 什么是 IO 复用?
观察电脑的键盘,我们会发现上面的按键几乎都具有不止一个功能,比如用于输入数字 1 的按键也可以用于输入 !,用于输入数字 2 的按键也可以用于输入 @ ,单片机的引脚与键盘上的按键类似,几乎每个都具有不止一个功能。
默认情况下,我们可以直接通过程序控制 IO 引脚输出高电平或者低电平,**这种直接控制引脚的方式就是通用功能,而相对的其他功能,就是复用功能。_回看一下_图1:ESP32 开发板引脚示意图,其中彩色的标识,就是对应引脚所具有的复用功能。
总结一下,IO 复用就是指同一个 IO 引脚具备多个不同的功能。
4.2. 什么是复用功能重映射?
一般单个引脚可以同时兼具多种复用功能,以 STM32F103C8T6 为例,它的 PA9 引脚既可以作为 定时器1 的 通道2 来使用,也可以作为 串口1 的 TX 引脚来使用。如果我们想要同时使用 串口1 和 定时器1 该怎么办呢? 为了解决这个问题,芯片上给大多数模块都留有一组或多组备用引脚。对于 USART1 来说,备用引脚为 PB6 和 PB7,我们只要将 USART1 重映射到这两个引脚,冲突问题就解决了。
所谓的复用功能重映射,就是将冲突的复用功能移动到其他备用引脚上去。