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

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

相关推荐
z落落28 分钟前
C#WinForm 窗体切换与窗体传值(登录跳转案例)+WinForm 窗体传值(从上往下传、从下往上传)
开发语言·windows·c#
allway240 分钟前
How to Echo Multiline to a File in Bash [3 Methods]
开发语言·chrome·bash
weixin_4624462341 分钟前
手把手教你用 Bash 脚本自动更新 /etc/hosts —— 自动绑定网卡 IP 与节点名
开发语言·tcp/ip·bash
一个梦醒了43 分钟前
安装git bash选项推荐
开发语言·git·bash
ct9781 小时前
React 状态管理方案深度对比
开发语言·前端·react
旅僧1 小时前
Π环境部署(运行 且 无理论讲解)
学习
jushi89991 小时前
Lucas Chess R国际象棋、中国象棋、日本将棋、五子棋训练学习工具游戏软件
学习
数量技术宅1 小时前
2026量化前沿:从Reddit热帖到Python实战,如何用赫斯特指数(Hurst)狙击虚假突破?
开发语言·python
华如锦2 小时前
面了很多 Java转AI Agent方向,一些面试题总结
java·开发语言·人工智能·python·ai
huangdong_2 小时前
电商商品SKU图自动分类技术实现:从DOM解析到智能归档
开发语言