深入浅出 STM32(七):从推挽到开漏,彻底搞懂高阻抗与上拉电阻
目录


前言
大家好啊,我是云泽Q,欢迎阅读我的文章,一名热爱计算机技术的在校大学生,喜欢在课余时间做一些计算机技术的总结性文章,希望我的文章能为你解答困惑~
一、通用推挽输出的名称来源与核心思想
1.1 为什么叫“推挽”?
通用推挽输出(Push-Pull Output,简称 PP)这个名称,其实非常形象地来源于该电路的工作原理。我们可以把它想象成两个人在配合工作:
- “推”:就像一个人用力把重物往外推。在电路中,这对应着提供电流。当电路需要输出高电平时,它主动把电压“推”向外部引脚。
- “挽”:就像另一个人用力拉绳子往回拽。在电路中,这对应着吸收或拉取电流。当电路需要输出低电平时,它把外部引脚的电平强行“拉”回到地。

这种工作机制是通过一对互补的晶体管来实现的,通常采用 CMOS 工艺制造的 P-MOS 管和 N-MOS 管。这两个管子就像是两个开关,交替闭合与断开,让外部引脚要么接入电源 VDD(呈现高电压),要么接入地 GND(呈现低电压)。因为电路通路形成了输出电流(推)和吸收电流(挽)的效果,所以得名“推挽”。
1.2 核心控制逻辑
推挽输出的核心思想非常简单,用一句话概括就是:交替闭合或者开启 P-MOS 和 N-MOS 即可。
具体的控制逻辑如下:
- 硬件基础:使用 P-MOS 和 N-MOS 这一对互补开关。
- 动作本质:通过控制逻辑,让这两个 MOS 管轮流工作,绝不能同时导通。
- 最终效果:让外部引脚在 VDD 和 GND 之间切换,从而对外呈现出稳定的高电压和低电压。
二、MCU 内部 GPIO 输出驱动器详解
要真正理解推挽输出,我们需要深入 MCU 内部,看看 GPIO 输出驱动器是如何工作的。这里涉及到 ARM CPU、输出数据寄存器、输出控制电路以及 P-MOS/N-MOS 管的配合。
2.1 输出高电平的过程(“推”的动作)

当我们需要引脚输出高电平时,整个过程是这样的:
- CPU 写入数据:ARM CPU 向
输出数据寄存器中写入数值1。 - 信号传递:这个
1经过复用器(如果是 GPIO 模式)传递给输出控制模块。 - MOS 管状态切换:
- P-MOS 管:输出控制电路会给 P-MOS 的栅极(G)施加电压。根据 P-MOS 的特性(低电平导通,或者更准确地说是源栅压差满足条件),此时 P-MOS 管处于导通状态。
- N-MOS 管:输出控制电路不施加驱动电压给 N-MOS,使其保持断开状态。
- 电流路径:电流从电源 VDD 出发,经过导通的 P-MOS 管(从源极 S 流向漏极 D),直接连接到外部引脚。
- 结果:外部引脚被接通到 VCC/VDD,对外表现为高电平。此时,如果有负载连接,MCU 就在向外“推”出电流。

P-MOS 导通时,电流方向是从上往下流向引脚的。
2.2 输出低电平的过程(“挽”的动作)
当我们需要引脚输出低电平时,操作正好相反:
- CPU 写入数据:ARM CPU 向
输出数据寄存器中写入数值0。 - 信号传递:这个
0传递给输出控制模块。 - MOS 管状态切换:
- P-MOS 管:输出控制电路不施加电压,P-MOS 管处于断开状态(截止)。
- N-MOS 管:输出控制电路给 N-MOS 的栅极(G)施加电压。根据 N-MOS 的特性(高电平导通),此时 N-MOS 管处于导通状态。
- 电流路径:外部引脚通过导通的 N-MOS 管(从漏极 D 流向源极 S),直接连接到地 GND。
- 结果:外部引脚被拉低到 GND,对外表现为低电平。此时,如果外部有电流流入引脚,MCU 就在“挽”入(吸收)电流。

