嵌入式:深刻理解GPIO的上拉输入、下拉输入、浮空输入、模拟输入
2026/8/8 7:39:19 网站建设 项目流程

前言

文章以STM32F103ZET6芯片为例来介绍

建议观看了上一篇文章之后,再来看这篇,直接看这篇也是可以的。

一、输入部分电路

单独抽出输入部分

MCU内部理解输入电路

✨关于输入,GPIOx 常用的输入模式一共有四种:

  • 上拉输入
  • 下拉输入
  • 浮空输入
  • 模拟输入

简化电路,这里把片上外设去掉

进一步简化电路

二、上拉与下拉电阻

  • 上拉电阻 :为特定电路提供缺省高电压
  • 相对的,还有一个下拉电阻,理论和上拉电阻类似,总结一句话:为特定电路提供缺省低电压
  • 唯一需要强调的是,输入这里的上拉电阻和下拉电阻,属于 MCU 内部,GPIO 模块内部自带的,和输出开漏那里的外部上拉电阻,在位置上不同,但是功能是类似的。

三、TTL 施密特触发器

常识:我们现实生活中的信息,整体其实就分为两类

  • 一类是可以量化的,状态有限的信息。如:电梯门有没有关好,汽车安全带有没有系好,共享单车有没有锁好,手机有没有调到静音,门铃有没有被摁下等等,我们把类似这种信息叫做数字信息。
  • 另一类是连续可变的,随时间变化可以取无穷个值的信息。如:洗澡水的冷热,手机剩余电量,奶茶店背景音乐的音量,早高峰地铁的拥挤程度,骑自行车的快慢,吹风机出风口的风力大小等等,我们把这类信息叫做模拟信息。
  • 随着人类进入了信息时代,各种计算机,单片机层出不穷,但归根结底,这些设备都是为人服务的。为了给你更好的服务,计算机 / 单片机,就必须获取人 / 世界的信息,获取你的位置信息,为你提供打车服务,获取你的搜索信息,给你提供搜索服务,获取你的体温、心跳信息,给你提供健康检查,空调获取房间温度,为你自动调节温度等等,换句话说:计算机 / 单片机,必须要能处理数字信息和模拟信息。
  • 为了让你的计算机 / 单片机能处理数字信息、模拟信息,硬件工程师,科学家们发明了各种硬件电路,同时也产生了大量的知识,为了培养更多的工程师,科学家,于是所有的高校便开了两门课程《数字电路》和《模拟电路》,很明显,这两门课,是教我们在计算机世界,处理人类和世界的两种信息的:数字信息和模拟信息!

所以施密特触发器就是进行信息处理一个硬件单元。TTL 施密特触发器全称是: Transistor‑Transistor Logic Schmitt Trigger(晶体管‑晶体管逻辑施密特触发器)。它的核心作用是:

  • 抗噪整形:把抖动、毛刺、斜坡等不可靠的输入波形整形成规则的方波

所谓的方波,在硬件上是方波,在软件上就是 0 / 1,本质是数字信息

当 MCU 某一个引脚要进行输入的时候,因为外部因素的干扰,输入信息,不一定是规整的输入信息

输入的信息可能是:

如果没有 TTL 施密特触发器,那么输入信息就可能在 01 之间反复横跳:

如果存在 TTL 施密特触发器,当这类信息输入到引脚,传递到 TTL 施密特触发器,输入波形就会被整形成规则的方波,这个工作是 TTL 施密特触发器的核心作用。

TTL 施密特触发器的硬件电路内部,具有整形模块,规定出正向阈值电压 VT+,和负向阈值电压 VT‑,从而限定一个迟滞区域,要求,01 跳变,不能在一个临界值上下跳转,而是 "必须穿越区域",才能发生跳转。下面见详细解释:

  • 正负阈值电压:设定迟滞区域,确保输入必须越过 VT+ 才触发高电平,低于 VT‑ 才返回低电平,防止噪声误触发
  • 迟滞区域:迟滞区域的作用是通过设定不同的切换阈值,防止输入微小波动导致输出频繁跳变,从而增强系统的稳定性。

迟滞区域的本质理解

  • 输入抖动在迟滞区内时,输出保持上次状态不变,避免误跳变

