1.GPIO简介
GPIO 的全称是 General Purpose Input Output,即通用输入输出。简单来说,它就是芯片上的那些引脚,你可以通过代码控制它们“通电”或“断电”,也可以让它们去感知外界的电压。
1. GPIO 的基本功能
每个 GPIO 引脚都可以被配置为两种最基本的状态:
输出 (Output):由芯片控制引脚。
高电平 (High):引脚输出约 3.3V 电压(相当于开关接通)。
低电平 (Low):引脚输出 0V 电压(相当于开关断开)。
应用:点亮 LED、驱动蜂鸣器、控制继电器。
输入 (Input):芯片检测引脚上的电压。
如果外界给引脚 3.3V,程序读到的是
1。如果外界给引脚 0V,程序读到的是
0。应用:读取按键是否按下、接收传感器触发信号。
2. GPIO 的内部构造
为了应对不同的场景,STM32 的 GPIO 引脚内部设计了复杂的电路。
你需要重点理解这几种常用模式:
输出模式
推挽输出 (Push-Pull):最常用的输出方式。可以输出高、低电平,驱动能力强,适合点灯、控制驱动电路。
开漏输出 (Open-Drain):只能输出低电平。如果要输出高电平,必须在外电路接一个上拉电阻。常用于 I2C 通信。
输入模式
上拉输入 (Pull-up):引脚内部接一个电阻到 3.3V。当外部没有信号时,引脚默认保持高电平。
下拉输入 (Pull-down):引脚内部接一个电阻到 GND。当外部没有信号时,引脚默认保持低电平。
浮空输入 (Floating):内部既不接上拉也不接下拉,电平极易受外界干扰而抖动。通常在特定的通信协议(如 USART)中使用。
3. GPIO 的命名规则
STM32 的引脚非常多,它是按“组”分的:
组名:GPIOA, GPIOB, GPIOC ... (每一组通常有 16 个引脚)。
编号:0 到 15。
示例:
PC13表示 C 组 的第 13 号 引脚(这是很多开发板板载 LED 所在的引脚)。
💡 深度提示:记得开头那句代码吗?
无论是输入还是输出,在操作任何 GPIO 之前,第一步永远是开启该组的时钟。
2.GPIO 引脚基本结构

GPIO 的工作原理。
三个核心部分:保护与稳定电路、输入数据路径、输出驱动电路。
第一部分:保护与稳定(位于图片最左侧)
这是 GPIO 的“大门”,负责保护内部电路并确保信号初始状态的稳定。
1. 保护二极管 (Protection Diodes)
位置: 图片最左侧,引脚上下各有一个二极管。
原理:
上方二极管: 连接到 VDD(电源)。当引脚输入的电压异常过高(超过 VDD)时,该二极管导通,将多余的电流“泄放”到电源中,防止烧坏内部电路。
下方二极管: 连接到 VSS(地)。当引脚输入的电压异常过低(低于VSS,即负电压)时,该二极管导通,防止负电压损坏芯片。
总结: 它们是芯片的“避雷针”,防止静电或过压损坏芯片。
2. 上拉/下拉电阻 (Pull-Up/Pull-Down Resistors)
位置: 二极管右侧,通过开关连接的两个电阻。
原理:
上拉电阻: 当开关闭合时,引脚通过电阻连接到 VDD。如果外部没有信号(悬空),引脚会被“拉”到高电平。
下拉电阻: 当开关闭合时,引脚通过电阻连接到 VSS。如果外部没有信号,引脚会被“拉”到低电平。
总结: 它们给引脚一个“默认状态”,防止引脚因为悬空而出现乱码。可以通过软件控制这两个开关的通断。
第二部分:输入路径(图中中间部分,箭头向右 ---->)
当我们需要读取外部信号(如按键按下、传感器信号)时,信号走这条路。
3. 施密特触发器 (Schmitt Trigger)
位置: 三角形符号,位于输入线上。
原理: 这是一个特殊的电压比较器。外部输入的信号往往不是完美的 0V 或 3.3V,可能带有杂波或处于中间电压。
当电压高于某个阈值(如 2.0V),它输出逻辑 1。
当电压低于某个阈值(如 1.0V),它输出逻辑 0。
总结: 它的作用是“整形”和“滤波”,把外部不稳定的模拟电压变成内部 CPU 能看懂的纯净数字信号(0 或 1)。
4. 输入数据寄存器 (IDR)
位置: 施密特触发器后面。
原理: 这是一个存储单元。施密特触发器输出的“0”或“1”会暂时存放在这里。
总结: 它是“信箱”。CPU 随时来读取 IDR 里的数值,就知道当前引脚是高电平还是低电平了。
第三部分:输出路径(图中右侧部分,箭头向左 <----)
当我们需要控制外部设备(如点亮 LED、发送数据)时,信号走这条路。
5. 输出数据寄存器 (ODR)
位置: CPU 右侧。
原理: 当你在代码中写
GPIO_Write(1)时,CPU 会把这个“1”写入 ODR 寄存器。总结: 它是“指令台”,保存了 CPU 想要输出的目标电平。
6. 输出驱动器 (Output Driver - MOS管组)
位置: 图片最右侧的大方框,包含 P-MOSFET (上管) 和 N-MOSFET (下管)。
原理: 这是一个电子开关组合,根据 ODR 的指令来控制引脚电压。图中展示了两种模式:
模式 A:推挽输出 (Push-Pull) —— 驱动能力强
输出高电平 (1): 上方的 P-MOS 导通,下方的 N-MOS 截止。电流从VDD 流向引脚,对外输出高电平。
输出低电平 (0): 上方的 P-MOS 截止,下方的 N-MOS 导通。电流从引脚流向VSS,对外输出低电平。
模式 B:开漏输出 (Open-Drain) —— 用于 I2C 或 电平转换
输出低电平 (0): 下方的 N-MOS 导通,引脚直接接地(VSS),输出强低电平。
输出高电平 (1): 上方的 P-MOS 不工作 (被断开),下方的 N-MOS 截止。此时引脚处于“高阻态”(相当于断路)。注意: 此时必须在外部接一个上拉电阻,才能将电平拉高。
总结信号流向
读数据 (Input):
外部引脚电压----> 保护二极管(过压保护) -----> 施密特触发器(整形) ----> IDR寄存器-----> CPU 读取。
写数据 (Output):
CPU 写指令-----> ODR寄存器 ----> 输出控制电路----> 控制 P-MOS/N-MOS 开关 ----> 引脚呈现高/低电平。
3.GPIO位结构

