GPIO工作原理以及核心

一、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上拉输入

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

相关推荐
释厄6236 小时前
AI学习层更新与跨体转移律——人类社会同构·不缺理解缺 U
人工智能·学习
raindayinrain6 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
吠品6 小时前
智谱开源 ZCode 之后,真正的考试才开始
单片机·嵌入式硬件·1024程序员节
学逆向的6 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao6 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
学逆向的7 小时前
C 局部静态变量
c语言·开发语言·网络安全
Chery11407 小时前
高速ADC与精密DAC怎么选?DP9230D与DP8532D应用解析
嵌入式硬件·物联网·射频工程
大都督会赢的7 小时前
C++第一节课
开发语言·c++
“AI国潮设计-小江”7 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
小王C语言8 小时前
Qt常用控件:容器类控件,标题分组框、标签页(浏览器标签)
开发语言·qt