三、关键避坑指南:严禁同时导通
在设计和使用推挽输出电路时,有一个绝对的红线:P-MOS 管和 N-MOS 管绝对不能同时导通。
3.1 为什么会短路?
如果我们看电路图会发现,P-MOS 的上端接的是 VDD(电源正极),N-MOS 的下端接的是 GND(电源负极/地),而它们的中间(漏极 D)是连在一起通向外部引脚的。
- 如果 P-MOS 导通,VDD 就传导到了中间节点。
- 如果 N-MOS 也导通,中间节点就直接连通了 GND。
- 后果:一旦两个管子同时导通,VDD 就会直接通过这两个管子连到 GND。这就构成了电源短路。

3.2 短路的危害
这种短路会产生极大的电流,瞬间的高热量极有可能直接烧毁芯片内部的 MOS 管,甚至损坏整个 MCU。因此,输出控制电路的设计必须保证逻辑互斥,即同一时刻只能有一个管子导通,另一个必须彻底关断。
四、MOS 管的导通条件与电压细节
虽然我们在逻辑上说是写 0 或 1 来控制,但在物理层面上,MOS 管的导通是需要满足特定电压条件的。这也是很多初学者容易困惑的地方:既然 MCU 工作电压是 3.3V,为什么还能控制好 MOS 管?
4.1 阈值电压 (Vth)
MOS 管不是只要有电压就导通的,它有一个门槛,叫做阈值电压 V t h V_{th} Vth。
- N-MOS 导通条件:栅极电压 V g V_g Vg 减去源极电压 V s V_s Vs 的差值,必须大于阈值电压。即 V g − V s > V t h V_g - V_s > V_{th} Vg−Vs>Vth。通常 V t h V_{th} Vth 在 0.3V 到 1V 之间。
- P-MOS 导通条件:源极电压 V s V_s Vs 减去栅极电压 V g V_g Vg 的差值,必须大于阈值电压。即 V s − V g > V t h V_s - V_g > V_{th} Vs−Vg>Vth。

4.2 实际工作中的电压匹配
以 STM32 为例,它的 IO 口工作电压通常是 3.3V。
- 当我们要导通 N-MOS 时,输出控制电路会给栅极一个高电平(接近 3.3V),而源极接地(0V),压差远大于 1V,所以能可靠导通。
- 当我们要导通 P-MOS 时,源极接 3.3V,输出控制电路给栅极一个低电平(接近 0V),压差也远大于 1V,也能可靠导通。
虽然输出控制电路内部的实际驱动电压可能比 3.3V 略小一点,但只要能满足 V g s > V t h V_{gs} > V_{th} Vgs>Vth 这个条件,MOS 管就能正常工作。我们不需要追求完美的线性区,只需要它在开关状态下逻辑自洽即可。
五、通用模式与复用模式的统一性
我们还要理清“通用”和“复用”的关系。
5.1 什么是复用推挽输出?
除了 CPU 直接控制 GPIO 输出高低电平外,MCU 内部还有很多其他外设(比如 UART 串口、SPI、定时器等)也需要控制引脚输出波形。
- 通用模式:由 ARM CPU 读写
输出数据寄存器来控制 P/N-MOS。 - 复用模式:由片上外设(如 UART 发送器)直接接管控制权。外设模块会直接向
输出控制电路发送 0 或 1 的信号,绕过 CPU 的数据寄存器。
5.2 原理完全一致
无论是谁在控制(是 CPU 还是外设),到了最底层的驱动级,原理是一模一样的。都是利用那一对 P-MOS 和 N-MOS 管进行交替开关。所谓的“复用推挽输出”,仅仅是信号的来源变了,底层的“推挽”动作没有任何区别。理解了通用推挽输出,也就完全理解了复用推挽输出。
六、通用开漏输出(Open Drain)详解
6.1 核心思想:只使用 N-MOS
接下来我们学习第二种输出方式,叫做通用开路输出,英文叫 Open Drain Output,有时候简称为 OD。它的核心思想其实非常简单,用一句话就能概括:去掉 P-MOS,让 P-MOS 永远都关闭,只使用 N-MOS。
虽然在我们的物理器件内部,P-MOS 和 N-MOS 是同时存在的,但在逻辑上,当你把输出引脚配置为“通用开漏输出”时,硬件电路会默认让你对应的 P-MOS 管直接失效。也就是说,它会让 P-MOS 管永远处于关闭状态,只保留 N-MOS 管来工作。
这就相当于在原理图上,把 P-MOS 那部分直接去掉了(物理上还在,但逻辑上不生效),整个输出电路就只剩下下半部分的 N-MOS 结构了。
6.2 寄存器控制逻辑与电平表现
在只有 N-MOS 工作的情况下,我们往寄存器里写 0 和写 1,逻辑会有什么变化呢?
6.2.1 写 0:导通 N-MOS,输出低电平
当你往寄存器写 0 时,这会激活 N-MOS 管。这和我们之前学的通用推挽输出是一样的:写 0 意味着 N-MOS 管导通。此时,引脚通过导通的 N-MOS 管直接连接到 GND(地),因此对外输出低电平。
6.2.2 写 1:断开 N-MOS,呈现高阻抗
当你往寄存器写 1 时,情况就不同了。在推挽模式下,写 1 会导通 P-MOS;但在开漏模式下,P-MOS 已经被禁用了。所以,写 1 的效果仅仅是让 N-MOS 管直接断开。
这时候,引脚与 MCU 内部的连接就彻底断开了。这种状态我们称之为高阻抗(High-Z)。
⚠️ 重要结论:
在纯粹的开漏模式下(不接外部电路),MCU 只能输出低电平和高阻抗,无法主动输出高电平。
6.3 深度解析:什么是“高阻抗”?
很多初学者对“高阻抗”这个概念感到困惑,觉得它是不是代表某种高电压?其实不是。
所谓高阻抗,只是一种说法。真实的情况是:MCU 和外部引脚彻底断开了,相当于开路了。或者说,是 N-MOS 的 D 极(漏极)和外部引脚互相悬空了。
我们可以用一个简单的电路模型来理解:
- 开路状态:就像电路中的开关 S 断开了。
- 等效电阻:断开的开关,在电学上可以等效为一个阻值无穷大的电阻。

