GPIO详解:不仅仅是输入输出那么简单
"别小看一个小小的引脚,它可是 MCU 世界的社交之门。"
👋 先打个招呼:什么是 GPIO?
GPIO,全称是 General Purpose Input/Output ------ 通用输入输出口。
简单说,它就像 MCU 身上的"手指":
输入模式:它能感知外部世界(比如按键按下)
输出模式:它能控制外部设备(比如点亮LED)
别以为它只是通电/断电!
GPIO 的"本领"比你想象的多很多!
🧠 GPIO 的核心概念梳理
概念
通俗解释
输入模式
"耳朵"------用来接收信号
输出模式
"手"------用来发出信号
上拉/下拉
默认信号状态,不悬空就靠它
推挽输出
能输出高电平也能输出低电平
开漏输出
只能拉低,靠外部上拉输出高
复用功能
"兼职"的引脚,比如串口、I2C、PWM等
中断功能
引脚也能"打断"主程序,成为中断源
速度设置
并不是说跑步,而是电气变化的快慢(驱动能力)
⚡ 输入模式:不是你以为的那么简单
c
复制代码
GPIO_MODE_INPUT
输入模式一般配合 上拉 或 下拉 使用:
场景
原因
内部上拉
防止引脚悬空漂移,默认为高电平
内部下拉
保持引脚为低电平,适合低有效按键
无上拉下拉
用外部电路控制,或用于模拟输入
举个例子:你用按键接 GND,那就要设置为"输入 + 上拉",按下时变低电平。
💡 输出模式:推挽 vs 开漏
🚀 推挽输出(GPIO_MODE_OUTPUT_PP)
能把引脚拉高也能拉低,适合控制 LED、继电器等。
c
复制代码
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 输出高
🌪 开漏输出(GPIO_MODE_OUTPUT_OD)
只能拉低,拉高需要靠外部上拉电阻。
适合做I2C总线、多个设备共用一根线的场景。
🧬 复用模式:GPIO 的"分身术"
你定义的是 GPIO,其实它暗地里还兼职着:
USART_TX/RX(串口通信)
I2C_SCL/SDA(I2C 通信)
PWM 输出
ADC 输入
外部中断 EXTI
这就需要设置为 GPIO_MODE_AF_xx 模式(AF = Alternate Function)
👉 一个引脚,多种身份,选谁就看配置!
⏱️ GPIO的输出速度有啥用?
STM32等平台经常让你选:
GPIO_SPEED_FREQ_LOW
GPIO_SPEED_FREQ_MEDIUM
GPIO_SPEED_FREQ_HIGH
这并不是 MCU 执行速度,而是 引脚电气输出的上升/下降沿速度。
太快:可能引起信号串扰、干扰(尤其在长线上)
太慢:可能带不动外设,波形变形
推荐做法:
用途
推荐速度
普通LED
Low
SPI/I2C/PWM
Medium or High
驱动高速信号/屏幕
High
🔧 中断功能:GPIO也能做触发器!
某些 GPIO 支持外部中断,比如 STM32 的 EXTI(External Interrupt)。
配置为:
c
复制代码
GPIO_MODE_IT_FALLING // 下降沿触发
GPIO_MODE_IT_RISING // 上升沿触发
GPIO_MODE_IT_RISING_FALLING // 双边触发
然后写 ISR(中断服务函数)即可对按钮、电平变化做出及时响应!
📦 特殊功能小结(不同MCU略有不同)
特性
说明
锁定 GPIO
防止误改配置(STM32 有 GPIOx_LCKR)
上电默认态
GPIO 默认可能是浮空,要谨慎使用
电流驱动能力
有的 GPIO 可驱动几十 mA,有的却只能带小负载
复用限制
某些 GPIO 只能用于特定功能,不可乱配(查看芯片手册)
🧪 实战小练习建议
练习项目
技能点
点亮一个LED
推挽输出
按下按钮点亮灯
输入 + 中断
软件控制蜂鸣器
输出控制、PWM复用
用一根线控制多个设备
开漏输出 + 上拉
软件模拟串口
开漏 + 中断 + 复用
🧠 一句话总结
"GPIO,是MCU和世界沟通的最小单元,掌握它,你才能真正掌握嵌入式的'肌肉'。"