RIOT OS 在 Raspberry Pi Pico(RP2040)上的板级支持:硬件特性、烧录方式与调试实战
【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT
Raspberry Pi Pico 是树莓派基金会推出的低成本(约 4 美元)微控制器开发板,搭载自研的双核 ARM Cortex-M0+ 芯片 RP2040。本文以 RIOT 仓库中的 boards/rpi-pico/doc.md 为主线,结合 板级配置、构建系统文件 与 CPU 底层实现,完整讲解这块板卡在 RIOT 中的硬件资源映射、三种烧录方式(UF2 引导、OpenOCD、J-Link)、shell 串口访问、片上调试流程以及当前实现阶段的已知限制,帮助你直接用BOARD=rpi-pico跑通 RIOT 应用。
板卡与 MCU 概览
Raspberry Pi Pico 之所以在 RIOT 中被单列为一块板卡,核心原因在于其主控 RP2040 的独特性:这是一颗双核 ARM Cortex-M0+芯片,主频最高 133 MHz,配备 264 KiB RAM,并且内部没有 Flash——程序存储在外部 QSPI Flash 中,通过SSI/QSPI 外设支持 XIP(Execute In Place,从 Flash 直接取指执行)。此外 RP2040 还提供了 RIOT 与社区都颇为关注的Programmable IO(PIO)可编程 IO 外设,boards/rpi-pico/doc.md 将其与 XIP 并列为 MCU 最具区分度的两大特性。
板卡在 RIOT 中的位置由 boards/rpi-pico/Kconfig 定义:BOARD_RPI_PICO默认选中CPU_MODEL_RP2040,并映射到rpi-pico板名;boards/rpi-pico/Makefile.include 中进一步声明CPU_MODEL := RP2040,Linux 下默认串口端口为/dev/ttyUSB0。
核心硬件参数
以下表格完整摘录自板级文档,并可与 RP2040 数据手册 对应:
| 项目 | 参数 |
|---|---|
| MCU | RP2040 |
| 内核 | 2× ARM Cortex-M0+ |
| 厂商 | Raspberry Pi |
| RAM | 264 KiB |
| Flash | 2 MiB(板上,最大支持 16 MiB) |
| 频率 | 最高 133 MHz |
| FPU | 无 |
| PIO | 8 个状态机 |
| 定时器 | 1 × 64-bit |
| ADC | 1 × 12-bit(4 通道 + 温度传感器) |
| UART | 2 |
| SPI | 2 |
| I2C | 2 |
| RTC | 1 |
| USB | 1(USB 2.0) |
| 看门狗 | 1 |
| SSI/QSPI | 1(连接 Flash,支持 XIP) |
| 供电 | 1.62V – 3.63V |
需要特别注意的是FPU 为无、以及Flash 完全依赖外部 QSPI这两点:前者意味着浮点运算依赖软件实现,后者意味着所有固件的存放与启动都绕不开 XIP 与烧录环节。
RIOT 中已提供的外设能力
板级文档以"早期实现"定性当前状态,但从仓库的构建元数据看,已有相当数量的外设被声明为可用。boards/rpi-pico/Makefile.features 按字母序声明了以下FEATURES_PROVIDED:
periph_adcperiph_i2cperiph_spiperiph_pwmperiph_timerperiph_uart
这些声明与 boards/rpi-pico/include/periph_conf.h 中的具体引脚映射一一对应,下面按外设逐一展开。
UART:默认调试与控制台通道
periph_conf.h注册了两路 UART:
| 设备 | TX | RX | 中断 |
|---|---|---|---|
| UART0 | GPIO0(物理引脚 1) | GPIO1(物理引脚 2) | UART0_IRQ_IRQn |
| UART1 | GPIO8(物理引脚 8) | GPIO9(物理引脚 9) | UART1_IRQ_IRQn |
其中UART0 即为板级默认的 RIOT shell 通道(下文详述)。中断服务函数通过UART_0_ISR/UART_1_ISR宏分别绑定到isr_uart0/isr_uart1。
SPI:两路标准 SPI
| 设备 | MISO | MOSI | CLK |
|---|---|---|---|
| SPI0 | GPIO4 | GPIO3 | GPIO2 |
| SPI1 | GPIO12 | GPIO11 | GPIO10 |
定时器:一个 64 位定时器的 4 个通道
timer_config中注册了单个TIMER设备,包含 4 个通道,分别使用TIMER_IRQ_0_IRQn至TIMER_IRQ_3_IRQn,对应的 ISR 宏依次为isr_timer0…isr_timer3。这对应文档参数表中的 "1 × 64-bit Timers"。
ADC:3 个外部通道
adc_config注册了 3 个外部 ADC 通道:
| 引脚 | 通道 |
|---|---|
| GPIO26 | 0 |
| GPIO27 | 1 |
| GPIO28 | 2 |
第 4 个通道(温度传感器)由 RP2040 硬件提供,未在板级数组中注册。
PWM:板载 LED 复用
pwm_config使用pwm_slice = 4,其通道 1 直接映射到GPIO25(板载 LED),通道 0 为未定义引脚。这意味着你可以直接通过 PWM 驱动板载 LED 实现呼吸灯等效果,而无需外接器件。
I2C:通过 PIO 实现
板级文档明确说明I2C 外设是通过 PIO 实现的,这一点在源码中得到双重印证:
- boards/rpi-pico/include/periph_conf.h 中
I2C_NUMOF被定义为 0(通过_periph_numof_is_unsigned_0()辅助函数),并声明:只要在构建时定义PIO_I2C_CONFIG,就会生成pio_i2c_config[]数组(含pio、sda、scl、irq字段); - drivers/include/periph/pio/i2c.h 提供了
pio_i2c_get()、pio_i2c_numof()、pio_i2c_init_program()等接口,将 I2C 总线用 PIO 状态机模拟,并用互斥锁保护总线并发访问——该接口目前标注为experimental(实验性 API,可能变动); - cpu/rpx0xx/periph/i2c.c 目前是一个"dummy 实现,仅用于测试 PIO I2C 接口",当启用
MODULE_PIO_I2C且dev >= I2C_NUMOF时,会把 PIO 配置实例化出来。
PIO 的板级配置在periph_conf.h中注册了两个实例(PIO0 / PIO1),各自带有两组 IRQ(PIO0_IRQ_0_IRQn、PIO0_IRQ_1_IRQn等),对应文档参数表中的 "8 PIOs"。
用户接口:1 个按键 + 1 个 LED
板卡提供 1 个按键(兼作启动模式选择)和 1 个 LED:
| 设备 | 引脚 |
|---|---|
| LED0 | GPIO25 |
| SW0 | QSPI_SS_N(*) |
关于 SW0,文档特别说明:由于该按键直接连接 QSPI 接口的片选引脚(即 RIOT 通过 XIP 运行的 Flash 芯片的片选),软件难以稳定读取其状态,当前不支持从软件读取该按键。
LED 的驱动定义位于 boards/rpi-pico/include/board.h:LED0_PIN为GPIO_PIN(0, 25),并通过 SIO 寄存器位操作实现:
LED0_ON:SIO->GPIO_OUT_SET = 1UL << 25LED0_OFF:SIO->GPIO_OUT_CLR = 1UL << 25LED0_TOGGLE:SIO->GPIO_OUT_XOR = 1UL << 25
这种直接写 SIO 寄存器的方式比通用 GPIO 驱动更轻量。此外,boards/rpi-pico/Makefile.dep 表明:当启用saul_default模块时,板卡会自动追加saul_gpio,把 LED 注册为 SAUL 设备(见 gpio_params.h 中名为"LED(Green)"的 GPIO 输出条目),方便通过统一传感器/执行器抽象直接控制板载 LED。
烧录固件的三种方式
由于 RP2040 没有内部 Flash,烧录流程是使用本板卡的第一道关卡。RIOT 支持三种烧录方式,均通过make flash触发。
方式一:UF2 引导程序(默认,picotool PROGRAMMER)
按住板卡丝印标注的BOOTSEL按键插入 Micro-USB 线,Pico 会以"可移动存储设备"的形式出现在系统中,把 UF2 格式的固件文件拷贝进去即可完成烧录。在 RIOT 中这一过程已被自动化:
BOARD=rpi-pico make flash这是默认烧录方式,底层使用picotool作为 PROGRAMMER。
方式二:OpenOCD(软硬件两种适配器)
文档(截至 2026 年 5 月)指出,OpenOCD 调试路径目前仅支持两种适配器:
- 低层 bit-banging 适配器:例如通过树莓派 4B 的 GPIO 直接引出调试线;
- 虚拟 CMSIS-DAP 适配器:由 Pico 的第二个 CPU 内核通过 pico-debug 提供。
方式二不需要额外硬件,但需要先用 UF2 引导程序把 pico-debug 的gimme-cache 变体烧入 RAM:按住 BOOTSEL 插入 USB,将pico-debug-gimmecache.uf2(来自 pico-debug 最新 release)拷贝到引导程序提供的虚拟 FAT 磁盘;卸载该磁盘后,Pico 会以 CMSIS-DAP 调试器形态出现。随后执行:
BOARD=rpi-pico PROGRAMMER=openocd make flash两点重要提醒(文档原文强调):
rpi-pico虚拟调试器不持久,每次冷启动后都需要重新"烧"入 RAM;- RP2040 自 OpenOCD 0.12.0 起才被支持,请确认你的 OpenOCD 版本不低于此。
方式三:J-Link
将板卡连接 Segger J-Link 调试器(文档举例 EDU mini 相对便宜,但仅限教育用途),然后运行:
BOARD=rpi-pico PROGRAMMER=jlink make flash对应地,boards/rpi-pico/Makefile.include 中为 J-Link 指定了调试目标设备名JLINK_DEVICE = RP2040_M0_0(选择 Cortex-M0+ 的核 0)。
访问 RIOT Shell(make term)
板卡的默认 RIOT shell 通道是UART0:
- TX:物理引脚 1(GPIO0)
- RX:物理引脚 2(GPIO1)
- 默认波特率:115200
与 periph_conf.h 中 UART0 的tx_pin = GPIO_PIN(0, 0)、rx_pin = GPIO_PIN(0, 1)完全对应。最简单的连接方式是:
BOARD=rpi-pico make termmake term会使用 Makefile.include 中默认的/dev/ttyUSB0端口打开串口终端。
警告(文档原文强调):Raspberry Pi Pico 板卡不兼容 5V 电平!当连接 5V UART 时,务必使用分压电路或逻辑电平转换器,否则可能损坏芯片。
片上调试(On-Chip Debugging)
截至 2026 年 5 月,调试 Pico 的硬件选项有:
- J-Link:使用 Segger 系列调试器;
- OpenOCD + 低层 bit-banging 调试器:例如将树莓派 4B 的 GPIO 通过跳线连接 Pico;
- Black Magic Probe:使用近期更新的 Black Magic Probe 调试器。
此外还有纯软件方案:pico-debug。默认链接脚本为它预留了16 KiB RAM,因此只需通过 UF2 引导把 gimme-cache 版本"烧"进 RAM,然后即可直接调试:
BOARD=rpi-pico make debug使用注意(文档原文警告):
- 虚拟调试器不持久,每次冷启动需重新烧入;
- RIOT 的初始化代码目前与调试器配合良好,因此软复位后调试器仍保持连接;
- 若在重启时遇到与调试器失去连接的问题,可在 GDB 中改用
monitor reset init执行软复位。
已知问题与实现状态
板级文档明确指出该板卡处于早期实现阶段(Early State Implementation),以下外设当前尚未实现:
- USB
- RTC
- 看门狗(Watchdog)
- SMP 支持(RIOT 尚未实现多核支持,RP2040 的第二核目前未被利用)
而I2C 外设则通过 PIO 实现(见上文"PIO I2C"小节),这既是 RP2040 的特色应用,也属于实验性功能。
从 cpu/rpx0xx 的代码结构看,PIO 相关支持已具备完整的目录组织:cpu/rpx0xx/periph/pio.c负责 PIO 底层驱动,cpu/rpx0xx/pio/i2c/i2c.c提供 PIO 上的 I2C 程序实现,cpu/rpx0xx/periph/i2c.c则是面向 RIOTperiph_i2c接口的对接层。可以推断,后续一旦板级PIO_I2C_CONFIG正式落地,periph_i2c便能通过 PIO 状态机为用户提供可用的 I2C 总线。
快速上手小结
综合以上内容,在 RIOT 中使用 Raspberry Pi Pico 的最小路径是:
# 1. 编译任意支持该板的应用(以 hello-world 类应用为例) cd examples/hello-world BOARD=rpi-pico make # 2. 按住 BOOTSEL 插入 USB,默认走 UF2/picotool 烧录 BOARD=rpi-pico make flash # 3. 通过 UART0(GPIO0/GPIO1,115200 baud)进入 RIOT shell BOARD=rpi-pico make term调试场景下,按需选择PROGRAMMER=openocd(配合 pico-debug 或 bit-banging 适配器)或PROGRAMMER=jlink(配合 Segger 调试器),随后执行make debug进入 GDB。需要留意 PIO I2C、USB、RTC、看门狗等尚未完善的功能边界,避免在早期阶段踩坑。
相关资源索引:
- 板级文档:boards/rpi-pico/doc.md
- 外设引脚配置:boards/rpi-pico/include/periph_conf.h
- LED/SAUL 定义:boards/rpi-pico/include/board.h、boards/rpi-pico/include/gpio_params.h
- 构建元数据:boards/rpi-pico/Makefile.features、boards/rpi-pico/Makefile.include、boards/rpi-pico/Kconfig
- PIO I2C 驱动:drivers/include/periph/pio/i2c.h、cpu/rpx0xx/periph/i2c.c、cpu/rpx0xx/pio/i2c/i2c.c
【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考