type
status
date
slug
summary
tags
category
created days
new update day
icon
password
Created_time
Dec 15, 2025 09:24 AM
Last edited time
Dec 15, 2025 12:36 PM

上拉电阻和下拉电阻有什么用?

在 GPIO 配置、外设驱动(如按键、传感器)或通信总线(如 I2C)设计中会频繁接触上拉电阻下拉电阻。它们的核心作用是通过 “强制电平” 解决引脚悬空导致的电平不确定问题,同时增强电路驱动能力。以下从定义、作用、典型场景及接线图展开详细说明:

一、核心定义:上拉电阻 vs 下拉电阻

两者的本质是 “限流电阻”,区别仅在于所接电平的高低最终稳定电平,具体对比如下:
特性
上拉电阻(Pull-Up Resistor)
下拉电阻(Pull-Down Resistor)
连接方式
一端接 高电平(VCC,如 3.3V/5V),另一端接芯片引脚
一端接 低电平(GND,地),另一端接芯片引脚
引脚默认电平
无外部信号时,引脚被拉为 高电平
无外部信号时,引脚被拉为 低电平
核心作用
防止引脚悬空→高电平稳定
防止引脚悬空→低电平稳定
阻值范围(典型)
1kΩ ~ 10kΩ(平衡功耗与电平响应速度)
1kΩ ~ 10kΩ(同左)

二、共同核心作用

无论上拉还是下拉,本质都是解决嵌入式系统中 “引脚电平不确定” 的核心问题,具体衍生 3 个关键作用:
  1. 避免悬空干扰:芯片 GPIO 引脚若悬空(未接任何电路),会因电磁干扰、环境噪声被随机拉为高 / 低电平,导致 CPU 误判信号(如误触发中断)。上拉 / 下拉通过强制电平,让引脚 “无信号时必有确定状态”。
  1. 增强驱动能力:部分芯片引脚(如开漏输出引脚,如 I2C 的 SDA/SCL)本身无法输出高电平,需通过上拉电阻 “借力 VCC” 实现高电平驱动;下拉电阻同理可增强低电平驱动(避免外部高电平信号 “拉不动” 引脚)。
  1. 确定初始状态:系统上电时,外设(如传感器、按键)可能未就绪,此时引脚需有 “初始电平”(如按键未按下时,GPIO 为高 / 低),确保 CPU 初始化时不会读取到乱码。

三、开漏输出和推挽输出

下面是 GPIO 配置为输出时的内部示意图,左边是没有接负载的情况,右边是接入负载的情况,我们要关注的其实就是这两个 MOS 管的开关状态
notion image
notion image
我们可以将 Q1、Q2 这两个 MOS 管作为一个两位的二进制,那么其可以组合出以下四种状态:
Q1
Q2
输出状态
关闭
关闭
浮空/高阻态
关闭
打开
低电平
打开
关闭
高电平
打开
打开
两个 MOS 管都关闭时,输出处于一个浮空状态,此时他对其他点的电阻是无穷大的,所以这个状态也被称为高阻态;当两个 MOS 管都打开时,电源直接对地短路,MOS 管就烧毁了,所以这种状态不存在。对于一个 GPIO 来说,配置为输出时,就只能有这三种状态。

推挽输出

把 GPIO 输出的高电平和低电平拿出来,组成一个组合。
当我们外接一个 MOS 管时,输出高电平,电流流出去给外面的 MOS 管的栅极充电,所以这个过程称为推。把电流推出去。
notion image
当 IO 口输出低电平时,电路流进来给外面的 MOS 管的栅极放电,这个过程就是,把电流挽回来。
所以所谓的推挽就是描述了 MOS 管输出高低电平时,电流的一个动作而已。
notion image

开漏输出

把 GPIO 输出的低电平和浮空/高阻态拿出来,组成一个组合。
notion image
这种组合下,上面的 MOS 管永远是关闭的,所以这个时候可以把上面当作不存在的。
下面的 MOS 管的漏极就等于什么都没接,属于一个开路状态,所以这个模式被称为开漏模式。
 
notion image

开漏模式的作用:

  1. 改变高电平的电压;
举个例子,现在想用这个 GPIO 去控制一个芯片的 enable 引脚,但是这个 GPIO 输出的高电平是 5V。而芯片只支持 3.3V 输入,如果使用推挽模式输出高电平的话,是 5V,可能会把后面的芯片烧毁。
notion image
 
所以需要使用开漏模式,同时需要在外面接一个上拉电阻,这样当 MOS 关闭,也就是 GPIO 处于高阻态时,enable 就会被上拉电阻拉到 3.3V,也就是高电平;当 MOS 管打开时,enable 就被 MOS 管拉到了低电平。以上实现了 5V 单片机对 3.3V 芯片的控制。
notion image
 
  1. 支持多个 GPIO 来控制一个输入;
