目录
序章
GPIO配置相关的知识向来有不少人讲解,但很多讲解更偏理论、或者碎片化。
本文从工程实践出发,尝试解决下面这些问题:
- 推挽输出、开漏输出到底怎么选才能不烧芯片?
- 输入状态时,是上拉还是下拉?
- 为什么连接未知设备总推荐使用开漏+上拉?
- 推挽到底能不能和开漏对接?
- 睡眠状态下 GPIO 怎么配置最省电?
本文风格简明、工程导向,适合想快速掌握 GPIO 配置要点的同学。
一、GPIO介绍
1.1 什么是GPIO
-
英文全名:General-Purpose Input/Output(通用输入/输出)。
-
引申含义:
-
General-Purpose(通用):这些引脚没有固定用途,可以自由配置成输入或输出,适应多种场景。
-
Input/Output(输入/输出):既能“接收”外部信号(输入),也能“发送”控制信号(输出)。
-
-
简单理解:GPIO是芯片或开发板上的一组“万能引脚”,通过编程决定它是“听”(输入)还是“说”(输出)。
1.2 GPIO的作用
GPIO的核心作用分为两大类:
(1)输入(Input)
-
功能:读取外部设备的数字信号(高电平或低电平)。
-
典型用途:
-
检测按键/开关是否按下(如键盘、复位按钮)。
-
接收传感器的简单信号(如红外避障传感器、光敏电阻)。
-
(2)输出(Output)
-
功能:向外部设备输出高电平或低电平,控制其状态。
-
典型用途:
-
点亮LED或控制蜂鸣器。
-
驱动继电器、电机等简单设备。
-
注意:GPIO只能处理数字信号(0/1),不能直接处理模拟信号(如温度值、音频信号)。
二、推挽与开漏:基本区别与原理
2.1 推挽结构介绍
推挽结构本质上是个单刀双掷开关。
- 当开关上掷闭合,PMOS导通,NMOS截止,对外输出高电平。
- 当开关下掷闭合,PMOS截止,NMOS导通,对外输出低电平。
理论上,推挽输出不能和其他主动驱动高电平的输出线与(包括另一个推挽输出或者带有上拉的开漏输出),否则当另一方输出高而推挽侧输出低时,会产生从VDD到GND的短路,进而烧毁推挽侧器件,如下图。
Q:为什么推挽输出不需要接上拉电阻呢?
A:因为此结构输出高电平的时候,由于没有形成内部回路,不用关注内部导通电流(不需要限流),所以不需要接上拉电阻。
2.2 开漏结构介绍
开漏结构本质上是个单刀单掷开关
- 开关闭合时,NMOS导通,对外输出低电平。
- 开关断开时,NMOS截止,依靠上拉电阻将其拉至高电平。
作者言:
Q:为什么开漏需要接上拉?
A:开关未闭合时,对外输出高;若开漏输出引脚外部直连VDD且未连接上拉电阻,开关闭合NMOS导通时,可能形成VDD到GND的短路,产生大电流而烧毁器件。
Q:那如果将电阻接在PMOS和地之间呢?
A:开关未闭合时,对外输出高;开关闭合时,由于电阻本身存在阻值,对外输出电压取决于电阻大小:如果电阻过大,则对外输出的电平接近VDD;如果电阻过小,有短路风险!
2.3 推挽与开漏对比
2.3.1 驱动速度
开漏输出时,电平的上升时间主要由外部上拉电阻、总线负载、总线电容三者决定决定,当总线负载、总线电容一定时,对比推挽输出,上拉电阻就成了最大的影响因素。上拉电阻越大,电平上升越慢。
推挽输出时,由于没有上拉电阻,且PMOS导通电阻比较小,所以上升速度大大提高,如果在推挽上加一个上拉电阻,两者速度就会接近一致。
2.3.2 驱动能力
开漏输出仅能主动拉低,高电平驱动完全依赖外部上拉电阻(电流能力受电阻阻值影响)。
推挽输出内部无上拉电阻,且可主动提供灌电流和拉电流,驱动能力更强。
2.3.3 功耗
推挽结构静态功耗极低,切换时驱动负载电容产生动态功耗。开漏结构依赖上拉电阻维持高电平,存在持续漏电流,静态功耗较高,动态功耗相对较低。
作者言:
开漏最大的有点就是两个:
1)更灵活,可以搭配不同的上拉电压,电阻
2)更安全,可以支持线与
其他方面都是逊色于推挽的。
三、嵌入式总线推挽使用情况
总线类型 | 常用GPIO配置 | 说明 |
---|---|---|
SPI | 推挽 | 通信线收发隔离,允许使用推挽输出。 |
UART | 推挽 | 通信线收发隔离,允许使用推挽输出。 |
IIC | 开漏 | 需要多节点共享通信线,必须采用开漏输出并配合上拉电阻。 |
CAN | 推挽 | 物理层由专用 PHY 芯片隔离,MCU 内部可以使用推挽输出。 |
LIN | 推挽 | 物理层由专用 PHY 芯片隔离,MCU 内部可以使用推挽输出。 |
四、低功耗场景下 GPIO 配置建议
4.1 未使用引脚配置建议
将未使用引脚配置为模拟输入,避免浮空导致漏电和干扰。
作者言:
把GPIO配置成模拟模式(但是没有复用ADC采样或者其他模拟外设时),芯片内部就不在监听电平,不驱动输出,也没有上下拉电流,等于该IO口彻底断电。
4.2 电平保持配置建议
4.2.1 保持高电平
1)若驱动能力无要求时
即总线上没有多余负载,对电流没有要求),可将GPIO配置为上拉输入,保持高电平但不驱动,适合低功耗场景。
2)若对驱动能力有一定要求
视情况可配置成推挽输出高(功耗最低,但仅限确认总线上无其他驱动输出源时使用,否则有冲突风险);或者配置成开漏上拉输出高,功耗相比推挽输出较高,但是安全。
4.2.2 保持低电平
1)若驱动能力无较高要求
即总线上无较大负载,可将GPIO配置下拉输入模式,保持低电平但不驱动,适合低功耗场景。
2)若对驱动能力有一定要求
视情况可配置成推挽输出低(但仅限确认总线上无其他驱动输出源时使用,否则有冲突风险)
4.3 外部输入检测配置建议
根据外部默认电平选择合适的上拉或下拉电阻,避免误判。
1)检测外部输入低到高电平的跳变,则选用下拉输入
2)检测外部输入高到低电平的跳变,则选用上拉输入
五、GPIO 连接未知设备原则
5.1 输出端安全使用开漏
不知道对方是否也输出时,使用开漏输出避免推挽对拉损坏芯片。
5.2 输入端必须加上下拉/上拉电阻
输入端要加合适的拉电阻,防止悬空抖动和误触发。
1)默认状态为高电平
使能内部上拉。
2)默认状态为低电平
使能内部下拉。
5.3 总结与实用提醒
连接未知设备时,输出用开漏,输入用拉电阻,各家自扫门前雪,不要指望对方照顾你。
想了解更多嵌入式技术知识,请点击阅读我的其他文章:
如果你觉得内容对您有帮助,别忘了点赞、收藏和分享支持下哦!