RP2040 GPIO 全解:分组、功能选择、电气特性、中断触发,全是开发干货
GPIO 接口和外设
RP2040 具有 36 个多功能通用输入/输出引脚,分为两组:
QSPI 组:共 6 个引脚 QSPI_SS、QSPI_SCLK 和 QSPI_SD0 到 QSPI_SD3(负责连外部 Flash,平时是 “专用插座”,用来读 Flash 里的程序);
**用户组(GPIO0~GPIO29)**:这是我们编程常用的 “通用插座”,能接各种设备。其中 GPIO26~29 还额外支持 “模拟输入”(能接温度传感器、电位器这类输出模拟信号的设备)。
每个 GPIO 都可以由处理器上运行的软件或许多其他功能块直接控制。
1.功能选择
一个示例 IO 的逻辑结构如图所示:
图 2.40 RP2040 芯片 GPIO 功能选择逻辑架构图:左边的 PIO、SPI 等模块通过 “功能选择器” 选一个,经信号反转 / 强制逻辑后,要么输出信号到引脚,要么接收引脚输入,还能触发中断。
其中,每个 GPIO 都可以由多个外设中的一个来控制(即每个 GPIO 引脚都能切换成不同的功能),或者由 SIO 中的软件控制寄存器来控制:
- 你可以通过 “FUNCSEL” 这个 “功能开关”(写 GPIO 的 CTRL 寄存器),选择当前引脚要当什么用(比如把 GPIO0 设为 SPI0 的接收引脚);
- 引脚的信号还能 “反转”(比如原本输出高电平,反转后变成低电平),或者强制设为固定的高低电平;
- 注意:一个引脚同时只能选一个功能,一个外设(比如 UART0 的接收)也只能连一个引脚 —— 像 “一个插座同时只能插一个电器,一个电器也只能插一个插座”。
分配给每个 GPIO 的函数是通过写入 GPIO 的 CTRL 寄存器中的 FUNCSEL 字段来选择的。以 GPIO0_CTRL 为例,每个 IO 上的可用功能见下表:
图 2.41 RP2040 芯片 GPIO 功能复用控制图(0-20)
图 2.42 RP2040 芯片 GPIO 功能复用控制图(21-29)
每个 GPIO 都可以同时选择一个函数。同样地,每个外设输入(例如 UART0 RX)一次只能在一个 GPIO 上进行选择。如果相同的外设输入连接到多个 GPIO,则外设输入将看到这些 GPIO 输入的逻辑 OR。
GPIO bank 的功能说明如下:
图 2.43 GPIO bank 功能图
通用输入/输出(GPIO)QSPI bank 功能说明如下:
图 2.44 QSPI 接口引脚功能映射表(SCK、CSn、SD0)
图 2.45 QSPI 接口引脚功能映射表(SD1、SD2、SD3)
这是 RP2040 的 QSPI 组引脚功能选项表,展示了 QSPI_SCK、QSPI_CSn、QSPI_SD0~SD3 这 6 个引脚的可用功能:每个引脚默认对应 “XIP” 功能(用于连接外部 Flash,实现从 Flash 直接执行程序),同时都支持 “SIO” 功能,可切换为软件控制的普通 GPIO 使用。
GPIO QSPI bank 功能说明如下:
图 2.46 GPIO QSPI bank 功能配置图:“XIP” 是连接外部 Flash 的同步串行接口,让芯片能直接从 SPI / 双 SPI/Quad-SPI Flash 中执行程序;“SIO” 是软件控制 GPIO 的功能,选择该功能后,可通过专门的寄存器控制这些引脚,且能随时读取引脚的状态。
六个 QSPI Bank GPIO 引脚通常被 XIP 外设用于与外部闪存设备通信。然而,有两种情况下,这些引脚可以用作软件控制的 GPIO:
- 如果外部 Flash 用的是 “SPI / 双 SPI” 模式,其中 SD2、SD3 引脚用不上,能当普通 GPIO;
- 如果芯片不用 Flash(只靠 USB 启动),这 6 个引脚都能当普通 GPIO 用。
2.中断
GPIO 外部中断可被配置为如下四种类型,并且中断类型可以被随时修改:
图 2.47 GPIO 中断与 Pad 结构说明
3.Pads
每个 GPIO 都通过一个“Pads”连接到片外世界。Pads 是芯片内部逻辑和外部电路之间的电气接口。它们转换信号电压电平,支持更高的电流,并提供一些静电放电 (ESD) 事件保护。
图 2.48 GPIO Pad 电气特性与结构框图
Pads 的电气特性可以调整,以满足外部电路。可进行以下调整:
- 驱动强度:调整引脚能输出的电流(比如接亮 LED 要 8mA,接敏感传感器只用 2mA);
- 压摆率:调整引脚信号变化的快慢(接高速设备用 “快速”,接低速设备用 “慢速” 更稳定);
- 上拉 / 下拉:引脚没接设备时,自动保持高电平或低电平(避免引脚 “乱飘” 导致设备误触发);
- 施密特触发:让输入信号更 “抗干扰”(比如外部信号有点波动,也能稳定识别成高 / 低电平);
- 关闭输入缓冲:引脚不用时关掉 “信号接收”,能省电。
用户 bank IO 寄存器的基址为 0x40014000:
图 2.49 GPIO 寄存器地址映射表(GPIO0 至 GPIO14)
图 2.50 GPIO 寄存器地址映射表(GPIO15 至 GPIO24)
图 2.51 中断控制器寄存器映射表(PROC0 与 PROC1 中断相关)
图 2.52 GPIO 寄存器地址映射表(PROC0 与 PROC1 中断相关)
图 2.53 中断控制器寄存器映射表(PROC1 与 DORMANT_WAKE 中断相关)