这张图片展示了一个非常经典且标准的 GPIO(通用输入/输出)位结构图(看起来非常像 STM32 系列单片机的 GPIO 结构)。按照信号流向和功能模块,把这张图拆解为四个核心部分:
1. 保护电路 (最右侧)
位于图片的最右侧,直接连接外部引脚。
组件: 两个保护二极管(一个接 $V{DD}$,一个接 $V{SS}$)。
工作原理:
这是芯片的“防弹衣”。
如果引脚电压 高于 $V_{DD}$,上方二极管导通,电流流向电源。
如果引脚电压 低于 $V_{SS}$(负电压),下方二极管导通,电流从地流出。
目的: 防止外部过高或过低的电压(如静电 ESD)烧毁芯片内部的精密电路。
2. 上拉/下拉电阻 (右侧上方)
位于保护二极管的左侧。
组件: 两个开关 + 两个电阻。
工作原理: 通过软件配置这两个开关的闭合状态。
上拉 (Pull-up): 上方开关闭合,引脚通过电阻连到 $V_{DD}$,默认为高电平。
下拉 (Pull-down): 下方开关闭合,引脚通过电阻连到 $V_{SS}$,默认为低电平。
浮空 (Floating): 两个开关都断开,电平由外部信号完全决定。
目的: 消除引脚在没有外部信号时的不确定状态(防止乱码)。
3. 输入驱动器 (中间上部)
这是信号从外部进入芯片的通道。图片中展示了信号进入后的三条分路:
核心组件:TTL肖特基触发器 (Schmitt Trigger)
它是一个迟滞比较器,作用是将外部波动的模拟电压信号“整形”为标准的数字信号(0 或 1)。
注意: 图中显示它有一个“开/关”控制。当配置为模拟输入模式时,这个触发器会被关闭,以节省功耗。
信号的三条去路:
模拟输入 (至片上外设):
路径: 不经过肖特基触发器,直接传输电压值。
用途: 给 ADC(模数转换器)读取具体的电压数值。
复用功能输入 (至片上外设):
路径: 经过触发器整形后,直接连接到内部的其他外设。
用途: 例如串口 (UART) 的 RX 引脚、定时器的输入捕获引脚。
输入数据寄存器 (至 CPU):
路径: 经过触发器整形后,存入输入数据寄存器。
用途: CPU 通过“读出”指令读取该寄存器,就能知道当前引脚是 0 还是 1。
4. 输出驱动器 (中间下部)
这是信号从芯片发往外部的通道。
写数据源头:
位设置/清除寄存器 (BSRR): 这是一个控制型寄存器,CPU 往这里写数据,可以原子操作地修改 ODR 的值(防止多任务打断产生的风险)。
输出数据寄存器 (ODR): 最终决定输出电平的地方,锁存数据。
复用功能输出: 如果开启复用(如 PWM 输出),信号来源就不是 ODR,而是来自片上外设(如定时器)。
输出控制逻辑:
图中有一个梯形选择器(多路选择器),决定是让 ODR 控制引脚,还是让 复用功能 控制引脚。
随后进入“输出控制”模块,这里会根据模式(推挽或开漏)处理信号,控制后面的 MOS 管。
双 MOS 管驱动电路 (P-MOS + N-MOS):
推挽模式 (Push-Pull): P-MOS 和 N-MOS 轮流工作。输出 1 时 P-MOS 导通(强上拉);输出 0 时 N-MOS 导通(强下拉)。驱动能力强,开关速度快。
开漏模式 (Open-Drain): P-MOS 彻底不工作。输出 0 时 N-MOS 导通(接地);输出 1 时 N-MOS 截止(高阻态)。需要外接上拉电阻才能输出高电平,常用于 I2C 通信。
关闭 (模拟模式): P-MOS 和 N-MOS 都关闭,引脚呈现高阻态,避免干扰模拟信号读取。
总结图中的工作流
CPU 写: CPU----> 位设置/清除寄存器 ----> 输出数据寄存器 ----> 输出控制 ----> MOS管 ----> 引脚电平变化。
CPU 读: 引脚电平 ----> 肖特基触发器 ----> 输入数据寄存器 ----> CPU 读取。
外设复用: 信号直接绕过数据寄存器,在复用功能输入/输出通道与片上外设(如 I2C, SPI, USART)直接交互。
4.GPIO模式
通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式:
评论区