GPIO详解:不仅仅是输入输出那么简单

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和世界沟通的最小单元,掌握它,你才能真正掌握嵌入式的'肌肉'。"