GPIO 是什么?
- 1.引言
- 2.基础认知
- 3.I/O端口位的基本结构
- 4.保护电路
-
- 三种工作场景
-
- [场景 1:正常工作(引脚电压在 VSS ~ VDD 之间)](#场景 1:正常工作(引脚电压在 VSS ~ VDD 之间))
- [场景 2:引脚出现**过高电压**(高于 VDD+0.7V,静电 / 浪涌)](#场景 2:引脚出现过高电压(高于 VDD+0.7V,静电 / 浪涌))
- [场景 3:引脚出现**负压**(低于 VSS-0.7V,负静电)](#场景 3:引脚出现负压(低于 VSS-0.7V,负静电))
- 5.输出模式
-
- [5.1 工作模式](#5.1 工作模式)
- [5.2 输出原理](#5.2 输出原理)
- 6.输入模式
-
- [6.1 工作模式](#6.1 工作模式)
- [6.2 工作原理](#6.2 工作原理)
- 7.结语
1.引言
本文目标:
- 知道GPIO及其原理
- GPIO的输入模式
- GPIO的输出模式
2.基础认知
GPIO 全称:General Purpose Input/Output,中文含义就是通用输入/输出 的意思。本质上,就是MCU内部,用来做输入输出的控制器电路。

这种图展示了板子的全貌, 红色方框框起来的部分,就是MCU,GPIO就在其内部。
GPIO输入输出的是什么?
高低电平。在语言层面上,就是0/1。
输入输出高低电平的目的是什么?
控制外设。比如:
- 点亮 LED
- 读取按键
- 控制蜂鸣器、继电器
- 与传感器或外设通信
为什么叫通用?
我们已经知道了GPIO是位于MCU内部的,但是MCU内部可不止GPIO这么一个组件的,还有很多组件,它们也需要输入输出高低电平来控制外设。
那么,它们是通过什么来进行输入输出高低电平呢?难道是独属于自己的输入输出控制电路吗?当然不是,这样做势必会增加复杂度,无疑增加了MCU的成本和功耗。所以,这些组件都是通过GPIO来完成输入输出的,因此,叫通用。

下面我们进一步理解。

上图是从数据手册中截取的STM32F103xC、STM32F103xD和STM32F103xE增强型模块框图。
我们看到,有GPIO port A、GPIO port B......GPIO port G。这些都是GPIO的不同端口,也可以理解为分组,内部结构是一样的。
同时,每一组GPIO还对应了一组引脚PIN,比如GPIO port A对应PA0到PA15。
这里补充介绍一下什么是引脚。
引脚(pin),就是芯片、开发板上伸出来的金属触点 / 金属针,是芯片和外部电路交换电信号的接口。

GPIOA 到 GPIOG 的关系,可以类比成"楼栋和房间号":
- GPIOA、GPIOB、GPIOC 是不同楼栋,每栋楼里有很多个房间
- PA0、PB0、PC0是具体房间号
需要注意的是,并不是每一款芯片都有 GPIOA 到 GPIOG,也不是每一组都一定有 16 个完整引脚。具体有哪些 GPIO 端口、每个端口有哪些可用引脚,要以芯片手册和开发板原理图为准。
我们知道了GPIO port 和 GPIO pin 的关系,那么我们现在将聚焦于:在硬件电路上,是怎么通过引脚来进行输入输出的。
3.I/O端口位的基本结构
I/O 端口位,可以简单理解成一组 GPIO(一个 Port)里面对应的那一个引脚 。比如 GPIOA 这一组,PA3 就是 GPIOA 端口的第 3 个端口位,对应物理引脚 PA3。

这张图的上半部分是输入,下半部分是输出,右边是保护电路。
4.保护电路

这个电路叫做双二极管钳位保护电路。
IO 引脚点同时接了两个保护二极管:
- 上二极管 :阳极接 IO 引脚,阴极接
VDD(电源) - 下二极管 :阴极接 IO 引脚,阳极接
VSS(接地,0V)
二极管特性:正向压差大约 0.7V(硅管),也就是说,当阳极电压比阴极高 0.7V 时才导通。
三种工作场景
场景 1:正常工作(引脚电压在 VSS ~ VDD 之间)
IO 引脚电压在正常范围,两个二极管全都截止,不工作 。
二极管相当于开路,不会影响 GPIO 原本的输入 / 输出功能。
这是绝大多数时候的状态,保护电路 "隐身",不干扰 IO。
场景 2:引脚出现过高电压(高于 VDD+0.7V,静电 / 浪涌)
IO 引脚电压 > VDD+0.7V → 上方二极管正向导通 。
多余的电荷会通过这个二极管泄放到VDD电源轨,把引脚电压钳位在 VDD+0.7V 左右,不让电压继续升高,保护后面内部的 MOS 管。
需要注意的是:
- 这个电路是在MCU内部的。
- 只能抗短时间静电脉冲,不能扛持续高压!如果长期接入 5V(3.3V MCU),这个保护二极管会持续导通发热,直接烧毁MCU。
- 它没有限流能力,如果外部电源直接灌入大电流,依然会损坏MCU。
场景 3:引脚出现负压(低于 VSS-0.7V,负静电)
IO 引脚电压 < VSS-0.7V → 下方二极管正向导通 。
引脚的负电压通过二极管泄放到VSS地轨,把引脚电压钳位在 VSS-0.7V 附近,防止负压击穿内部器件。
总的来说,双二极管钳位保护电路,利用二极管单向导电性,把 IO 引脚电压强制限制在 VSS-0.7V,VDD+0.7V 区间,吸收静电等短暂脉冲高压,保护 GPIO 内部电路。
5.输出模式

这张图,只保留了输出部分的结构。
5.1 工作模式
GPIO的输出模式:
- 通用推挽输出
- 通用开漏输出
- 复用推挽输出
- 复用开漏输出
先暂且不论这些模式都是什么,我们后面会逐个讲解。先搞清楚一个问题------为什么GPIO会有这么多IO模式?
首先,GPIO不只是给ARM-CPU直接做输入输出的,也会被其他片上外设使用,换句话说,GPIO是"大家的"。
可是,其他片上外设,怎么用GPIO?什么时候用GPIO?事先GPIO完全不知道,所以GPIO就必须把自己的IO功能做得更通用一些,结果就是有好多种输入输出模式。
这里解释一下通用和复用的意思。
- 所谓通用,就是通常使用,指的是由ARM-CPU直接控制GPIO输出。
- 所谓复用,意思就是重复使用,指的是MCU内部的片上外设,复用GPIO进行输入输出。
下面,我们讲讲输出原理。
5.2 输出原理

下面我们简化一下。

简化的点:
- 寄存器是多位的,但是为了减少理解成本,只保留一个比特位。
复用器是什么?
多个输入,经过复用器的选择,最终只让其中一个输入传到输出。它本质就是一个电子选择开关。
举个生活中的例子。
假设有 3 路信号:
信号A ──┐
信号B ──┤
信号C ──┤──→ 复用器 ──→ 输出
│
选择信号
复用器根据"选择信号"决定谁能通过:
选择A → 输出 = 信号A
选择B → 输出 = 信号B
选择C → 输出 = 信号C
我们要知道,一个引脚可能承担很多功能。这点很重要,先记住,后面解释。
┌─ GPIO输出数据
│
├─ USART
│
├─ SPI
│
├─ TIM/PWM
│
└─ 其他外设
↓
复用器
↓
I/O引脚
复用器负责从这些信号中选择一个,决定这个GPIO引脚,到底由GPIO本身控制,还是由其他片上外设控制。
为什么需要复用器?
因为 MCU 的引脚数量是有限的。
比如一个MCU只有 64 个引脚,但内部可能有:
- UART
- SPI
- I²C
- 定时器
- GPIO
- ADC
- CAN
如果每个功能都单独占一个引脚,根本不够用。
所以让一个引脚承担多个功能:
GPIO ──────┐
UART ──────┤
SPI ──────┤
PWM ──────┤
I²C ──────┤
↓
复用器
↓
一个引脚
然后通过复用功能配置决定当前使用哪个功能。
输出控制是什么?
输出控制就是用来控制MOS管什么时候导通、什么时候关闭的硬件电路。
复用器已经决定谁来控制这个引脚,但最终怎么把这个信号变成真正的电压输出,是输出控制电路负责的。
输出控制电路通过控制 P-MOS 和 N-MOS 的导通与关闭,实现推挽输出、开漏输出和关闭输出(高阻态)。
P-MOS和N-MOS是什么?
由电压控制的电子开关。
最关键的一点是:
P-MOS负责把I/O往VDD(高电平)方向拉,N-MOS负责把I/O往VSS/GND(低电平)方向拉。
VDD
│
┌──────┐
│ P-MOS│
└──┬───┘
│
├──────── I/O
│
┌──┴───┐
│ N-MOS│
└──┬───┘
│
GND
P-MOS导通,I/O输出高电平;N-MOS导通,I/O输出低电平。
这就是推挽输出 ,一个负责向上拉,一个负责向下拉。所以,叫推挽(Push-Pull)。
开漏输出则没有P-MOS,只有N-MOS。
- N-MOS导通时,把I/O往低电平方向拉,所以输出低电平。
- N-MOS关闭时,相当于开路,输出高阻态。
因为N-MOS管它没有能力主动把I/O拉高,所以通常需要外部上拉电阻,相当于:
VDD
│
电阻
│
I/O ─────
│
N-MOS
│
GND
这样,当N-MOS导通时,上拉电阻把I/O拉到高电平。
这就是开漏。
现在,我们可以把整个GPIO输出部分串起来。
输出数据寄存器
│
↓
┌───────┐
外设 ──→ │ 复用器 │
└───┬───┘
↓
输出控制
│
┌─────┴─────┐
↓ ↓
P-MOS N-MOS
│ │
VDD GND
│ │
└─────┬─────┘
↓
I/O
- 输出数据寄存器:存要输入的数据(0/1)。
- 复用器:决定到底由GPIO还是片上外设提供控制信号。
- 输出控制:决定两个MOS管什么时候开、什么时候关。
- P-MOS:向上拉,把I/O接到VDD,也就是拉到高电平。
- N-MOS:向下拉,把I/O接到GND,也就是拉到低电平。
还有一个问题:能不能同时导通P-MOS和N-MOS?
不能。
如果P-MOS和N-MOS同时导通,那么将会形成一条从 VDD → P-MOS → N-MOS → GND 的直接通路,这相当于把 VDD 和 GND 直接短接,会产生很大的电流。
至此,输出讲完了。
6.输入模式

这张图,只保留了输入部分的结构。
6.1 工作模式
GPIO的输入模式:
- 上拉输入
- 下拉输入
- 浮空输入
- 模拟输入
模拟输入暂且不讲。
另外,前面在讲输出模式的时候,解释了为什么有这么工作模式,输入和输出是一个道理的,这里就不在赘述。
6.2 工作原理

什么是施密特触发器?
一种带"迟滞"的输入电路,用来把不干净、变化缓慢、带噪声的模拟电压,转换成稳定的数字 0/1。
为什么需要施密特触发器?
因为输入信号不一定是规则的,它有可能是这样:

信号在某个电压附近上下波动。
如果普通数字输入电路的判断门槛是:高于图中横向电压值的为1,低于图中横向电压值的为0。
那么,信号在横向附近晃动时,一会儿是1一会儿又是0。导致输出很不稳定,这就是噪声导致的误触发。

施密特触发器规定了正向阈值电压VT+和负向阈值电压VT-,这两个电压之间就是迟滞区域。
- 电压从低往高升,必须超过正向阈值电压才认为
0->1。 - 电压从高往低下降,必须低于负向阈值电压才认为
1->0。
所以,在正向阈值电压附近抖动的信号,不会从1->0,而是保持了原来的状态。在负向阈值电压附近抖动的信号,同理。
所以,施密特触发器就起到了整形、抗噪声的作用。
下面我们讲输入模式。
记住一句话:
上拉、下拉解决的是,当外部没有明确给GPIO一个高/低电平时,GPIO到底应该默认是1还是0。
GPIO作为输入端的时候,它本身不主动输出高低电平。如果引脚什么都没接,那么这个引脚就处于一种浮空状态 。
它的电压可能受到:
- 电磁干扰
- 周围信号
- 人体触摸
等影响。于是可能出现 0 → 1 → 0 → 1 → 1 → 0 ...
所以我们需要给它一个默认状态,这就是上拉和下拉的作用。

上拉输入就是把上面的开关导通。这样,就算外部没有任何输入的情况下,VDD也会把GPIO的电压拉高。也就是说,上拉输入默认是高电平。
下拉输入就是把下面的开关导通。这样,就算外部没有任何输入的情况下,VSS也会把GPIO的电压拉到0V。也就是说,下拉输入默认是低电平。
浮空输入就是把这两个开关都断开,GPIO 输入端既没有被上拉,也没有被下拉,而且外部也没有提供确定的电平。
总结一下:
| 输入模式 | 默认状态 | 原因 |
|---|---|---|
| 上拉输入 | 1 | 电阻把 GPIO 拉向 VDD |
| 下拉输入 | 0 | 电阻把 GPIO 拉向 GND |
| 浮空输入 | 不确定 | 没有确定的电平来源 |
一个问题------为什么一定要用"电阻",而不是直接接 VDD?
因为接通外部电路后,VDD直接与GND直连,会产生很大的电流,可能会破坏电路。电阻的存在,可以减小电流。
至此,输入也讲完了。
7.结语
如有问题,恳请指出,谢谢!