
HAL 库中每个 GPIO 模式宏的本质把 MODER、OTYPER、PUPDR 等多个寄存器的配置打包进一个 32 位值。一、驱动模式 — 决定引脚方向MODER 寄存器宏MODER用途GPIO_MODE_INPUT00输入读按键、读电平GPIO_MODE_OUTPUT_PP01输出点 LED、控制 MOS 管GPIO_MODE_OUTPUT_OD01输出I2C、开漏总线、电平转换GPIO_MODE_AF_PP10复用UART TX、SPI、PWMGPIO_MODE_AF_OD10复用I2C (复用方式)GPIO_MODE_AF_INPUT00输入UART RX、TIM 输入捕获等同 INPUTGPIO_MODE_ANALOG11模拟ADC / DACGPIO_MODE_IT_*00输入 中断按键中断、外部信号触发 ISRGPIO_MODE_EVT_*00输入 事件DMA/ADC/TIM 硬件自动触发不惊动 CPU二、输出类型 — 只在输出/AF 模式有效OTYPER 寄存器类型宏特征能主动输出高能主动输出低典型场景推挽 Push-Pull*_PP✅✅LED、MOS 栅极、普通 IO开漏 Open-Drain*_OD❌ 靠外部上拉✅I2C、1-Wire、多设备共享总线电平转换原理开漏输出 外部上拉到 5V → 引脚可在 3.3V MCU 上输出 5V 逻辑电平。三、上下拉 — 让悬空引脚电平确定PUPDR 寄存器宏效果GPIO_NOPULL内部无上下拉电平完全由外部电路决定GPIO_PULLUP内部弱上拉默认高电平GPIO_PULLDOWN内部弱下拉默认低电平选择决策树外部有上下拉电阻 ├─ 有 → NOPULL外部已搞定 └─ 没有 ├─ 输入模式 │ ├─ 待机时应读到高 → PULLUP │ ├─ 待机时应读到低 → PULLDOWN │ └─ 模拟输入ADC/DAC→ NOPULL └─ 输出/开漏模式 └─ 一般 NOPULL输出驱动能镇住 例外开漏输出且外部没上拉 → PULLUP常见场景场景选择原因按键接 GND按下低PULLUP松开时读到确定的高按键接 VCC按下高PULLDOWN松开时读到确定的低I2C 总线PULLUP或外部上拉电阻 NOPULL开漏总线空闲保持高UART RXPULLUP无数据时避免误触发MOS 管栅极PULLDOWN上电浮空→误导通→烧毁默认关断使能脚 (EN 高有效)PULLDOWN默认不使能使能脚 (EN 低有效)PULLUP默认不使能已有外部上下拉电阻NOPULL外部已确定电平四、中断 IT vs 事件 EVT — 最关键的区别IT (INTERRUPT)EVT (EVENT)响应方式产生 IRQ → NVIC → CPU 跳转 ISR发脉冲给外设不经过 CPUCPU 参与是执行中断服务函数否CPU 完全不知道能唤醒低功耗模式✅❌触发源同一个 EXTI 线路同一个 EXTI 线路触发边沿宏触发边沿*_RISING上升沿*_FALLING下降沿*_RISING_FALLING任意边沿典型用途场景用 IT 还是 EVT按键检测 → ISR 处理IT_FALLING外部信号唤醒 STOP 模式IT_RISING定时器外部触发脚 → 自动启动 ADCEVT_RISING引脚边沿 → 自动触发 DMA 搬运EVT_*脉冲计数但不需要 CPU 实时响应EVT_*五、速查我要做什么需求配置读按键接 GNDMODE_INPUTPULLUP按键中断接 GND按下触发 ISRMODE_IT_FALLINGPULLUP点 LEDMODE_OUTPUT_PPNOPULL控制 MOS 管低电平导通型MODE_OUTPUT_PPNOPULL控制 MOS 管默认不能导通MODE_OUTPUT_PPPULLDOWNI2C SDA/SCLMODE_AF_ODPULLUPUART TXMODE_AF_PPNOPULLUART RXMODE_AF_INPUTPULLUPSPI SCK/MOSIMODE_AF_PPNOPULLSPI MISOMODE_AF_INPUTNOPULLADC 输入MODE_ANALOGNOPULLPWM 输出MODE_AF_PPNOPULL编码器/Hall 传感器开漏输出型MODE_INPUTPULLUP硬件自动触发 ADC/DMA不惊动 CPUMODE_EVT_*六、为什么一个宏值能编码这么多信息以GPIO_MODE_IT_FALLING 0x10210000为例0x 1 0 2 1 0 0 0 0 │ │ │ │ │ └─ bit[19:16] 0x1 → EXTI 中断模式 │ └─ bit[5] 0 → 速度 (SPEEDR) └─ bit[0] 0 → MODER 输入HAL 的HAL_GPIO_Init()内部会把宏值拆解写到对应的 MODER、OTYPER、PUPDR、SPEEDR 等寄存器一个宏一步配置完成。