一、GPIO 是什么
-
全称 :General Purpose Input/Output,通用输入输出接口
-
作用:MCU 用来接收外部信号(输入)或控制外部器件(输出)的引脚
二、GPIO 的核心模式
| 模式 | 说明 |
|---|---|
| 输入模式 | MCU 读取引脚电平(高/低),用于检测按键、传感器信号等 |
| 输出模式 | MCU 控制引脚输出高/低电平,用于驱动 LED、蜂鸣器等 |
三、输入模式详解

1. 引脚最好不要悬空
浮空输入:上拉电阻和下拉电阻都不接,接收到的信号也不稳定
-
原因 :悬空时电平受外界干扰不稳定,导致读数错误。
-
解决:通过上拉电阻(接 VCC)或下拉电阻(接 GND)提供确定的默认电平。

3. 上拉输入与下拉输入
-
上拉输入:上拉电阻下面的开关启动,和Vdd导通,默认高电平,如果按键接 GND → I引脚(按键)按下为低电平。
-
下拉输入:上拉电阻下面的开关启动,和Vdd导通,默认高电平,如果按键接 VCC → I引脚(按键)按下为高电平。
4. 按键消抖方法
延时消抖,定时器消抖,状态机消抖
施密特触发器(升级版的比较器):具有两个参考电压,如果接收到的电压大于高参考电压,就判断为高电平,如果接收到的电压小于低参考电压,就判断为低电平。具有迟滞特性,抑制噪声和缓慢变化,增强抗干扰。
5. 上拉 vs 下拉对比表
| 特性 | 上拉 (Pull-up) | 下拉 (Pull-down) |
|---|---|---|
| 连接方式 | 电阻接引脚与 VCC | 电阻接引脚与 GND |
| 默认电平 | 高电平 (1) | 低电平 (0) |
| 主要作用 | 防止悬空,提供默认高 开漏总线必须上拉 | 防止悬空,提供默认低 |
| 典型应用 | 按键接 GND、I2C 总线、复位引脚 | 按键接 VCC、使能引脚默认禁止 |
| 常见按键接法 | 按键接 GND,GPIO 上拉 → 松开读 1,按下读 0 | 按键接 VCC,GPIO 下拉 → 松开读 0,按下读 1 |
四、输出模式详解


推挽 vs 开漏对比表
| 特性 | 推挽输出 (Push-Pull) | 开漏输出 (Open-Drain) |
|---|---|---|
| 输出高电平方式 | p-mos激活,n-mos关闭 内部直接接 Vdd,主动推高 | p-mos关闭,n-mos关闭 高阻态,由外部上拉电阻拉高 |
| 输出低电平方式 | n-mos激活,p-mos关闭 内部直接接 vss,主动拉低 | n-mos激活,p-mos关闭 内部接VSS,主动拉低 依靠外部电源驱动。 |
| 是否需要上拉 | 不需要 | 必须(除非内部有可配置上拉) |
| 典型应用 | 普通 LED、SPI、UART、片选信号 | I2C、多设备中断、不同电压域通信 |
高阻态是啥:引脚既不输出高电平,也不输出低电平,对外部电路呈高阻抗,类似"断开"
引出一个问题:如果想要输出的工作电压为5v,应该怎么做?首先排除推挽输出,因为推挽输出的VDD也就3.3v,不能支持5v。这个时候可以让开漏输出低电平,然后外部接一个5v这样就可以了,还得注意保护二极管可以承受吗题外话:
为什么 I2C 使用开漏?
所有设备只能拉低,高电平由上拉电阻统一提供,总线空闲时为高。
支持多主机仲裁(通过拉低总线竞争)和时钟同步。
五、其他常见模式
-
复用功能:引脚作为 UART、SPI、PWM 等外设接口,需配置为对应复用模式(推挽/开漏取决于外设要求)。
-
模拟输入:用于 ADC 采样,数字部分关闭,引脚直接连接模拟前端。
-
中断触发:可配置为上升沿、下降沿、高/低电平触发,用于响应外部事件(需配合 EXTI 和 NVIC)。

六、寄存器视角(以 STM32 为例)
-
ODR:输出数据寄存器
-
BSRR:原子操作寄存器
BSRR vs ODR:BSRR 允许原子操作(写 1 对应位 set,写 1 对应位+16 reset),无需读-改-写,更安全高效;ODR 需要读-改-写,可能被中断打断。
七、GPIO 中断基础
-
EXTI:外部中断/事件控制器,负责检测引脚上的信号变化,产生中断请求。
-
NVIC:嵌套向量中断控制器,负责管理中断优先级和分发中断给 CPU 处理。
-
工作流程:引脚电平变化 → EXTI 检测到触发条件 → EXTI 向 NVIC 发送中断信号 → NVIC 根据优先级调度,执行对应的中断服务函数 (ISR)。
例程
-
按住 KEY1 绿灯亮,松开绿灯熄灭------按下一个状态,松开一个状态
-
按一下 KEY2,蓝灯亮/灭翻转一次------每触发一次按键,也就是接收到低电平的时候,翻转一下。
-
按一下 KEY3,红灯亮/灭翻转一次------每触发一次按键,也就是接收到低电平的时候,翻转一下。

初始化电平,命名,输出模式,无上下拉电阻

命名,输入模式,key1浮空输入,key2/3上拉输入

加上消抖和等待再次低电平。