ZZZ-07-推挽输出与开漏输出

在 STM32CubeIDE 配置 GPIO 时,你会看到 Output Push-Pull(推挽)和 Output Open-Drain(开漏)两个选项。理解它们的区别,决定了你能不能正确驱动外部设备。

1. 推挽输出 (Push-Pull) —— “全能型驱动”

这是最常用的模式,之前的 [[ZZZ-06-STM32点灯]] 用的就是它。

内部结构:

想象引脚内部有两个“开关”(如上图“输出控制”后端的两个 MOS 管):

  • 一个是连接到 VCC (3.3V) 的开关(P-MOS 管)。
  • 一个是连接到 GND (0V) 的开关(N-MOS 管)。

工作原理:

  • 输出高电平时:上面的开关接通,下面的断开。引脚被强力“推”向 3.3V。此时引脚有很强的电流输出能力。
  • 输出低电平时:上面的开关断开,下面的接通。引脚被强力“拉”向 GND。此时引脚有很强的吸入电流能力。

特点:

  1. 双向都有力:无论是输出高还是低,电平都很稳定。
  2. 速度快:电平切换非常迅速,适合高速信号。
  3. 最常见:驱动 LED、驱动蜂鸣器、SPI 通信等,绝大多数情况都选它。

2. 开漏输出 (Open-Drain) —— “有底气,没脾气”

这个模式比较特殊,如果你选了它却没接“上拉电阻”,你会发现引脚输出高电平时没电压。

内部结构:

引脚内部只有连接到 GND 的开关(N-MOS 管),没有连接到 VCC 的开关。

工作原理:

  • 输出低电平时:开关接通,引脚被拉到 GND。这没问题。
  • 输出高电平时:开关断开。由于上面没有连接 VCC 的开关,此时引脚处于浮空状态(高阻态)。就像一根断掉的电线,它自己无法产生电压。

必须搭配:上拉电阻

为了让开漏模式能输出高电平,你必须在引脚外部接一个电阻连到电源(VCC)。这样,当内部开关断开时,外部电阻会把引脚“拉”上去。

特点与神奇用途:

  1. 线与逻辑(Wired-AND):多个开漏引脚连在一起,只要有一个输出低,整条线就是低。这是 I2C 总线 必须使用开漏的原因。
  2. 电平转换:STM32 是 3.3V 器件,但如果你想驱动一个 5V 的逻辑电路。你可以把开漏引脚通过电阻连到 5V 电源上。开关断开时,引脚就会被拉到 5V(前提是该引脚标有 FT,即容忍 5V)。
  3. 防止短路:多个推挽输出连在一起如果电平不一会烧芯片,开漏则不会。

直观对比表

特性 推挽输出 (Push-Pull) 开漏输出 (Open-Drain)
输出高电平 直接输出 VCC (3.3V) 高阻态 (需外接上拉电阻才有电压)
输出低电平 直接输出 GND (0V) 直接输出 GND (0V)
驱动能力 强 (双向) 弱 (高电平靠电阻,低电平靠芯片)
主要用途 LED、普通 IO 控制、SPI、PWM I2C 通信、电平转换、多机通信
比喻 既能推水,又能抽水的水泵 只能抽水(排水)的水龙头
  • 推挽输出就像是一个双向推拉门,你既可以用力把它推开(高电平),也可以用力把它拉关(低电平)。
  • 开漏输出就像是一个单向弹簧门。你自己只能用力把它拉关(输出低),但你想开门(输出高)时,你自己没法推,只能靠门背后的弹簧(上拉电阻)把它拽回去。

什么时候该选什么?

在 STM32CubeIDE 配置时:

  • 如果你只是点灯、控制继电器、驱动电机驱动模块:闭眼选 Push-Pull。
  • 如果你在学习 I2C 协议(比如驱动 OLED 屏幕或传感器):必须选 Open-Drain。
  • 如果你发现选了输出,灯却不亮或者电压很诡异:检查一下是不是误选成了 Open-Drain 且没接上拉电阻。
Licensed under CC BY-NC-SA 4.0