STM32 GPIO输入输出模式到底有什么区别?一篇文章彻底搞懂浮空、上拉、下拉、推挽、开漏

1. GPIO是什么?
在STM32开发中,GPIO(General Purpose Input Output)是最基础也是最常用的外设之一。
GPIO中文名称:
通用输入输出接口
简单来说,GPIO就是STM32芯片与外部世界连接的“窗口”。
通过GPIO可以实现:
- 读取外部传感器信号
- 检测按键状态
- 控制LED灯
- 驱动继电器
- 输出PWM波形
- 连接UART、SPI、I2C等通信接口
例如:
GPIO作为输入
按键连接:
3.3V
|
按键
|
GPIO ——
|
GND
STM32通过读取GPIO电平判断:
按下 → GPIO=0
释放 → GPIO=1
GPIO作为输出
控制LED:
STM32 GPIO
|
LED
|
GND
GPIO输出高低电平控制LED亮灭。
2. STM32 GPIO内部结构
STM32的GPIO并不是一个简单的开关,而是内部包含:
- 输入缓冲器
- 输出驱动器
- 上拉电阻
- 下拉电阻
- 多路复用器
- 模拟开关
内部结构简化:
STM32内部
输入
|
|
外部引脚 —- GPIO
|
|
输出
|
复用功能选择
|
UART / SPI / I2C / PWM
因此一个GPIO引脚可以有多个身份:
例如STM32的PA9:
普通GPIO:
PA9
|
输出高低电平
复用:
PA9
|
USART1_TX
|
串口发送数据
3. STM32 GPIO有哪些模式?
STM32 GPIO主要分为四大类:
输入模式
输出模式
复用模式
连接内部外设:
- USART
- SPI
- I2C
- TIM
模拟模式
用于:
- ADC采样
- DAC输出
结构如下:
GPIO
|
┌───────────────┼───────────────┐
输入 输出 复用
Floating Push-Pull USART
Pull-up Open-Drain SPI
Pull-down I2C
|
Analog
|
ADC
4. GPIO输入模式详解
4.1 浮空输入(Floating Input)
浮空输入表示:
GPIO内部没有连接上拉或者下拉电阻。
结构:
GPIO
|
|
外部信号
特点:
GPIO电平完全由外部决定。
例如:
外部输入:
3.3V
GPIO=1
输入:
0V
GPIO=0
但是如果:
GPIO没有连接任何东西:
GPIO = ?
可能:
- 0
- 1
- 不稳定跳变
原因:
引脚处于高阻状态,很容易受到:
- 电磁干扰
- 噪声
- 电荷影响
应用:
适合:
- 外部已经提供稳定电平的信号
例如:
传感器输出:
传感器
|
GPIO
5. 上拉输入(Pull-Up Input)
上拉输入:
内部通过电阻连接到3.3V。
结构:
3.3V
|
电阻
|
GPIO ——–
|
按键
|
GND
没有按键:
GPIO被拉高:
GPIO=1
按键按下:
GPIO接地:
GPIO=0
典型应用:
按键检测
程序:
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0)
{
//按键按下
}
优点:
- 默认状态确定
- 不容易受到干扰
6. 下拉输入(Pull-Down Input)
下拉输入:
内部电阻连接到GND。
结构:
GPIO
|
|
电阻
|
GND
默认:
GPIO=0
输入高电平:
GPIO=1
应用:
例如:
检测外部触发信号。
没有信号:
GPIO=0
收到信号:
GPIO=1
7. GPIO输出模式
STM32主要有两种输出:
- 推挽输出
- 开漏输出
8. 推挽输出(Push-Pull)
推挽输出是STM32最常用输出方式。
内部结构:
3.3V
|
PMOS
|
GPIO ——–●
|
NMOS
|
GND
输出高电平
PMOS打开:
3.3V
|
GPIO
GPIO输出:
1
输出低电平
NMOS打开:
GPIO
|
GND
GPIO输出:
0
特点:
优点:
- 输出能力强
- 速度快
- 电平稳定
缺点:
多个设备不能直接连接。
应用:
LED控制
GPIO
|
LED
|
GND
PWM输出
例如:
- 电机控制
- 舵机控制
9. 开漏输出(Open Drain)
开漏输出内部只有NMOS管。
结构:
3.3V
|
上拉电阻
|
GPIO ——-
|
NMOS
|
GND
输出低:
NMOS导通:
GPIO=0
输出高:
NMOS关闭:
GPIO悬空
因此:
开漏输出必须:
外接上拉电阻。
10. 为什么I2C使用开漏输出?
I2C总线:
3.3V
|
上拉电阻
|
SDA —————-
|
多个设备
原因:
多个设备可以共享一根线。
如果设备A:
拉低:
SDA=0
设备B:
释放:
不影响
这样可以避免:
两个设备同时输出高低电平造成短路。
因此:
I2C:
必须开漏输出
11. 推挽输出和开漏输出区别
| 输出高电平 | 主动输出 | 需要上拉 |
| 输出低电平 | 主动输出 | 主动拉低 |
| 驱动能力 | 强 | 弱 |
| 速度 | 快 | 慢 |
| 是否适合多设备 | 否 | 是 |
| 常用场景 | LED/PWM | I2C通信 |
简单记忆:
需要驱动负载
选择推挽
需要多人共享总线
选择开漏
12. GPIO复用模式(Alternate Function)
GPIO不仅可以普通输入输出。
还可以连接内部外设。
例如:
PA9:
普通模式:
GPIO输出
复用模式:
PA9
|
USART1_TX
|
串口发送
常见复用:
| USART_TX | 串口发送 |
| USART_RX | 串口接收 |
| SPI_SCK | SPI时钟 |
| I2C_SDA | 数据线 |
| TIM_CH | PWM输出 |
13. GPIO模式如何选择?
实际开发中可以按照下面选择:
读取信号
例如:
- 按键
- 传感器
选择:
输入模式
上拉/下拉
控制设备
例如:
- LED
- 继电器
- 蜂鸣器
选择:
推挽输出
通信总线
例如:
- I2C
- SMBUS
选择:
开漏输出
使用内部外设
例如:
- UART
- SPI
- PWM
选择:
复用模式(AF)
14. 总结
STM32 GPIO虽然看起来简单,但是里面包含大量硬件设计。
重点记忆:
输入:
看外部电平
输出:
看驱动能力
推挽:
主动输出高低电平
开漏:
只能主动拉低,需要上拉
通信:
优先考虑复用功能
掌握GPIO模式,是学习STM32:
- UART通信
- I2C通信
- SPI通信
- PWM控制
- ADC采集
的基础。
对于嵌入式开发来说,GPIO不仅是“控制一个IO口”,更是理解MCU内部硬件结构的重要入口。




