GPIO(General Purpose Input Output
)可用于执行数字输入或输出功能。典型的应用包括从/向模拟或数字传感器/设备读写数值、驱动LED、为I2C通信驱动时钟、生成外部组件的触发、发出中断等。
文章目录
- [1 GPIO简介](#1 GPIO简介)
- [2 输出模式](#2 输出模式)
-
- [2.1 推挽输出](#2.1 推挽输出)
- [2.2 开漏输出](#2.2 开漏输出)
- [3 输入模式](#3 输入模式)
-
- [3.1 高阻态(浮空)、上拉、下拉](#3.1 高阻态(浮空)、上拉、下拉)
- [3.2 施密特触发输入](#3.2 施密特触发输入)
1 GPIO简介
一个GPIO引脚主要有两个缓冲区,即输入和输出。
输入和输出由使能引脚ENABLE
控制:
每个输入/输出缓冲区都有一个PMOS和NMOS晶体管以及一个非门。这两个晶体管的栅极和漏极连接在一起,如下图所示:
2 输出模式
如果将逻辑高电平输出到引脚,则PMOS打开,NMOS关闭,从而将VCC连接到输出引脚。这个阶段被称为推相位 ,因为它类似于推动电流。如果输出逻辑低电平到引脚,则NMOS打开,PMOS关闭,从而将输出引脚连接到地,由于它看起来像是在拉电流,因此被称为拉相位。
2.1 推挽输出
推挽模式是GPIO输出模式的默认状态。引脚可以使用PMOS晶体管或NMOS晶体管将信号"推"高或者"拉"低。
流入缓冲区地端的电流被称为灌电流(Current Sinking
),相反地,从缓冲区产生的电流被称为拉电流(Current Sourcing
)。拉电流始终通过PNP或PMOS晶体管完成,而灌电流通过NPN或NMOS晶体管完成。
由于PMOS(PNP)晶体管通常具有较高的电流驱动能力,即拉电流时所需的电流较大。因此一个GPIO引脚就可以驱动多个GPIO引脚。
2.2 开漏输出
在这种配置中,没有PMOS晶体管,而NMOS晶体管的漏极保持在浮空状态。因此这种配置被称为开漏。
当输出逻辑低电平时,NMOS将打开并接地。输出高电平时,NMOS不会打开,引脚处于浮动状态。
换句话说,这种模式仅支持灌电流。为了避免这种浮动状态,我们可以在NMOS的漏极接一个上拉电阻。
何时使用推挽和开漏?
- 推挽用于不需要在同一组引脚上同时传输和接收数据的协议,如UART、SPI
- 开漏可用于执行双向通信的引脚,如I2C协议
3 输入模式
如果引脚处于逻辑高电平输入状态,那么PMOS晶体管将打开,NMOS晶体管关闭,从而将Vcc连接到GPIO。 反之GPIO连接到地。
3.1 高阻态(浮空)、上拉、下拉
高阻态就是引脚既没有上拉也没有下拉,而是保持漂浮状态。在没有外部驱动的情况下,该状态是不确定的。
默认情况下,在上电后GPIO引脚处于高阻态输入模式。浮动引脚极易受到噪声干扰,可能会导致两个晶体管导通并提供直接路径从VCC到GND的漏电流。我们绝对不应将引脚保持在浮动状态,因为漏电流将导致高功耗,在最坏的情况下还可能导致芯片复位。 为了避免这种情况,可以配置上拉电阻或下拉电阻。
在GPIO配置为上拉时,下面的开关打开,则PMOS导通;下面的开关闭合,则NMOS导通。
反之,GPIO配置为下拉时,上面的开关闭合,则PMOS导通;上面的开关打开,则NMOS导通。
3.2 施密特触发输入
这种输入类型与我们之前讨论的常规输入缓冲区不同,它连接到一个施密特触发器。在输入信号接近阈值时,由于噪声或其他不稳定性因素,输入信号可能会在上升和下降阈值之间摆动。这可能导致触发器在阈值之间多次切换,产生不确定的输出状态。所以为了确保可靠性,需要添加上拉或下拉电阻来明确信号的状态。
什么是施密特触发器?
施密特触发器是一种电压比较器,只有在输入电压超过上阈值时才会启动,一旦启动,它只有在输入电压低于下阈值时才会关闭。施密特触发器表现出的这种特性被称为滞回(hysteresis
)。
下面为普通输入缓冲区和带有施密特触发器的输入缓冲区在处理嘈杂信号时的输出比较:
可以看出,普通输入缓冲区的输出随噪声而波动。而施密特触发器抑制了很多噪声并提供了稳定的输出。因此,在嘈杂的环境中,使用施密特触发器输入是很有用的。