GPIO 引脚复用 PinMux:alt 功能、电气属性寄存器与 pad 配置顺序
更新时间:2026-09-19。前置:GPIO 去抖/同步/中断。本文讲同一物理 pad 如何在数字功能间复用,以及 pad ring 的电气属性配置。
本文要回答的问题
- 一个物理引脚是怎么在 GPIO/UART/SPI 等多个功能间切换的?
- 除了选功能,还要配哪些电气属性(上下拉、驱动强度、开漏、压摆率)?
- 模拟引脚、开漏 I2C、高速 SPI 在 pad 配置上有何不同?
- 上电默认态和配置顺序为什么会导致启动期毛刺/冲突?
一、复用结构:pad 到功能的多路选择
bash
┌────────────── PinMux MUX(function select)──────────────┐
pad ◄────► │ out: GPIO_out / UART_TX / SPI_MOSI / PWM ... ──► OE ──►│ pad driver
│ in: pad_in ──► 同步/施密特 ──► GPIO_in / UART_RX ... │
└──────────────────────────────────────────────────────────┘
+ 电气属性:pull up/down、keeper、drive、slew、open-drain每个 pad 有一个 function select(mux mode)寄存器字段,选 alt0(GPIO)/alt1(UART)/alt2(SPI)...;输出端再由选中功能的 **OE(输出使能)**决定方向。输入侧往往同时送给所有功能(由各模块自己使不使用)。冲突通常发生在两个外设被 mux 到同一 pad——SoC 的 mux 表(datasheet 的 ball multiplexing 表)是唯一权威。
二、pad 电气属性寄存器
| 属性 | 作用 | 典型设置 |
|---|---|---|
| Pull up / pull down | 默认电平静态偏置 | I2C 上拉(也常板级)、按键下拉、未用脚防悬空 |
| Bus keeper / bus hold | 弱保持最后电平 | 省静态电流、防浮空 |
| Drive strength | 输出驱动电流档(2/4/8/12mA) | 高速/重容负载加大 |
| Slew rate control | 边沿快慢 | 高速 SPI 快沿;EMI 敏感放慢 |
| Open drain | 只拉低不拉高 | I2C/共享线必开 |
| Schmitt trigger | 输入迟滞抗噪 | 慢沿/数字输入开 |
| Input sync / bypass | 输入是否经两级同步 | 异步复位/高速可 bypass,常规同步 |
| Analog enable | 数字缓冲断开、接 ADC | 模拟脚必须断数字输入输出 |
三、配置顺序(避免毛刺/冲突)
把一个 pad 从默认 GPIO 改成外设功能时,推荐顺序:
- 先配电气属性(上下拉、驱动、开断、施密特)——在还没驱动外部时确定静态态。
- 再设 mux function 到目标 alt——避免功能输出已连但 OE/属性未定。
- 最后由外设/方向寄存器使能输出 OE。
反过来或先开 OE,可能在切换瞬间输出短暂错误电平(如 SPI 片选毛刺、I2C 被强推高)。启动阶段 pad 有上电默认(常高阻 + 保持/弱下拉),BootROM 已占用的 UART/Flash 引脚不能被早期固件误改。
四、典型外设 pad 要求
- I2C(开漏):open-drain 使能、禁内部强上拉(靠外部)或使能弱上拉、施密特输入、标准驱动。
- SPI/QSPI(高速):推挽、较大 drive、快 slew、按需要的内部延迟;四线 Quad 的 IO2/IO3 别被默认功能(WP/HOLD)和上拉锁死(见 SPI NOR XIP)。
- UART RX:输入同步 + 适当上拉/keeper,防空闲噪声误触发。
- ADC/模拟:断开数字输入与上下拉,否则漏电、读数被钳。
- GPIO 中断/去抖:见 GPIO 设计,先同步再边沿检测。
五、常见的坑
- 两个外设 mux 到同一 pad:datasheet mux 表没核,功能互相抢,一个不通。
- 只选 function 不配 OE/方向:外设有输出但 pad 仍高阻输入,看着寄存器对、引脚无波形。
- I2C 忘开 open-drain:推挽输出在线与上拉/其他主冲突,可能损坏。
- 上拉/下拉同时使能:或与板级电阻打架,产生分压、漏电。
- 模拟脚没断数字缓冲:数字输入导通漏电、ADC 读数跳。
- 配置顺序错先开 OE:切换瞬间片选/复位误动作。
- 休眠/唤醒脚没设保持:进低功耗后 pad 变高阻,从机片选悬空误动作;需 keeper 或唤醒专用配置。
- 驱动强度/压摆率不当:太弱高速沿坍塌 CRC 错;太强过冲/EMI。
- 改了 BootROM 占用脚:早期重配 UART/QSPI pad 导致下载/启动失联。
- 输入未同步进数字域:慢沿直接进触发器,亚稳/抖动误中断(见 CDC)。
- 只改 mux 不改 pad group/电压域:部分 SoC pad 组供电(VCCIO)是 1.8/3.3 可选,电压不匹配不收。
相关与延伸
GPIO 逻辑见 GPIO 去抖同步;开漏见 I2C 主机;启动占用脚见 SPI NOR XIP;低功耗保持见 低功耗模式。
总结
PinMux 是用 function-select 字段把同一 pad 的输出/输入在 GPIO 与各 alt 外设间多路切换,但选功能只是第一步,还要同时配好 OE、上下拉/keeper、驱动强度、压摆率、open-drain、施密特与同步、模拟断缓冲等电气属性,并按「先电气属性→再 mux→最后使能 OE」的顺序配置以防切换毛刺;I2C 必开漏、模拟脚必断数字缓冲、Quad SPI 注意 IO2/IO3、BootROM 占用脚不可早改——复用冲突、忘 OE、漏开漏和休眠不保持是四大坑。