单片机的几种GPIO输入输出模型详解
模式选择汇总参考表:
模式 | 输出驱动 | 输入阻抗 | 默认状态 | 典型应用场景 |
---|---|---|---|---|
推挽输出 | 强驱动 | 禁用 | 可配置 | 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 ──┘ (禁用)│GNDVDD│├──P-MOS ──┐ (禁用)│ │
控制逻辑─┤ ├───GPIO引脚│ │├──N-MOS ──┘ (禁用)│GND▲│内部下拉电阻(30-50kΩ)
特点:
内部上拉电阻使能
默认高电平
抗干扰能力增强
应用:
按键检测(按键接地)
数字传感器输入
默认高有效的信号
3. 模拟输入 (Analog Input)
VDD│├──P-MOS ──┐ (禁用)│ │
控制逻辑─┤ ├───GPIO引脚───┬──ADC输入│ │ │├──N-MOS ──┘ (禁用) ▼│ 模拟信号源GND
特点:
完全断开数字电路
高阻抗模式(>10MΩ)
无上拉/下拉
应用:
ADC采样
模拟传感器接口
精密测量电路
实际配置示例(STM32 HAL库):
// 推挽输出
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;