因为阻值无穷大,电流无法流过,MCU 就不再驱动引脚,引脚的电平完全由外部电路决定。这就是为什么叫“高阻抗”——因为它对地或对电源都呈现出极大的电阻特性。
6.4 为什么叫“开漏”(Open Drain)?
这个名字其实非常形象。在推挽输出中,P-MOS 和 N-MOS 的漏极(Drain)是连在一起的,彼此互为负载。
而在开漏模式中,我们把上面的 P-MOS “拿掉”了。这时候,N-MOS 的漏极(Drain)就没有连接任何有源器件了,它只是连接到了一根导线(引脚)上。因为漏极是“开放”的,没有接负载设备,所以被称为漏极开路,简称开漏。
6.5 如何输出高电平?——上拉电阻的作用
既然开漏模式自己发不出高电平,那我们在实际应用中怎么让它输出高电平呢?答案必须在外部找:我们需要在引脚外部接一个上拉电阻到 VDD(比如 3.3V)。
6.5.1 工作原理推导
让我们结合欧姆定律来详细推导一下这个过程。为了方便解释,我们定义几个参数:
- 上拉电阻阻值为 R P U L L R_{PULL} RPULL
- 引脚本身是一根导线,阻值 R 1 R_1 R1 无限趋近于 0 Ω 0\Omega 0Ω
- 开漏位置(即断开的 N-MOS)等效电阻为 R 2 R_2 R2,阻值无穷大