如果在正向阈值电压或者负向阈值电压附近来回跳转呢?以正向阈值电压为例

在此位置跳转,只有两种情况:

  • 高于正向阈值电压 VT+:就应该是高电平
  • 在迟滞区域以内:输入抖动在迟滞区内时,输出保持上次状态不变,避免误跳变,你在正向阈值电压 VT + 附近进行跳转,那么最近一次状态就一定是高电平喽,继续维持高电平不变
  • 负向阈值电压附近来回跳转同理

⭐结论:如果在正向阈值电压或者负向阈值附近来回跳转,维持最近状态不变。

这样就有效剔除了输入信息突变,输入信息中包含毛刺的问题,当然,这里所有的工作,全部都是在 TTL 施密特触发器内部自动完成的,使用者可以不关心。

四、上拉输入 (Pull‑up Input)

1. 上拉输入是什么?

上拉输入就是 MCU 内部配置了上拉电阻,所谓配置上拉电阻,本质就是:

  • 闭合上拉电阻开关,断开下拉电阻开关

  • 开关在 MCU 内部,可以通过 MCU 提供的配置寄存器选择闭合还是断开某一个开关

后续讨论,就去掉下拉部分了。

2. 上拉输入的过程

2.1输入高电平

  • 当引脚输入高电平,GPIO 就收到高电平,输入数据寄存器内部就读入 1

2.2 输入低电平

  • 当引脚输入低电平,GPIO 就收到低电平,输入数据寄存器内部就读入 0

上拉输入的时候,输入低电平,上拉电阻不会把电平拉高吗?

  • 不会,本质就是谁更 "强" 的问题

  • 详见下文两个根本问题

2.3 输入引脚悬空

当引脚没有接入任何设备,即和外部断开,在上拉电阻的拉动下,输入数据寄存器默认读到的就是 1,所以,上拉模式本质是提供了输入数据的缺省值

为什么上拉输入中,需要上拉电阻?

因为有了上拉输入,就可以让芯片在无外接输入时,输入数据寄存器默认读到 1,输入数据默认就是高电平(1)。

五、下拉输入 (Pull-down Input)

1. 下拉输入是什么?

下拉输入就是 MCU 内部配置了下拉电阻,所谓配置下拉电阻,本质就是:

  • 闭合下拉电阻开关,断开上拉电阻开关

  • 开关在 MCU 内部,可以通过 MCU 提供的配置寄存器选择闭合还是断开某一个开关

后续讨论,就去掉上拉部分了。


2. 下拉输入的过程

2.1 输入高电平

  • 当引脚输入高电平,GPIO 就收到高电平,输入数据寄存器内部就读入 1

❓下拉输入的时候,输入高电平,下拉电阻不会把电平拉低吗?

  • 不会,其实本质就是谁更 "强" 的问题
  • 详见下文两个根本问题

2.2 输入低电平

  • 当引脚输入低电平, GPIO 就收到低电平,输入数据寄存器内部就读入 0

2.3 输入引脚悬空

  • 当引脚没有接入任何设备,即和外部断开,在下拉电阻的拉动下,输入数据寄存器默认读到的就是 0,所以,下拉模式本质是提供了输入数据的缺省值

因为有了输入缺省值,所以下拉输入模式下,无论输入引脚是什么情况,输入数据寄存器内部的数据是确定的

✨ 为什么下拉输入中,需要下拉电阻?

  • 提供输入确定性,让缺省输入是低电平(0)

六、两个根本问题

无论是上拉,还是下拉,我们有两个问题其实并没有清楚回答:

  • 上拉输入的时候,输入低电平,上拉电阻不会把电平拉高吗?
  • 下拉输入的时候,输入高电平,下拉电阻不会把电平拉低吗?

这两个问题,其实原理上是同一种问题。

要理解这点,需要知道两点:

  1. 无论是上拉电阻,还是下拉电阻,阻值在单片机内部,都属于高阻值器件,阻值一般都高达 30kΩ~50kΩ
  2. 欧姆定律 V = I * R,在计算电压角度,计算的是对应设备在整个电路中承担的电压差,即经过该设备,电压会下降多少

