#define GPIO_MODE_INPUT 0x00000000U /*!< Input Floating Mode */
#define GPIO_MODE_OUTPUT_PP 0x00000001U /*!< Output Push Pull Mode */
#define GPIO_MODE_OUTPUT_OD 0x00000011U /*!< Output Open Drain Mode */
#define GPIO_MODE_AF_PP 0x00000002U /*!< Alternate Function Push Pull Mode */
#define GPIO_MODE_AF_OD 0x00000012U /*!< Alternate Function Open Drain Mode */
#define GPIO_MODE_ANALOG 0x00000003U /*!< Analog Mode */
#define GPIO_MODE_IT_RISING 0x10110000U /*!< External Interrupt Mode with Rising edge trigger detection */
#define GPIO_MODE_IT_FALLING 0x10210000U /*!< External Interrupt Mode with Falling edge trigger detection */
#define GPIO_MODE_IT_RISING_FALLING 0x10310000U /*!< External Interrupt Mode with Rising/Falling edge trigger detection */
#define GPIO_MODE_EVT_RISING 0x10120000U /*!< External Event Mode with Rising edge trigger detection */
#define GPIO_MODE_EVT_FALLING 0x10220000U /*!< External Event Mode with Falling edge trigger detection */
#define GPIO_MODE_EVT_RISING_FALLING 0x10320000U /*!< External Event Mode with Rising/Falling edge trigger detection */
这些 GPIO_MODE_XXX 宏定义是 STM32 HAL 库中用于配置 GPIO 引脚工作模式的常量。
理解它们的关键在于:引脚的功能需求 + 电气特性 + 是否需要中断/事件触发。
下面我将逐一解释每种模式的含义、适用场景以及选择建议,并附上典型应用示例。
🔧 一、基本输入/输出模式(无中断)
- GPIO_MODE_INPUT ------ 浮空输入(Floating Input)
- 电气特性:引脚内部既不上拉也不下拉,高阻态。
- 用途:
- 接外部信号源(如按键已外接上拉电阻)
- 接数字传感器输出(如某些模块自带上拉)
- ⚠️ 注意:若无外部上拉/下拉,引脚电平"悬空",读取结果不确定!
- ✅ 何时用:外部电路已提供确定电平(如开关接地+外接上拉)。
📌 示例:按键一端接 GND,另一端接 GPIO,外部有 10kΩ 上拉 → 用此模式。
- GPIO_MODE_OUTPUT_PP ------ 推挽输出(Push-Pull Output)
- 电气特性:
- 输出高电平时,内部 MOS 管导通到 VDD(≈3.3V)
- 输出低电平时,导通到 GND(≈0V)
- 驱动能力强,可直接驱动 LED、继电器等。
- 用途:
- 控制 LED、蜂鸣器、数码管
- 与 TTL/CMOS 逻辑电平设备通信(如另一个 MCU)
- ✅ 何时用:需要主动输出高/低电平,且负载电流在芯片允许范围内(通常 ≤25mA/引脚)。
📌 示例:LED 阳极接 3.3V,阴极接 GPIO → GPIO 输出低点亮 → 用 PP 模式。
- GPIO_MODE_OUTPUT_OD ------ 开漏输出(Open-Drain Output)
- 电气特性:
- 只能主动拉低(输出 0),不能主动输出高(需外部上拉电阻)
- 输出高时为高阻态,靠外部上拉电阻拉至高电平
- 优势:
- 支持"线与"逻辑(多个开漏引脚可并联)
- 可兼容不同电压系统(如 3.3V MCU 控制 5V 设备)
- 用途:
- I²C 总线(SCL/SDA 必须开漏 + 上拉)
- 多设备共享信号线(如中断请求线)
- ✅ 何时用:需要电平兼容、总线结构、或"任意设备可拉低"的场景。
📌 示例:I²C 引脚必须配置为 OD + 外部 4.7kΩ 上拉到 VCC。
- GPIO_MODE_ANALOG ------ 模拟输入模式
- 电气特性:关闭数字输入缓冲器,连接到 ADC 或 DAC。
- 用途:
- 连接模拟信号(如温度传感器、电位器)
- 使用 ADC 采集电压
- 使用 DAC 输出模拟电压(部分引脚支持)
- ✅ 何时用:引脚用于 ADC/DAC 功能时必须设为此模式!
⚠️ 若用于 ADC 但未设为 ANALOG,可能引入噪声或功耗增加。
⚙️ 二、复用功能模式(Alternate Function, AF)
STM32 的很多外设(USART、SPI、I2C、TIM 等)可复用到特定 GPIO 引脚。
- GPIO_MODE_AF_PP ------ 复用推挽输出
- 用途:
- USART_TX(需要主动驱动高低电平)
- SPI_SCK / SPI_MOSI
- TIM_CHx(PWM 输出)
- ✅ 何时用:外设需要强驱动能力输出信号时。
📌 示例:USART 发送引脚(TX)→ AF_PP
- GPIO_MODE_AF_OD ------ 复用开漏输出
- 用途:
- I²C 的 SCL/SDA(标准要求开漏)
- CAN_TX(某些情况下)
- ✅ 何时用:外设协议要求开漏结构(主要是 I²C)。
📌 示例:I2C1_SCL → AF_OD + 外部上拉
💡 注意:使用 AF 模式时,还需调用 HAL_GPIO_Init() 设置 Alternate 字段(如 GPIO_AF4_I2C1)。
⚡ 三、外部中断/事件模式(EXTI 相关)
这些模式会自动将 GPIO 映射到 EXTI 线,并配置触发方式。
7~9. 中断模式(Interrupt)
- GPIO_MODE_IT_RISING:上升沿触发中断
- GPIO_MODE_IT_FALLING:下降沿触发中断
- GPIO_MODE_IT_RISING_FALLING:双边沿触发
✅ 何时用:需要在引脚电平变化时唤醒 CPU 或执行 ISR
📌 典型应用:按键检测、外部传感器触发、编码器脉冲计数
⚠️ 注意:
- 内部自动启用上拉/下拉?不会! 仍需手动配置 Pull(如 GPIO_PULLUP)
- 实际是配置了 EXTI + NVIC,ISR 函数如 EXTI0_IRQHandler()
10~12. 事件模式(Event)
- GPIO_MODE_EVT_XXX:类似中断,但不触发 CPU 中断,而是产生一个"事件脉冲"
- 用途:
- 触发 DMA 请求
- 触发其他外设动作(如启动 ADC 转换)
- 低功耗唤醒(但不进 ISR)
- ✅ 何时用:需要硬件自动响应,无需软件干预
📌 示例:外部信号到来 → 自动触发 ADC 采样(通过 EXTI → ADC start)
✅ 选择指南:一张表快速决策
应用场景 推荐模式 补充说明
按键(外接上拉) GPIO_MODE_INPUT + PULLUP 或直接用 IT_FALLING
按键(需中断) GPIO_MODE_IT_FALLING 内部可配上下拉
控制 LED GPIO_MODE_OUTPUT_PP 电流别超限
I²C 通信 GPIO_MODE_AF_OD 必须外接上拉电阻
USART_TX GPIO_MODE_AF_PP
ADC 采样 GPIO_MODE_ANALOG 必须!
PWM 输出 GPIO_MODE_AF_PP 如 TIM_CH1
多设备共享中断线 GPIO_MODE_OUTPUT_OD "线与"结构
外部触发 ADC GPIO_MODE_EVT_RISING 硬件自动启动
🔍 补充说明
-
上拉/下拉配置是独立的
无论哪种模式(除 ANALOG),都可通过 GPIO_InitStruct.Pull 设置:
- GPIO_NOPULL
- GPIO_PULLUP
- GPIO_PULLDOWN
-
速度(Speed)设置影响驱动能力
输出模式下,可选 2MHz / 50MHz / 100MHz,高速用于高频信号(如 SPI)。
-
不要混淆"事件"和"中断"
- 中断 → CPU 执行 ISR
- 事件 → 硬件信号脉冲,用于触发其他外设
总结
- 输入:用 INPUT(注意悬空问题)
- 输出:一般用 PP,总线/电平兼容用 OD
- 外设:查手册选 AF_PP 或 AF_OD
- ADC:必须 ANALOG
- 按键/触发:用 IT_xxx 模式最方便
- 自动触发硬件:考虑 EVT_xxx