模式选择汇总参考表:
模式 | 输出驱动 | 输入阻抗 | 默认状态 | 典型应用场景 |
---|---|---|---|---|
推挽输出 | 强驱动 | 禁用 | 可配置 | LED, SPI, 高速信号 |
开漏输出 | 弱驱动 | 禁用 | 低/悬空 | I²C, 电平转换, 线与 |
浮空输入 | 禁用 | 极高 | 不确定 | 外部强驱动信号 |
上拉输入 | 禁用 | 中高 | 高电平 | 按键(接地型), 数字输入 |
下拉输入 | 禁用 | 中高 | 低电平 | 按键(接VDD型), 中断 |
模拟输入 | 禁用 | 极高 | 无 | ADC, 模拟信号采集 |
输出模式:
1. 推挽输出 (Push-Pull)
VDD
│
├──P-MOS◯──┐ (受控导通)
│ │
控制逻辑─┤ ├───GPIO引脚
│ │
├──N-MOS◯──┘ (受控导通)
│
GND
工作状态:
高电平:P-MOS导通,N-MOS截止 → 引脚=VDD
低电平:P-MOS截止,N-MOS导通 → 引脚=GND
-
特点:
-
双MOS管协同工作(P管拉高,N管拉低)
-
可主动输出高/低电平
-
驱动能力强(典型20mA),多个IO之间不可以直接并联,否则短路
-
-
应用:
-
LED控制
-
驱动继电器
-
SPI、UART通信
-
高速数字信号
-
2. 开漏输出 (Open-Drain)
VDD
│
├──P-MOS ──┐ (永久禁用)
│ │
控制逻辑─┤ ├───GPIO引脚───┬──外部上拉电阻──VDD_EXT
│ │ │ (可选不同电压)
├──N-MOS◯──┘ (受控导通) │
│ ▼
GND GND
工作状态:
低电平:N-MOS导通 → 引脚=GND
高电平:N-MOS截止 → 引脚悬空(需外部上拉)
-
特点:
-
只有N-MOS工作
-
高电平依赖外部上拉
-
支持"线与"连接,即多个IO之间可以直接并联
-
-
应用:
-
I²C/SMBus总线
-
电平转换(3.3V↔5V)
-
多设备中断共享
-
开关键控
-
输入模式:
1. 浮空输入 (Floating Input)
VDD
│
├──P-MOS ──┐ (禁用)
│ │
控制逻辑─┤ ├───GPIO引脚───外部信号源
│ │
├──N-MOS ──┘ (禁用)
│
GND
▲
│
无上拉/下拉
-
特点:
-
完全悬空状态
-
高阻抗输入(>1MΩ)
-
易受干扰
-
-
应用:
-
外部明确驱动的信号
-
ADC输入前级
-
高速数字信号接收
-
2. 上下拉输入 (Pull-up Input)
VDD
│
│ 内部上拉电阻(30-50kΩ)
├───┬──────┐
│ │ │
├──P-MOS ──┤ (禁用)
│ │
控制逻辑─┤ ├───GPIO引脚
│ │
├──N-MOS ──┘ (禁用)
│
GND
VDD
│
├──P-MOS ──┐ (禁用)
│ │
控制逻辑─┤ ├───GPIO引脚
│ │
├──N-MOS ──┘ (禁用)
│
GND
▲
│
内部下拉电阻(30-50kΩ)
-
特点:
-
内部上拉电阻使能
-
默认高电平
-
抗干扰能力增强
-
-
应用:
-
按键检测(按键接地)
-
数字传感器输入
-
默认高有效的信号
-
3. 模拟输入 (Analog Input)
VDD
│
├──P-MOS ──┐ (禁用)
│ │
控制逻辑─┤ ├───GPIO引脚───┬──ADC输入
│ │ │
├──N-MOS ──┘ (禁用) ▼
│ 模拟信号源
GND
-
特点:
-
完全断开数字电路
-
高阻抗模式(>10MΩ)
-
无上拉/下拉
-
-
应用:
-
ADC采样
-
模拟传感器接口
-
精密测量电路
-
实际配置示例(STM32 HAL库):
cpp
// 推挽输出
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
// 开漏输出(I²C)
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
// 上拉输入(按键检测)
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
// 下拉输入
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
// 模拟输入(ADC)
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;