这是使用两个 GPIO 来控制右边芯片的 enable。如果使用的是推挽模式,如果上面的 GPIO 输出的是高电平,下面输出的是低电平,那么左边的通路就会短路,两个 MOS 管会烧毁一个。所以需要把这两个 GPIO 都配置为开漏模式,然后再外接一个上拉电阻。这样只要有任意一个 GPIO 输出低电平时,enable 就是低电平。如果都处于高阻态,enable 就是高电平。
notion image
上面的现象就是“线与”,只要有任意一个或多个 GPIO 输出了低电平,输出的就都是低电平;只有所有 GPIO 都输出高电平,总线才处于高电平。

四、总结

一个 GPIO 根据内部 MOS 管的开关情况,存在三种输出状态,分别是高电平、低电平和高阻态。
notion image
  • 推挽输出,是通过开关管直接接到正极和负极的,所以是强上拉和强下拉的模式。
  • 开漏输出是去掉强上拉的开关管,输出低电平时,下管导通,是强下拉。输出高电平时,下管断开,但是没有上管了,此时引脚处于浮空状态,也就是高阻态。 开漏输出一般都会配置一颗外部的上拉电阻。通过一个电阻拉到高电平的,属于弱上拉。弱上拉的好处:
      1. 完全杜绝了电源短路现象,保证电路的安全;
      1. 避免了引脚模式的频繁切换;开漏加弱上拉的模式,同时兼具了输入和输出的功能;想要输出,就操作 MOS 管的打开和关闭;想要输入的话,就让 MOS 管处于关闭状态,通过弱上拉电阻的 “电平反馈” 读外部信号
先明确:什么是 “引脚模式频繁切换”?
在嵌入式系统中,GPIO 引脚默认有明确的 “工作模式”,最核心的是输出模式(CPU 主动写电平到引脚)和输入模式(CPU 从引脚读外部电平)。比如用推挽输出的 GPIO 做 “双向通信”(既需要发信号给外设,又需要读外设的响应),就必须频繁切换模式:
  1. 要 “输出” 时:配置 GPIO 为推挽输出模式,控制 PMOS/NMOS 输出高 / 低电平;
  1. 要 “输入” 时:必须先暂停输出,修改 GPIO 配置为输入模式(否则推挽输出的强电平会覆盖外部信号,甚至短路);
  1. 下次再输出时,又要改回推挽输出模式 —— 这就是 “引脚模式频繁切换”,不仅增加代码复杂度(要操作模式配置寄存器),还会引入时序延迟(配置寄存器需要时间),甚至可能因切换不及时导致通信错误。
开漏 + 弱上拉如何 “不切换模式,兼具输入输出”?
关键在于开漏输出的 “下管断开 = 高阻态” 这一特性:开漏输出的核心是 “只有下 MOS 管(拉低用),没有上 MOS 管(拉高用)”,高电平靠外部弱上拉电阻实现。此时,GPIO 的 “工作模式” 只需配置为开漏输出模式,无需切换 —— 通过 “控制下管通断” 就能分别实现 “输出” 和 “输入”,本质是 “高阻态同时承载了输出高电平和输入检测的功能”。
1. 当需要 “输出” 时:直接控制下管,无需改模式
开漏输出的 “输出功能” 靠下 MOS 管的通断实现,逻辑和你之前理解的一致:
  • 想输出低电平:CPU 控制下 MOS 管导通,引脚通过 MOS 管直接接地→电平拉低(强下拉,和推挽输出的低电平一致);
  • 想输出高电平:CPU 控制下 MOS 管断开,引脚失去强下拉,靠外部弱上拉电阻从 VCC “拉” 到高电平(弱上拉高电平);整个过程中,GPIO 始终是 “开漏输出模式”,无需修改任何模式配置 —— 只需操作 “下管通断” 的寄存器,就完成了输出控制。
2. 当需要 “输入” 时:让下管断开(高阻态),直接读电平,无需改模式
这是最关键的部分 —— 开漏输出的 “高阻态”(下管断开),天然就是输入模式的 “理想状态”(输入模式要求引脚高阻,避免 CPU 内部电路干扰外部信号)。此时 “输入” 的逻辑不是 “主动读电流”,而是通过弱上拉电阻的 “电平反馈” 读外部信号,具体场景比如:假设你用开漏 + 弱上拉的 GPIO 连接一个 “外部传感器”(传感器需要向 CPU 发信号):
  • 传感器未发信号时:传感器的输出引脚是高阻态,GPIO 靠弱上拉电阻维持高电平→CPU 读引脚电平为高;
  • 传感器要发 “低电平信号” 时:传感器主动将其输出引脚拉到 GND→GPIO 的电平被传感器拉低(电流从 VCC 经弱上拉电阻流向传感器的 GND)→CPU 读引脚电平为低;整个 “输入” 过程中,GPIO 始终是 “开漏输出模式”—— 只需保持下管断开(高阻),直接读引脚电平即可,完全不用把模式改成 “输入模式”
 
Archlinux开启ssh服务以使用终端登录瑞芯微 SDK Docker 构建镜像
Loading...