news 2026/9/14 4:13:35

Zephyr 中 Adafruit Metro RP2350 板卡支持详解:硬件特性、设备树配置与烧录调试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Zephyr 中 Adafruit Metro RP2350 板卡支持详解:硬件特性、设备树配置与烧录调试

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 NeoPixel23 号用户 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),支持的编译工具链为zephyrgnuarmemb两套。

支持的功能子系统

板卡 YAML 中supported字段声明了该机器目标当前声明支持的功能:

功能说明
adc模拟输入(6 路,对应 Arduino A0~A5)
clock时钟控制
counter计数器
dmaDMA
gpio通用 IO
hwinfo硬件信息(如芯片序列号读取)
i2cI2C 总线(Stemma QT 端口)
pwmPWM 输出
spiSPI(板级 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_defaultTX→P0,RX→P1(RX 使能输入)
i2c0_defaultSDA→P20(使能输入),SCL→P21
adc_defaultADC 通道 1~6 → P41~P46(全部使能输入)
pwm_defaultPWM 1B→P3、2B→P5、3A→P6、4B→P9、5A→P10、5B→P11
pio0_spi0_defaultPIO 占用 P11、P12(P10 作为片选不分配给 PIO)
pio1_ws2812_defaultPIO1 占用 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:

  1. 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 分叉不会在接口配置中设定该值)。

  2. probe-rsboard_runner_args(probe-rs "--chip=RP235x"),即用 probe-rs 的 RP235x 芯片描述。
  3. UF2board_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 openocdwest 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 4:13:21

如何用 EAS 构建 Ignite 应用的开发、预览与生产构建包?

如何用 EAS 构建 Ignite 应用的开发、预览与生产构建包&#xff1f; 【免费下载链接】ignite Infinite Reds battle-tested React Native project boilerplate, along with a CLI, component/model generators, and more! 9 years of continuous development and counting. 项…

作者头像 李华
网站建设 2026/9/14 4:11:31

keep 开源告警平台部署实战:从选型到上线的完整指南

keep 开源告警平台部署实战&#xff1a;从选型到上线的完整指南 【免费下载链接】keep The open-source AIOps and alert management platform 项目地址: https://gitcode.com/GitHub_Trending/kee/keep 监控系统、CI/CD、SRE 工具各喊各的&#xff0c;值班同学每天在几…

作者头像 李华
网站建设 2026/9/14 4:11:25

中文操作系统内核开发:假持久化与USB协议栈实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 4:10:28

SpringBoot微信小程序物业管理系统开发实践

1. 项目概述"springboot微信小程序物业缴费报修置换问卷"是一个面向现代社区物业管理的数字化解决方案。这个系统通过微信小程序作为前端入口&#xff0c;SpringBoot作为后端框架&#xff0c;实现了物业缴费、报修处理、二手置换和问卷调查四大核心功能模块。在实际社…

作者头像 李华