GPIO基础知识
GPIO(General Purpose Input and Output)是通用输入输出口。通俗的说,就是一些引脚,可以通过它们对外输出电平信号或者通过它们读取外部的电平信息。
作为输出口,一个典型的例子就是控制 LED,电路示意图如下所示。 图中,使用 GPIO_0 控制了一个LED,LED本质上就是一个二极管,当GPIO输出低电平时,二极管导通,LED发光;当GPIO输出高电平时,二极管不能导通,LED熄灭。
作为输入口,一个典型的例子就是获取按键信息,以判断按键是否按下,电路示意图如下所示。
图中,使用 GPIO_1 读取按键信息,当按键按下时,GPIO接地,读取到低电平;反之,按键未按下时,GPIO通过上拉电阻接到 VCC,此时,GPIO读取到的是高电平。
1.1 高电平/低电平
高/低电平并不是某个特定的电压而是有一定范围的,如下表所示。 输入高电平(VIH)是逻辑门输入为高电平时允许的最小电平。当输入电平高于VIH,则认为输入电平为高电平。为了保证电路不被损坏,输入电平不能超过电源输出电压(VIO)。
输入低电平(VIL)是逻辑门输入为低电平时允许的最大电平。当输入电平低于VIL,则认为输入电平为低电平。
阈值电平(Vt)是电路刚刚勉强能做翻转动作时的电平,电压值介于VIL和VIH之间。
VIO、VIH、Vt 、VIL 之间的关系是 VIO > VIH > Vt > VIL
输入电平范围 | 输入电平 |
---|
V > VIO | 损坏电路 | VIH <= V <= VIO | 高电平 | Vt | 与芯片相关(固定值/随机值/上一次的输入值) | V <= VIL | 低电平 |
1.2 内部上/下拉电阻
在绝大多数MCU中,GPIO内部都具有可控的上/下拉电阻,此时,就可以省略第一张图中的上拉电阻R1,当需要上拉电阻时,使能内部上拉电阻即可。
内部上/下拉电阻的电路比较简洁,示意图如下所示。
内部上/下拉电阻常用于输入,确保没有外部驱动力时,处于确定的状态。
1.3 GPIO输入
GPIO输入电路如下所示。
开关可控的上下拉电路作用是使输入端对外呈现高阻态。保证在输入引脚悬空时,输入端检测到的电平是稳定的。
输入电路采用施密特触发输入。施密特触发输入的好处是可以解决基本输入电路在跳变沿抖动的问题。施密特触发器上的 on/off 是输入控制开关,作用是可以发出读引脚状态的操作指令。 输入控制开关不使能时,物理引脚与内部总线之间是完全隔离的,不会影响内部电路。
注意:施密特触发器采用电位触发方式,其状态由输入信号电位维持。对于负向递减和正向递增两种不同变化方向的输入信号,施密特触发器有不同的阈值电压。当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变;只有输入电压发生足够的变化时,输出才会变化。
1.4 GPIO输出
GPIO输出主要有两种,分别是推挽输出和开漏输出。
1.4.1 推挽输出
推挽输出电路示意图如下图所示。 如下图所示,推挽输出结构由两个MOS管控制,两个管子不能同时导通。控制器写入高电平,经过反向后,PMOS导通时,NMOS截止,引脚输出高电平;控制器写入低电平,经过反向后,NMOS导通时,PMOS截止,引脚输出低电平。 注意:MOS管和三极管组成的单元电路都能使GPIO具有"推挽"和"开漏"的输出特性,因为三极管导通功率较大,所以一般采用MOS管。
1.4.2 开漏输出
开漏输出电路如下图所示。
开漏输出分开漏输出和开集输出两种,他们的输出原理和特性基本是类似的,区别在于开漏输出使用MOS管,"漏"指的就是MOS管的漏极; 开集输出使用三极管,"集"指的就是三极管的集电极。由于使用MOS管的情况较多,很多时候就用"开漏输出"这个词代替了开漏输出和开集输出。
开漏输出模式上方的P-MOS管完全不工作。控制器输出低电平,P-MOS管关闭,N-MOS管导通,引脚输出低电平; 控制器输出高电平,P-MOS管和N-MOS管都关闭,引脚既不输出高电平,也不输出低电平,为高阻态。为保证开漏模式正常输出高电平,引脚外部必须接上拉电阻,电路结构如下图所示。
1.4.3 推挽输出与开漏输出特性总结
1, 推挽输出特点
(1). 推挽输出可以输出真正的高低电平,两种电平都具有驱动负载的能力。
(2). 推挽输出不能实现"线与"功能。
如果两个推挽输出结构串联在一起,一个引脚输出高电平(PMOS导通,NMOS截止);另一个引脚输出低电平(PMOS截止,NMOS导通),电流会从第一个引脚的VCC通过上端PMOS再经过第二个引脚的NMOS直接流向GND,整个通路电阻很小,会发生电流倒灌,损坏器件。
2, 开漏输出特点
(1). 开漏输出可以调节输出电平。
因为输出电平完全由上拉电阻连接的电源电平决定。所以在需要电平转换的地方,非常适合使用开漏输出。
(2). 开漏输出可以实现"线与"功能。
多个开漏结构串联在一起,控制器输出的全是高电平时,引脚输出为高电平,只要控制器输出一个低电平,引脚输出为低电平。
3, 推挽与开漏输出的区别
推挽与开漏输出的区别如下表所示。
特性 | 推挽输出 | 开漏输出 |
---|
高电平驱动能力 | 强 | 强 | 低电平驱动能力 | 强 | 弱 | 电平跳变速度 | 快 | 由外部上拉电阻决定,电阻越小,反应越快,功耗越大 | 线与功能 | 不支持 | 支持 | 线与功能 | 不支持 | 支持 |
推挽输出和开漏输出最大的区别是开漏无法真正输出高电平,即高电平时没有驱动能力,需要借助外部上拉电阻完成对外驱动。
1.5 GPIO与引脚
人们通常将GPIO与引脚混为一谈,但实际是不合适的,它们是不同的概念,并不完全等同。
引脚 是指芯片的物理引脚,如电源引脚、时钟(晶振)引脚、串口引脚等等。这些引脚可以与外部进行物理连接;而 GPIO 是通用输入输出口,通常情况下,只有部分引脚可以用作GPIO。
在很多MCU中,除了一些电源引脚等特殊引脚外,可以通过软件控制的引脚通常都可以作为GPIO,芯片厂商在命名时,也直接以GPIO口的名称作为引脚名称(比如STM32、LPC824、LPC54102等),引脚与GPIO呈现一一对应的关系。因而站在 “软件” 视角,通常将引脚与GPIO等同了起来。
随着MCU的快速发展,功能越来越多,集成度越来越高,引脚数目越来越多,新出现了两种情况:
- 引脚不能用作GPIO。例如复位引脚,电源引脚等。
- 引脚与GPIO并不一一对应,一个引脚可以选择(配置)映射到指定引脚。例如 将GPIOA_9、GPIOA_10映射到串口1的发送和接收引脚。
|