目录
[1 推挽输出 (PP)介绍](#1 推挽输出 (PP)介绍)
[1.1 原理](#1.1 原理)
[1.2 推挽输出的核心特点](#1.2 推挽输出的核心特点)
[1.3 与开漏输出 (OD) 的关键区别](#1.3 与开漏输出 (OD) 的关键区别)
[1.4 何时使用推挽输出?](#1.4 何时使用推挽输出?)
[1.5 在STM32CubeMX中配置](#1.5 在STM32CubeMX中配置)
[2 开漏输出 (OD)](#2 开漏输出 (OD))
[2.1 实现原理](#2.1 实现原理)
[2.2 与推挽输出的关键区别总结](#2.2 与推挽输出的关键区别总结)
[2.3 核心应用场景](#2.3 核心应用场景)
[2.4 配置与使用要点](#2.4 配置与使用要点)
[3 STM32 IO框图](#3 STM32 IO框图)
概述
本文主要介绍STM32 IO接口推挽输出 (PP)和开漏输出 (OD)的原理和应用方法。推挽输出是STM32最常用、驱动能力最强的输出模式。它的核心在于内部有两个MOS管 ,可以主动、强有力地 将引脚驱动到高电平(VDD)或低电平(VSS),如同一个"推-拉"组合。开漏输出(Open-Drain, OD)是一种只能主动拉低,无法主动推高 的输出模式。它的输出端如同一个接地的"漏极"开关,只能打开(输出低)或关闭(高阻态) ,高电平需要依赖外部上拉电阻提供。
1 推挽输出 (PP)介绍
1.1 原理
推挽输出是STM32最常用、驱动能力最强的输出模式。它的核心在于内部有两个MOS管 ,可以主动、强有力地将引脚驱动到高电平(VDD)或低电平(VSS),如同一个"推-拉"组合。
当需要一个引脚独立、强力、明确地输出高或低电平时,推挽输出是不二之选。它是STM32数字输出的主力军。而当你需要构建"线与"总线、进行电平转换或模拟双向口时,才需要考虑使用开漏输出。



1.2 推挽输出的核心特点
强大的驱动能力 :由于能主动提供电流(source current)和吸收电流(sink current),推挽输出的高、低电平都非常"硬",带负载能力很强,可以直接驱动LED、继电器等。
快速的高低电平切换 :两个MOS管交替导通,可以提供很低的输出阻抗,因此边沿陡峭,适合高速数字信号(如SPI、FSMC)。
明确的电平 :输出电平始终是清晰的VDD或VSS,不会浮空。
1.3 与开漏输出 (OD) 的关键区别
| 特性 | 推挽输出 (PP) | 开漏输出 (OD) |
|---|---|---|
| 输出高电平的实现 | 主动上拉 至 VDD | 断开(高阻态),依赖外部上拉电阻 |
| 驱动能力 | 强,可提供电流 | 弱,高电平由上拉电阻提供电流 |
| 电平转换 | 不能直接进行 | 天然支持(通过连接不同电压的上拉) |
| 总线应用 | 不适用于多设备"线与" | 适用于 I2C等多设备总线 |
| 速度 | 快,边沿陡 | 相对慢,上升沿由上拉电阻和电容决定 |
1.4 何时使用推挽输出?
推挽输出是STM32的默认输出模式 ,适用于绝大多数需要确定性强电平输出的场景:
驱动LED、蜂鸣器、继电器等需要电流的器件。
高速数字通信 ,如 SPI、USART(TX引脚)、FSMC、SDIO。
产生PWM波控制电机、舵机。
驱动数字芯片的片选、使能引脚。
任何不需要"线与"功能的通用数字输出。
使用注意事项
不能直接"线与":如果两个推挽输出引脚直接连在一起,一个输出高一个输出低,会形成短路,损坏芯片。
电平固定 :输出高电平就是MCU的VDD(如3.3V),无法直接输出高于VDD的电压。
功耗:在高低电平切换的瞬间,两个MOS管有极短的同时导通时间,会产生瞬时峰值电流,在极高频率下需考虑功耗和EMI。
1.5 在STM32CubeMX中配置
在GPIO配置页面,将 "GPIO output type" 设置为 "Output Push Pull" 即可。通常无需使能上下拉电阻。
cpp
// 设置为高电平(推挽模式下,这是强驱动输出)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
// 设置为低电平(强驱动拉低)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
// 也可以直接使用Toggle函数翻转
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
2 开漏输出 (OD)
开漏输出(Open-Drain, OD)是一种只能主动拉低,无法主动推高 的输出模式。它的输出端如同一个接地的"漏极"开关,只能打开(输出低)或关闭(高阻态) ,高电平需要依赖外部上拉电阻提供。
2.1 实现原理
下图直观展示了开漏输出的三种典型状态,并与推挽输出进行对比,其核心区别在于内部P-MOS管的缺失:



2.2 与推挽输出的关键区别总结
| 特性 | 开漏输出 (OD) | 推挽输出 (PP) |
|---|---|---|
| 内部结构 | 只有N-MOS管(接GND) | 有P-MOS (接VDD)和N-MOS(接GND) |
| 输出高电平 | 断开/高阻态 ,必须靠外部上拉电阻拉高 | 芯片内部主动强上拉至VDD |
| 驱动能力 | 弱(高电平由上拉电阻提供电流) | 强(高、低电平均由芯片主动驱动) |
| 关键特性 | 支持 "线与" ,可进行电平转换 | 不支持"线与",电平固定为VDD/VSS |
| 典型应用 | I2C/SMBus等总线、电平转换、模拟双向口 | 驱动LED、高速通信(SPI, USART) |
2.3 核心应用场景
开漏输出的几大独特优势决定了其不可替代的适用场景:
1) 实现"线与"功能(最重要)
原理 :多个开漏引脚直接相连,并通过一个公共上拉电阻接VCC。任何 一个引脚输出低电平,总线即为低;只有所有引脚都输出高阻态,总线才被上拉为高。
应用 :这是 I2C、SMBus、1-Wire 等多主机总线的基础。它实现了无冲突的仲裁机制 (谁先拉低谁赢)和简单的与逻辑。
2)进行电平转换
原理:上拉电阻可以接到一个与MCU VDD不同的电压(如5V)。当引脚输出高阻态时,总线电平被上拉到5V;输出低时,则拉低到0V。这样,一个3.3V的MCU就可以安全地与5V器件通信。
应用:连接不同工作电压的逻辑芯片或传感器,是最简单的电平转换方案之一。
3) 模拟准双向口
- 如前一个问题所述,通过软件在开漏输出(加上拉)和输入模式间切换,可以模拟传统8051的准双向口,实现分时的输入输出。
4) 驱动高于VDD的负载
- 将上拉电阻接到更高的电压(如12V),可以驱动继电器、更高电压的LED等。此时需确保引脚耐压值足够。
2.4 配置与使用要点
硬件配置(以STM32CubeMX为例):
将引脚模式设为
GPIO_Output。关键 :将 "GPIO output type" 设置为
Open Drain。如果芯片内部有上拉电阻且符合要求,可将 "GPIO Pull-up/Pull-down" 设为
Pull-up。对于I2C等总线,更推荐使用精度更高的外部上拉电阻(如4.7kΩ)。
代码操作示例:
cpp
// 初始化已在CubeMX完成,模式为开漏上拉
// 1. 输出低电平(主动拉低)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
// 2. 输出"高电平"(实际是释放为高阻态,靠上拉电阻拉高)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 此时引脚为高阻态
// 3. 在需要时读取引脚状态(在输出高阻态时)
// 注意:严格来说,在开漏模式下,HAL_GPIO_ReadPin读取的是引脚即时电平。
// 若要可靠读取外部输入,更规范的做法是先将引脚模式切换为输入上拉。
GPIO_PinState state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
注意事项:
必须接上拉电阻 :这是开漏模式正常工作的绝对前提,否则无法产生高电平。
速度限制:上升沿速度取决于上拉电阻值和总线电容(RC时间常数),电阻越小速度越快,但功耗越大。高速应用(如400kHz I2C)需要计算并选择合适的上拉电阻。
功耗考虑:在持续输出低电平时,电流会通过上拉电阻到地,产生持续功耗。
3 STM32 IO框图
1) 标准IO接口

2) 支持5V IO接口

3) 配置IO工作模式


4) 输入端口

5) 输出配置
