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

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

相关推荐
摇滚侠3 小时前
JAVA 项目教程《苍穹外卖-12》,微信小程序项目,前后端分离,从开发到部署
java·开发语言·vue.js·node.js
AI成长日志3 小时前
【笔面试算法学习专栏】双指针专题·简单难度两题精讲:167.两数之和II、283.移动零
学习·算法·面试
@insist1233 小时前
网络工程师-生成树协议(STP/RSTP/MSTP)核心原理与应用
服务器·开发语言·网络工程师·软考·软件水平考试
野生技术架构师4 小时前
2026年牛客网最新Java面试题总结
java·开发语言
环黄金线HHJX.4 小时前
Tuan符号系统重塑智能开发
开发语言·人工智能·算法·编辑器
dog2504 小时前
对数的大脑应对指数的世界
开发语言·php
Mr_Xuhhh4 小时前
深入理解Java抽象类与接口:从概念到实战
java·开发语言
小手指动起来4 小时前
保姆级提示词工程学习总结(含实操示例+工具推荐)
人工智能·学习·自然语言处理
萝卜白菜。4 小时前
TongWeb7.0相同的类指明加载顺序
开发语言·python·pycharm