【嵌入式原理系列-第一篇】GPIO开漏/推挽/上拉/下拉怎么选?

目录

序章

一、GPIO介绍

1.1 什么是GPIO

1.2 GPIO的作用

二、推挽与开漏:基本区别与原理

2.1 推挽结构介绍

2.2 开漏结构介绍

2.3 推挽与开漏对比

2.3.1 驱动速度

2.3.2 驱动能力

2.3.3 功耗

三、嵌入式总线推挽使用情况

四、低功耗场景下 GPIO 配置建议

4.1 未使用引脚配置建议

4.2 电平保持配置建议

4.2.1 保持高电平

4.2.2 保持低电平

4.3 外部输入检测配置建议

五、GPIO 连接未知设备原则

5.1 输出端安全使用开漏

5.2 输入端必须加上下拉/上拉电阻

5.3 总结与实用提醒


序章

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 总结与实用提醒

连接未知设备时,输出用开漏,输入用拉电阻,各家自扫门前雪,不要指望对方照顾你。


想了解更多嵌入式技术知识,请点击阅读我的其他文章:

烟花的文章链接集合-CSDN博客

如果你觉得内容对您有帮助,别忘了点赞、收藏和分享支持下哦!

<think>好的,用户想了解GPIO_MODE_DEF_OD的定义及作用,尤其是在嵌入式系统或微控制器中。我需要根据提供的引用资料来整理答案。 首先,根据引用[3],GPIO_MODE_AF_ODGPIO_MODE_OUTPUT_OD的区别在于,AF模式是复用功能的输出,而OUTPUT_OD是普通GPIO输出。当没有使用外设功能时,比如模拟I2C,应该使用OUTPUT_OD,否则IO口可能不会输出信号。这说明模式有两种应用场景:复用普通输出。 然后引用[4]提到,模拟I2C时,ACK信号检测需要下拉输入,这样能检测到高电平变化。这可能输出有关,因为I2C总线通常使用配置,需要外部上拉电阻。所以GPIO_MODE_DEF_OD可能涉及到这种配置,确保总线可以正确拉高拉低。 接下来,用户的问题是关于GPIO_MODE_DEF_OD的定义作用。我需要确定这个模式是否对应于输出,以及它属于复用还是普通模式。根据引用中的信息,可能存在两种模式:复用(AF_OD)普通(OUTPUT_OD)。而GPIO_MODE_DEF_OD可能是某个库或框架中的宏定义,用于设置模式,但具体是复用还是普通需要看上下文。 另外,引用[1]提到AF_PP是复用推挽输出,而Out_PP是普通推挽输出。同理,模式也有类似区分。因此,DEF_OD可能是默认的配置,可能根据情况择复用或普通,但用户可能需要明确指定。 可能存在的混淆是,用户提供的引用中没有直接提到GPIO_MODE_DEF_OD,但根据命名习惯,可能是某些库中的宏,用来设置模式,可能结合了复用功能。需要解释输出的基本概念,以及在嵌入式中的应用,比如I2C总线,避免信号冲突,需要外部上拉等。 总结:GPIO_MODE_DEF_OD应指输出模式,可能用于需要总线协议(如I2C)的场景,允许线与逻辑,需外部上拉电阻。需要区分复用普通,DEF_OD可能是一个宏,根据具体情况配置为其中一种模式。同时,需注意配置错误可能导致信号无法输出,如引用[3]提到的问题。</think>### GPIO_MODE_DEF_OD 的定义及作用 **定义** `GPIO_MODE_DEF_OD` 是嵌入式系统中用于配置 GPIO 引脚为**输出模式(Open-Drain Output)**的宏定义。输出模式下,引脚只能主动拉低电平(连接到地)或保持高阻态(不输出高电平),需依赖外部上拉电阻将电平拉高。这种模式常用于总线协议(如 I2C、SMBus)或需要多设备共享信号的场景[^3][^4]。 **作用** 1. **支持线与逻辑**:多个输出的设备可共享同一总线,任一设备拉低电平即可使总线为低电平,避免信号冲突[^4]。 2. **电平兼容性**:通过外部上拉电阻可适配不同电压标准(如 3.3V 或 5V)。 3. **节省功耗**:高阻态时无电流通过,适用于低功耗场景。 **与复用功能的区别** - **复用GPIO_MODE_AF_OD)**:用于外设(如 I2C 控制器)控制引脚,需启用对应的外设功能[^1][^3]。 - **普通GPIO_MODE_OUTPUT_OD)**:通过 GPIO 数据寄存器直接控制引脚,适用于软件模拟协议(如模拟 I2C)[^4]。 **配置示例** 若使用 STM32 HAL 库,配置普通输出的代码可能如下: ```c GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; // 普通输出 GPIO_InitStruct.Pull = GPIO_NOPULL; // 依赖外部上拉 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); ``` **注意事项** - 必须添加外部上拉电阻,否则引脚无法输出高电平。 - 避免混淆复用模式与普通模式:若未启用外设功能却配置为复用,引脚可能无信号输出。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值