GPIO实验演示理论知识
098.2.1GPIO实验演示理论知识
一、任务走流程
GPIO 学习按“硬件连接 → 电气原理 → 模式配置 → 库函数 → 寄存器 → 实验现象”展开。STM32 的一个引脚可以在数字输入、模拟输入、普通输出和复用功能之间切换;在写代码前,必须先确定信号方向、默认电平、有效电平和电压范围。
本组实验使用六个 GPIO:
| 功能 | 引脚 | 方向/模式 | 有效电平 |
|---|---|---|---|
| KEY1 | PE3 | 上拉输入 | 按下为低 |
| KEY2 | PE4 | 上拉输入 | 按下为低 |
| LED1 | PB5 | 推挽输出 | 低电平亮 |
| LED2 | PE5 | 推挽输出 | 低电平亮 |
| 蜂鸣器 | PB8 | 推挽输出 | 高电平响 |
| 光敏模块 DO | PB11 | 浮空数字输入 | 本实验实测亮处为低、暗处为高 |
光敏模块接的是 PB11,不是 PB1。模块的数字输出极性与比较器接法有关,不能只凭模块名称猜测,应以实测和模块原理图为准。
二、GPIO理论知识
STM32F1 每个 GPIO 引脚常见八种模式:模拟输入、浮空输入、上拉/下拉输入、通用推挽输出、通用开漏输出、复用推挽输出、复用开漏输出。它们来自同一套内部电路的不同开关组合,并不是八套互不相关的硬件。
flowchart TD
PAD[外部引脚 PAD] --> PROTECT[ESD/钳位保护]
PROTECT --> SCHMITT[施密特触发器]
SCHMITT --> IDR[输入数据寄存器 IDR]
PROTECT --> ANALOG[模拟通道 ADC]
PULLUP[VDD 经弱上拉] --> PAD
PAD --> PULLDOWN[经弱下拉到 VSS]
ODR[ODR/BSRR] --> MUX[普通输出/复用输出选择]
AF[片上外设输出] --> MUX
MUX --> DRIVER[PMOS + NMOS 输出驱动]
DRIVER --> PAD
- 输入路径可以一直监视引脚电平,即使引脚配置为输出,也可通过
IDR读回实际引脚状态。 - 模拟输入会关闭数字输入缓冲与输出驱动,让电压进入 ADC 等模拟模块,降低数字切换带来的干扰。
- 复用输出表示信号源改为 USART、SPI、TIM 等片上外设,输出级仍可选择推挽或开漏。
- STM32F1 的“输出速度 2/10/50 MHz”主要控制输出驱动能力与边沿速度上限,不是让 GPIO 自动按该频率翻转,也不是外设时钟频率。
2.1 实验演示
实验前同时连接 ST-Link 和供电/串口线,并确认两路设备共地。下载后依次验证 LED、按键、蜂鸣器和光敏模块;一次只检查一条信号链,更容易定位接线、模式或软件逻辑错误。
2.1.1 实验二按键控制
三条实际控制链为:
PE3(KEY1,按下=0) ──> 软件消抖 ──> 翻转 PB8 ──> 三极管 ──> 蜂鸣器
PE4(KEY2,按下=0) ──> 软件消抖 ──> 翻转 PE5 ──> LED2(0=亮)
PB11(SUN) ──> 电平判断 ──> 写 PB5 ──> LED1(暗处亮、亮处灭)
板载蜂鸣器不是由 PB8 直接供电。PB8 通过 1 kΩ 电阻驱动 S8050 NPN 三极管基极,10 kΩ 电阻把基极下拉,蜂鸣器接在 3.3 V 与三极管集电极之间。PB8 输出高电平时产生基极电流,三极管导通,蜂鸣器电流流向地;输出低电平时三极管截止,蜂鸣器停止。
3.3 V ── 有源蜂鸣器 ── C
│ S8050
PB8 ── 1 kΩ ── B E ── GND
│
10 kΩ
│
GND
2.1.2 理论知识
判断一个 GPIO 模式时先问:
- 信号是进入 MCU 还是从 MCU 输出?
- 是连续模拟电压还是数字高/低电平?
- 松开、断线或器件不驱动时,默认电平由谁确定?
- 输出需要主动拉高和拉低,还是多个器件共用一根线?
- 引脚最高电压和负载电流是否满足数据手册?
2.1.2.1 例题: 51单片机电路图
经典 8051 的 P0 口在通用 I/O 状态下为开漏结构,需要外接上拉电阻才能可靠得到高电平;P1、P2、P3 更准确的说法是“准双向口,内部带上拉”,不应简单等同于现代 MCU 的标准推挽输出。
VCC
│
[上拉排阻]
│
├──── P0.x ──── 外部负载
│
NMOS
│
GND
NMOS 导通:P0.x 被主动拉低
NMOS 截止:P0.x 靠外部上拉电阻变高
上拉电阻并不是无条件越小越好。低电平时会有静态电流:
$I_{pullup}\approx\frac{V_{CC}-V_{OL}}{R_{pullup}}$
阻值过大,上升沿慢且抗干扰差;阻值过小,低电平电流和功耗增大。具体取值要结合总线电容、速度和器件灌电流能力。
三、单片机参考手册
3.1 GPIO功能描述
STM32F1 的 GPIO 端口包含以下主要寄存器:
| 寄存器 | 作用 |
|---|---|
GPIOx_CRL | 配置引脚 0~7,每个引脚 4 位 CNF[1:0]+MODE[1:0] |
GPIOx_CRH | 配置引脚 8~15,编码方法同 CRL |
GPIOx_IDR | 读取 16 个引脚的实际输入电平 |
GPIOx_ODR | 保存 16 个输出锁存位,也参与输入上拉/下拉选择 |
GPIOx_BSRR | 原子置位/复位 ODR,低 16 位置位,高 16 位复位 |
GPIOx_BRR | 原子复位 ODR 相应位 |
GPIOx_LCKR | 锁定端口配置,复位前不能再改 |
MODE=00 表示输入;此时 CNF 区分模拟、浮空和上拉/下拉。输出时 MODE=01/10/11 分别对应最大 10/2/50 MHz,CNF 再区分推挽、开漏以及普通/复用输出。HAL 的 GPIO_SPEED_FREQ_LOW 在 STM32F1 上对应 2 MHz 配置。
3.2 推挽输出和开漏输出
推挽输出由上管和下管交替导通:
VDD
│
[PMOS 上管]
│
内部控制 ─────┼──── GPIO 引脚
│
[NMOS 下管]
│
VSS
输出 1:上管导通、下管截止,主动拉高
输出 0:上管截止、下管导通,主动拉低
上下管不能同时长时间导通,否则会形成从 VDD 到 VSS 的直通电流。硬件输出级会安排非重叠控制。
开漏输出关闭上管,只保留下管:
外部电源 ── 上拉电阻 ──┬── GPIO 引脚
│
[NMOS 下管]
│
GND
写 0:NMOS 导通,引脚为低
写 1:NMOS 截止,引脚高阻;高电平由上拉产生
| 特性 | 推挽 | 开漏 |
|---|---|---|
| 主动输出高电平 | 可以 | 不可以 |
| 主动输出低电平 | 可以 | 可以 |
| 是否通常需要上拉 | 否 | 是 |
| 多器件共线 | 容易发生高低电平冲突 | 可实现“线与”,如 I²C |
| 电平转换 | 输出高电平受 MCU VDD 限制 | 可在引脚额定范围内用外部上拉选择总线高电平 |
开漏模式下“写 1”不是输出一个强高电平,而是释放总线。若没有内部或外部上拉,电平会悬空。
3.3 51单片机开漏输出与上拉电阻
51 单片机 P0 的外接排阻把八根开漏线分别拉到 VCC。当端口释放时获得默认高电平,输出低时由端口灌电流。P0 还复用作外部存储器的地址/数据总线,此时内部电路行为与通用 I/O 状态不同,分析时要看具体工作模式。
STM32 的开漏是可配置模式,而经典 8051 P0 的通用 I/O 开漏是端口结构特性;两者“需要上拉才能可靠变高”的电气结论相似,但寄存器和内部结构并不相同。
3.4 输入模式: 浮空、上拉、下拉
VDD
│
[弱上拉]
│
外部引脚 ────────────┼────> 施密特触发器 ──> IDR
│
[弱下拉]
│
GND
- 上拉输入:内部弱上拉接通,外部无人驱动时默认为 1;适合一端接 GND 的按键,按下读 0。
- 下拉输入:内部弱下拉接通,外部无人驱动时默认为 0;适合一端接 VDD 的按键,按下读 1。
- 浮空输入:上下拉都断开,必须由外部电路稳定驱动;断线时容易拾取噪声并随机跳变。
STM32F1 在输入上拉/下拉模式中,CRL/CRH 使用同一种 CNF=10 编码,究竟上拉还是下拉由对应的 ODR 位决定:ODR=1 为上拉,ODR=0 为下拉。HAL 会代为完成这两个寄存器的配合。
3.5 模拟输入与其他输入模式
模拟输入时,数字施密特触发器和输出缓冲被关闭,引脚电压送往 ADC 等模拟通道。这样既减少数字输入翻转带来的功耗,也避免数字电路干扰模拟测量。
施密特触发器不是“TTL 消极传感器”。它使用不同的上升阈值和下降阈值形成迟滞,把有噪声、边沿较慢的输入整形成稳定的数字 0/1。读 GPIOx_IDR 得到的是整形后的数字状态。
复用输入通常仍从输入路径进入相应外设;复用输出则由外设功能控制输出数据。例如 USART_TX 由 USART 移位逻辑驱动,TIM_CHx 由定时器比较单元驱动,而不是由软件反复写 ODR。
3.6 5伏兼容I/O端口位的基本结构
数据手册引脚表中 FT 表示 5 V tolerant。对课程器件,PB2、PB11、PF11、PF12 等引脚标有 FT;PB1、PB5 等没有 FT。标记必须逐引脚查看,不能按整个 GPIO 端口推断。
外部 5 V 数字信号
│
限流/保护
│
FT 引脚输入缓冲 ──> MCU 数字逻辑
非 FT 引脚:VIN 通常不得超过 VDD + 0.3 V
FT 引脚:绝对最大输入电压可到 5.5 V,但仍受注入电流等条件限制
“5 V 容忍”只说明输入电压耐受范围,不表示 GPIO 能输出 5 V,也不表示可以忽略绝对最大额定值、注入电流和外设复用限制。绝对最大额定值也不是推荐长期工作点;接口设计仍应优先满足正常工作条件。
3.7 复位期间和复位后的复用功能
复位期间及复位后,大多数 GPIO 为浮空输入,以避免多个器件上电时输出冲突;调试相关引脚有特殊默认配置和内部上拉/下拉。程序尚未运行到 MX_GPIO_Init() 前,外设的电平可能由板上电阻、器件输入或浮空状态决定。
这也是外部电路需要默认电阻的原因:关键使能、三极管栅极/基极、片选和启动脚不能完全依赖软件稍后初始化。板上蜂鸣器基极的 10 kΩ 下拉,就能在 PB8 处于高阻时让三极管保持截止。
3.8 芯片手册查找
确认一个引脚是否可用时按以下顺序查:
- 核对完整型号和封装,例如 STM32F103ZET6、LQFP144;
- 在数据手册的 pin definitions 表中找到引脚;
- 查看
Type、I/O Level是否有FT、复位后的主功能和复用功能; - 再看电气特性中的输入电压、电流和输出驱动限制;
- 回到开发板原理图确认该引脚是否已连接 LED、按键或其他器件;
- 在参考手册中查对应 GPIO/AFIO 寄存器配置。
同名引脚在不同封装上可能不存在,复用功能也可能因器件型号而异。使用 5 V 模块前必须同时核对模块输出类型、目标引脚 FT 标记和共地关系。