当我们要输出高电平(寄存器写 1,N-MOS 断开)时:
- 电路通路:从 VDD (3.3V) 经过上拉电阻 R P U L L R_{PULL} RPULL,经过引脚 R 1 R_1 R1,最后到达开漏处 R 2 R_2 R2 (GND方向)。
- 电流计算:根据欧姆定律 I = V / R t o t a l I = V / R_{total} I=V/Rtotal。因为 R 2 R_2 R2 是无穷大,所以总电阻无穷大,导致整个回路的电流 I ≈ 0 I \approx 0 I≈0。
- 电压计算:
- 上拉电阻上的压降 V d r o p = I × R P U L L V_{drop} = I \times R_{PULL} Vdrop=I×RPULL。因为 I = 0 I=0 I=0,所以压降为 0V。
- 引脚处的电压 = 电源电压 - 上拉电阻压降 = 3.3 V − 0 V = 3.3 V 3.3V - 0V = 3.3V 3.3V−0V=3.3V。
结论:正是因为电流几乎为零,上拉电阻上没有分压,所以引脚处的电压就被“拉”到了和电源 VDD 一样的电平,从而实现了高电平的输出。
6.5.2 一个常见的认知误区(欧姆定律的本质)
这里有一个很容易让人纠结的问题:
“既然开路了,电流 I = 0 I=0 I=0,根据 V = I R V=IR V=IR,那整个电路电压不也应该是 0 吗?为什么引脚处反而是 3.3V?”
这个问题的根源在于对欧姆定律的理解偏差。
就好比水龙头里不流水难道就没有水压吗?
我们需要区分两个概念:“承压” 和 “单点电压”。
- 欧姆定律算的是“承压”: V = I R V=IR V=IR 计算的是电流流过某个元件时,该元件两端产生的电压差(即电压下降了多少)。
- 单点电压是电位:引脚处的 3.3V 是指该点相对于地的电位。
举个通俗的例子:
假设有一个 10V 的电池,串联了三个电阻 R1(2Ω), R2(3Ω), R3(5Ω)。
- 总电流 I = 10 V / ( 2 + 3 + 5 ) Ω = 1 A I = 10V / (2+3+5)\Omega = 1A I=10V/(2+3+5)Ω=1A。
- R1 承担的电压(压降)是 1 A × 2 Ω = 2 V 1A \times 2\Omega = 2V 1A×2Ω=2V。
- 但这不代表 R1 左边的电压是 2V。实际上,R1 右边接正极是 10V,流过 R1 后下降了 2V,所以 R1 左边的电压是 10 V − 2 V = 8 V 10V - 2V = 8V 10V−2V=8V。
回到开漏电路:
当 N-MOS 断开( R 2 R_2 R2 无穷大)时,虽然回路电流 I = 0 I=0 I=0,导致上拉电阻 R P U L L R_{PULL} RPULL 上的压降为 0(即它不消耗电压),但这恰恰意味着电源的 3.3V 没有被“消耗”掉,而是完整地传递到了引脚处。所以引脚处的单点电压就是 3.3V。
6.6 上拉电阻的必要性:防止短路
你可能会问,既然 N-MOS 断开时靠外部电阻拉高,那如果我不接这个电阻,或者 N-MOS 导通时会发生什么?
上拉电阻还有一个至关重要的作用:限流保护。
- 当输出低电平时(N-MOS 导通):引脚通过 N-MOS 直接连通 GND。如果此时外部没有电阻,而是直接接了 VCC,那么 VCC 就会直接对地短路,瞬间的大电流会烧毁芯片。
- 有了上拉电阻:当 N-MOS 导通接地时,电流从 VCC 流经上拉电阻再到 GND。电阻限制了电流的大小( I = 3.3 V / R P U L L I = 3.3V / R_{PULL} I=3.3V/RPULL),避免了电源直接对地短路,保护了 MCU。
所以,开漏输出必须配合上拉电阻使用,既是为了实现高电平输出,也是为了电路安全。通常这个电阻由 PCB 设计者在硬件层面添加,一般不由意法半导体官方提供。
6.7 复用模式下的开漏与推挽
最后,我们把视野拉回到“复用”这个概念上。
前面我们讲的都是“通用”模式,也就是由 ARM CPU 直接控制 GPIO 寄存器来操作 MOS 管。但实际上,GPIO 的输出电路还可以受其他外设控制,这就是复用模式。
- 复用推挽输出:本质上和通用推挽一样,只是控制权交给了外设(比如串口 UART)。串口想发 0 或 1,就直接通过复用线路控制 P-MOS 和 N-MOS 的交替导通。
- 复用开漏输出:同理,当配置为复用开漏时,外设接管了控制权,但硬件逻辑依然是“禁用 P-MOS,只用 N-MOS”。
总结一下:
所谓的“复用”,仅仅是改变了谁来控制这个开关(是 CPU 还是外设),而开关本身的物理结构(是推挽还是开漏)是完全不变的。只要把通用的推挽和开漏彻底搞懂了,复用的情况也就是换个控制源而已,原理完全一致,随着后面文章具体外设(如 I2C、串口)时,大家自然会有更深的体会。
结语

更多推荐

所有评论(0)