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

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

相关推荐
玉小格2 分钟前
对py作业的一个复盘
开发语言·python
Rust研习社3 分钟前
使用 Tonic 构建高性能异步 gRPC 服务
开发语言·网络·后端·http·rust
wearegogog1233 分钟前
基于STM32的酒精检测仪设计
stm32·单片机·嵌入式硬件
m0_377108145 分钟前
PCB学习
学习
captain3765 分钟前
JDBC(Java Data Base Connectivity)
java·开发语言
U盘失踪了6 分钟前
Python 的 urljoin:告别手动拼接 URL 的烦恼
笔记·学习
南境十里·墨染春水12 分钟前
C++笔记 STL——vector
开发语言·c++·笔记
思麟呀14 分钟前
Epoll的学习,在select和poll的基础上
网络·数据库·sql·学习·tcp/ip
Deitymoon32 分钟前
STM32——led灯点亮
stm32·单片机·嵌入式硬件
Jack_022033 分钟前
基于51单片机的双路倒车雷达测距报警系统设计_LCD1602显示+超声波
单片机·51单片机·雷达·超声波·倒车·lcd1602显示