解决问题一:上拉输入的时候,输入低电平,上拉电阻不会把电平拉高吗?

  • 输入低电平是一种说法,在单片机内部,可以理解为就是通过接地实现引脚输入低电平的,那么其实内部上拉电阻和外部接地,就形成了一个通路
  • 引脚就是导线,电阻忽略不计,那么这个通路中唯一的一个需要承压的器件就是上拉电阻!
  • 那么上拉电阻两端的压差就是 VDD,等效电路如下:

上拉电阻自身承压就是位置 1‑位置 2 就是电流经过该设备对应的压降!!!

位置 1 电压 VDD

位置 2 电压 0V (低电压)

✨ 所以上拉输入的时候,输入低电平,上拉电阻不会把电平拉高吗?

  • 不会,形成通路之后,位置 2 电压就是 0V,低电平,不受上拉电阻的影响

解决问题二:下拉输入的时候,输入高电平,下拉电阻不会把电平拉低吗?

  • 输入高电平只是一种说法,在单片机内部,你可以理解成为就是通过接电源 VDD 实现引脚输入高电平的,那么其实内部下拉电阻和外部电源 VDD,就形成了一个通路
  • 引脚就是导线,电阻忽略不计,那么这个通路中唯一的一个需要承压的器件就是下拉电阻!
  • 那么下拉电阻两端的压差就是 VDD

⭐ 下拉输入的时候,输入高电平,下拉电阻不会把电平拉低吗?

  • 不会,形成通路之后,位置 1 电压就是 VDD,高电平,不受下拉电阻的影响

输入上拉、输入下拉总结表

引脚高电平引脚低电平引脚悬空 (默认输入值)
输入上拉101
输入下拉100

七、弱上拉弱下拉

MCU 内部的上下拉电阻之所以被称为 “弱”,是因为其阻值较大(通常在几十 kΩ),导致其提供的电流非常小,从而对外部信号的控制力比较 “弱”。

八、浮空输入 (Floating Input)

1. 浮空输入是什么?

浮空输入就是 MCU 内部配置上下拉电阻都断开,本质就是:

  • 断开下拉电阻开关,断开上拉电阻开关
  • 开关在 MCU 内部,可以通过 MCU 提供的配置寄存器选择闭合还是断开某一个开关

后面我们讨论的时候,就省略掉上下拉电阻了

2. 浮空输入的过程

浮空输入就是 MCU 内部没有配置上拉 和下拉电阻,可以等效如下:

⭐ 浮空输入,一共会有三种情况:

  • 当引脚输入高电平,GPIO 就收到高电平,输入数据寄存器内部就读入 1
  • 当引脚输入低电平,GPIO 就收到低电平,输入数据寄存器内部就读入 0
  • 当引脚悬空,干扰信号经过触发器后就会变成随机的高低电平,因此浮空输入模式下电平高、低是不确定的。

电源线、人体、手机、电机、开关电源、甚至手靠近导线都会产生交变电场。

附近的 WiFi、蓝牙、对讲机、电机、继电器等会辐射高频电磁波

浮空输入,引脚断开,引脚就和一个接受天线一样,接受外部的电磁干扰。

九、模拟输入 (Analog Input)

1. 模拟输入是什么?

要谈清楚模拟输入是什么,就必须再回到之前聊的 GPIO 输入的整体结构图

先不管模拟输入中的 “模拟” 二字是什么,先从电路角度,我们可以看到,物理上,模拟输入硬件电路等效于一根导线

当然,我们不能只看到模拟输入的物理电路结构是一根导线,更要看到,模拟输入,没有用 TTL 施密特触发器,即不要给我做信号整形,我就要原汁原味。

⭐ 模拟输入理解第一层:

  • 引脚外部是什么,模拟输入就获取什么

2. 模拟信号与模拟信号处理模块

  • 模拟信号是什么,我们在之前的内容已经渗透过,后续章节我们会陆续展开深入研究
  • 不管怎么样在 MCU 内部,一定会有专门处理模拟信号的片上外设,虽然我们不知道是什么,但是并不妨碍我们进一步完善对 MCU 内部模块构成的进一步认识

常见的未来处理模拟信号的片上外设设有:ADC,DAC 等

💡信号小知识:

模拟信号:在时间与幅度上均连续变化的物理量,物理世界本质是连续的。

数字信号:在时间与幅度上均离散化的信号,将连续的物理量量化为离散的数据量。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询