Zephyr 中 Adafruit Metro RP2350 板卡支持详解:硬件特性、设备树配置与烧录调试
【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr
本文基于 Zephyr 仓库中 Adafruit Metro RP2350 的板卡文档与配套实现文件,完整讲解该板卡在 Zephyr 中的定位、硬件资源清单、支持的功能子系统、设备树(DTS)引脚映射与 Flash 分区设计、默认内核配置,以及基于 OpenOCD / probe-rs / UF2 的编程调试方式。读完后你可以直接使用west build -b adafruit_metro_rp2350/rp2350b/m33构建固件,并理解该板卡当前 Zephyr 支持的能力边界与限制。
板卡概览与当前支持范围
Adafruit Metro RP2350 是 Adafruit Metro 系列中第二块采用 Raspberry Pi Pico 家族芯片的开发板(第一块为 RP2040 版本)。它围绕 Raspberry Pi RP2350 芯片组织硬件,主打 Arduino 外形兼容(pinout 兼容)以及更大的板载空间与调试端口,适合需要额外 GPIO、存储和调试接口的开发项目。
Zephyr 仓库中的板卡定义位于boards/adafruit/metro_rp2350/目录,官方板卡文档为 doc/index.rst。板卡的机器标识符(board identifier)为:
adafruit_metro_rp2350/rp2350b/m33其中rp2350b为 SoC,m33表示 Cortex-M33 核心。Kconfig.adafruit_metro_rp2350 中通过select SOC_RP2350B_M33将板卡与具体的 SoC 配置绑定。
官方文档明确列出了两条当前限制,选型与开发时需要特别注意:
- Zephyr 构建仅支持 RP2350B 的 Cortex-M33 核心。RP2350 内部还带有一个 Hazard3 标量核心(即
rp2350b中的非 M33 核心),但 Zephyr 目前不为其提供构建目标; - 与其他 RP2040/RP2350 设备一样,Zephyr 尚不支持在第二个核心上运行代码,即双核 SMP 场景暂不可用。
硬件资源
根据板卡文档的 Hardware 一节,Metro RP2350 的主要硬件资源如下:
- RP2350 主芯片:150 MHz 时钟,3.3 V 逻辑电平;
- 16 MB QSPI Flash,用于程序存储;
- 37 个可用 GPIO:23 个位于 socket/SPI 排针,12 个位于 HSTX 端口,另有 2 个用于 USB Host;其中 6 个可作模拟输入;
- Micro SD 卡座:默认按 SPI 接口接线,另引出额外引脚供进阶用户做 SDIO 接线(Arduino/Python 生态中同样没有现成的 SDIO 代码,属于超前的硬件配置);
- 5V Buck 变换器:TPS563201,输入 6~17 V DC,输出最大 2 A;
- 板载RGB NeoPixel与23 号用户 LED;
- Stemma QT 端口:I2C 外设与传感器接口;
- 22 针 3 通道差分 HSTX FPC 端口:Pinout 与 Raspberry Pi 5 兼容,可快速实现 DVI 视频输出,也可视作 12 个额外的 GPIO;
- 板边Reset 与 Boot 按键;
- Pico Probe 调试端口:3 针 JST SH 兼容;
- USB Type-C供电与数据接口;
- 5.5 mm / 2.1 mm DC 插座(6~17 V DC 供电),带独立的直流电源通断开关;
- RX/TX 跳线开关:用于交换 D0 与 D1 的 UART 引脚位置;
- USB Host 引出焊盘:带可控 5 V 供电与 D+/D-,可 bitbang 出 USB Host;
- GPIO 编号与经典 Arduino 引脚编号一致,仅 GPIO 12、13 例外(这两个引脚被 HSTX 连接占用)。
板卡的量化规格记录在 adafruit_metro_rp2350_rp2350b_m33.yaml 中,其中flash: 16384(KB,即 16 MB)与ram: 520(KB)与文档中"16 MB Flash、528 KB RAM"的描述对应(Zephyr 可见的 SRAM 计为 520 KB),支持的编译工具链为zephyr与gnuarmemb两套。
支持的功能子系统
板卡 YAML 中supported字段声明了该机器目标当前声明支持的功能:
| 功能 | 说明 |
|---|---|
adc | 模拟输入(6 路,对应 Arduino A0~A5) |
clock | 时钟控制 |
counter | 计数器 |
dma | DMA |
gpio | 通用 IO |
hwinfo | 硬件信息(如芯片序列号读取) |
i2c | I2C 总线(Stemma QT 端口) |
pwm | PWM 输出 |
spi | SPI(板级 PIO 软 SPI,用于 SD 卡座等) |
uart | 串口(同时作为控制台) |
这些声明与设备树中实际使能的节点一一对应(见下节),可互相印证。
设备树:引脚映射、外设使能与 Flash 分区
板级设备树 adafruit_metro_rp2350_rp2350b_m33.dts 按 Zephyr 板级 DTS 惯例组合三部分内容:SoC 公共特性(raspberrypi/rpi_pico/rp2350b.dtsi)、核心配置(m33.dtsi)与板级覆盖。其中值得关注的板级内容包括:
控制台与 Shell
chosen { zephyr,sram = &sram0; zephyr,flash = &flash0; zephyr,console = &uart0; zephyr,shell-uart = &uart0; zephyr,code-partition = &code_partition; };控制台与 Zephyr Shell 均挂在uart0uart0` 上,默认波特率 115200:
&uart0 { current-speed = <115200>; status = "okay"; pinctrl-0 = <&uart0_default>; };同时板级文件末尾用arduino_serial: &uart0 {}和arduino_i2c: &i2c0 {}两个标签节点,把 UART0/I2C0 暴露成 Arduino 风格的别名,方便按 Arduino 引脚习惯使用。
Arduino 引脚兼容映射
板卡的核心卖点是 Arduino 引脚编号兼容。DTS 中通过arduino-header-r3连接器节点把经典 Arduino 引脚号映射到 RP2350 的 GPIO 上:
arduino_header: connector { compatible = "arduino-header-r3"; #gpio-cells = <2>; gpio-map-mask = <0xffffffff 0xffffffc0>; gpio-map-pass-thru = <0 0x3f>; gpio-map = <ARDUINO_HEADER_R3_A0 0 &gpio0_hi 9 0>, ... <ARDUINO_HEADER_R3_D12 0 &gpio0 22 0>, <ARDUINO_HEADER_R3_D13 0 &gpio0 23 0>, <ARDUINO_HEADER_R3_D14 0 &gpio0 16 0>, <ARDUINO_HEADER_R3_D15 0 &gpio0 17 0>; };可以看到模拟引脚 A0~A5 映射到gpio0_hi的 9~14 号脚,数字引脚 D2~D11 直接对应 GPIO2~11,而 D12/D13 因原 GPIO12/13 被 HSTX 占用,改映到 GPIO22/23,D14/D15 映到 GPIO16/17——这与文档"除 GPIO 12、13 外 GPIO 编号与 Arduino 一致"的说明完全吻合。
模拟连接器arduino_adc则把 A0~A5 映射到 RP2350 的 ADC 通道 1~6(GPIO41~46):
arduino_adc: analog-connector { compatible = "arduino,uno-adc"; #io-channel-cells = <1>; io-channel-map = <0 &adc 1>, /* A0 = GPIO41 = ADC1 */ ... <5 &adc 6>; /* A5 = GPIO46 = ADC6 */ };应用代码因此可以按"Arduino 模拟引脚号"取 ADC 通道,而不必关心底层通道编号。
板载 LED 与 NeoPixel
- 用户 LED 使用 GPIO23,低电平点亮(
GPIO_ACTIVE_LOW),别名为led0; - 板载 RGB NeoPixel 通过 PIO 状态机驱动,节点挂在
pio1下:
pio-ws2812 { compatible = "worldsemi,ws2812-rpi_pico-pio"; pinctrl-0 = <&pio1_ws2812_default>; bit-waveform = <3>, <3>, <4>; ws2812: ws2812 { gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; chain-length = <1>; color-mapping = <LED_COLOR_ID_GREEN LED_COLOR_ID_RED LED_COLOR_ID_BLUE>; reset-delay = <280>; frequency = <800000>; }; };即 WS2812 信号走 GPIO25、800 kHz 波形、GRB 颜色序,别名为led-strip,可直接配合 Zephyr 的led_strip子系统使用。
PIO 软 SPI(SD 卡座等)
由于 SD 卡座走的是与 HSTX 相邻的引出引脚,板级文件用 PIO 实现了 SPI 控制器(raspberrypi,pico-spi-pio),片选、时钟、MOSI、MISO 分别为 GPIO10(低有效)、13、11、12:
arduino_spi: pio0_spi0 { compatible = "raspberrypi,pico-spi-pio"; clocks = <&clocks RPI_PICO_CLKID_CLK_SYS>; cs-gpios = <&gpio0 10 GPIO_ACTIVE_LOW>; clk-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; sdo-gpios = <&gpio0 11 GPIO_ACTIVE_HIGH>; sdi-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>; pinctrl-0 = <&pio0_spi0_default>; };注意 GPIO10/13 同时出现在 Arduino 数字引脚映射中(D10/D11),实际使用时需避免功能冲突。
16 MB QSPI Flash 分区
Flash 控制器节点声明了 16 MB 空间并切出两个分区:
&flash0 { reg = <0x10000000 DT_SIZE_M(16)>; ranges = <0x0 0x10000000 DT_SIZE_M(16)>; partitions { image_def: partition@0 { label = "image_def"; reg = <0x00000000 0x100>; read-only; }; code_partition: partition@100 { label = "code-partition"; reg = <0x100 (DT_SIZE_M(16) - 0x100)>; read-only; }; }; };前 0x100 字节保留给 image definition block(实际块更小,但链接器会把向量表放在更大的对齐偏移处),其余全部作为code-partition供固件使用。chosen中的zephyr,code-partition指向它,配合默认配置中的CONFIG_USE_DT_CODE_PARTITION=y,链接阶段直接从设备树读取分区布局,无需在链接脚本里硬编码。
引脚复用(pinctrl)配置
板级引脚复用定义在 adafruit_metro_rp2350-pinctrl.dtsi,包含五个功能组:
| 组名 | 引脚分配 |
|---|---|
uart0_default | TX→P0,RX→P1(RX 使能输入) |
i2c0_default | SDA→P20(使能输入),SCL→P21 |
adc_default | ADC 通道 1~6 → P41~P46(全部使能输入) |
pwm_default | PWM 1B→P3、2B→P5、3A→P6、4B→P9、5A→P10、5B→P11 |
pio0_spi0_default | PIO 占用 P11、P12(P10 作为片选不分配给 PIO) |
pio1_ws2812_default | PIO1 占用 P25 |
这与 Pico 1 的默认引脚映射保持一致——文档 Connections and IOs 一节明确说明"The default pin mapping is unchanged from the Pico 1",因此可直接参考boards/raspberrypi/rpi_pico板卡文档中的引脚表来排线。
默认内核配置
板级默认配置 adafruit_metro_rp2350_rp2350b_m33_defconfig 很小,只开了构建与运行所必需的项:
CONFIG_BUILD_OUTPUT_HEX=y CONFIG_BUILD_OUTPUT_UF2=y CONFIG_CLOCK_CONTROL=y CONFIG_CONSOLE=y CONFIG_GPIO=y CONFIG_RESET=y CONFIG_SERIAL=y CONFIG_UART_CONSOLE=y CONFIG_UART_INTERRUPT_DRIVEN=y CONFIG_USE_DT_CODE_PARTITION=y要点:
- 默认同时产出HEX 与 UF2两种镜像——UF2 可经 USB BOOT 模式(按住 BOOTSEL 或触发双启动)直接拷贝进 Flash,HEX 则供 OpenOCD/probe-rs 烧写;
- UART 控制台使用中断驱动收发;
- 代码分区布局取自设备树(
CONFIG_USE_DT_CODE_PARTITION)。
另外 Kconfig.defconfig 将CONFIG_USB_SELF_POWERED默认为n,即 USB 默认按总线供电处理——因为该板经 USB Type-C 取电,这一默认值使 USB Device 驱动与板子实际电源拓扑保持一致。
编程与调试
与 RP2040/RP2350 设备族一致,SWD 接口可用于编程与调试。板卡文件 board.cmake 为west flash注册了三类 runner:
- OpenOCD(默认调试器假定为 CMSIS-DAP 接口,可通过
RPI_PICO_DEBUG_ADAPTER变量覆盖):board_runner_args(openocd --cmd-pre-init "source [find interface/${RPI_PICO_DEBUG_ADAPTER}.cfg]") board_runner_args(openocd --cmd-pre-init "source [find target/rp2350.cfg]") board_runner_args(openocd --cmd-pre-init "set_adapter_speed_if_not_set 5000")其中
set_adapter_speed_if_not_set是板卡自带的 Tcl 过程,定义在 support/openocd.cfg:若 adapter speed 尚未设置则设为 5000 kHz,与 Raspberry Pi 官方 Debug Probe 文档推荐的速率一致(因为树莓派的 OpenOCD 分叉不会在接口配置中设定该值)。 - probe-rs:
board_runner_args(probe-rs "--chip=RP235x"),即用 probe-rs 的 RP235x 芯片描述。 - UF2:
board_runner_args(uf2 "--board-id=RP2350"),配合boards/common/uf2.board.cmake提供的 UF2 拷贝流程,使用板 IDRP2350。
典型工作流:west build -b adafruit_metro_rp2350/rp2350b/m33 <应用目录>生成 zephyr.elf/hex/uf2;接好 Pico Probe(3 针 JST SH 的 SWD 端口)后执行west flash --runner openocd或west flash --runner probe-rs,不走调试器时则触发 BOOTSEL 模式后west flash --runner uf2。
参考与延伸阅读
- 板卡官方文档:doc/index.rst(Overview、Hardware、Supported Features、Programming and Debugging)
- 板级设备树与引脚复用:adafruit_metro_rp2350_rp2350b_m33.dts、adafruit_metro_rp2350-pinctrl.dtsi
- 板卡元数据与默认配置:adafruit_metro_rp2350_rp2350b_m33.yaml、adafruit_metro_rp2350_rp2350b_m33_defconfig
- 烧录/调试 runner 配置:board.cmake、support/openocd.cfg
- Pico 1 引脚映射参考:
boards/raspberrypi/rpi_pico板卡文档(本板默认引脚映射与其一致)
总结:Metro RP2350 在 Zephyr 中是一个以 RP2350B + Cortex-M33 为目标的板卡,提供 16 MB Flash、520 KB 可见 SRAM、Arduino 兼容引脚映射、UART/I2C/ADC/PWM/GPIO/PIO-SPI 等常用子系统与 UF2/OpenOCD/probe-rs 三条烧录路径;开发时需牢记当前仅支持单核(Cortex-M33)构建这一限制。
【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考