Zephyr 开发板实战:Arduino Nano RP2040 Connect 板级支持与从零烧录指南
【免费下载链接】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 RTOS 仓库中 Arduino Nano RP2040 Connect 官方板卡文档 为骨架,结合该板在 Zephyr 仓库中的完整板级支持源码(设备树、Kconfig、引脚复用、构建与调试配置),系统讲解这块 "Nano 尺寸 + RP2040 + Wi-Fi/蓝牙" 开发板的硬件资源、Zephyr 中的支持范围、UF2 烧录流程、串口控制台与 OpenOCD 调试方法,并深入到设备树层面的外设连接、Flash 分区与引脚映射细节,帮助你快速上手基于该板卡的 Zephyr 应用开发。
板卡概述:Nano 身形,连接为王
Arduino Nano RP2040 Connect 是 Arduino 生态中对 Nano 家族的重要补充:它把 Raspberry Pi RP2040 双核 MCU 与 Wi-Fi、蓝牙能力整合在一块经典的 Nano 尺寸板卡上。无论是刚踏入物联网世界的初学者,还是想把该板集成进下一代产品中的进阶开发者,它都是一个颇具灵活性的选择。
该板在 Zephyr 中的正式标识为arduino_nano_connect,其设备树中声明的模型与兼容字符串为:
model = "Arduino Nano RP2040 Connect"compatible = "arduino,nano-rp2040-connect"
板级核心特性如下:
- 小巧身形:沿用广为人知的 Nano 板型,紧凑的尺寸非常适合嵌入到独立项目中;
- Wi-Fi 与蓝牙:板载 u-blox NINA-W102 模块,提供 Wi-Fi 802.11b/g/n 与蓝牙 4.2 连接能力,是物联网应用的理想选择;
- 板载传感器:集成 ST LSM6DSOX 六轴惯性测量单元(加速度计 + 陀螺仪)与 MP34DT06J 数字麦克风,适用于音频与运动检测场景;
- 安全能力:集成 Microchip ATECC608A 加密协处理器,可用于安全物联网应用;
- RGB LED:板载 RGB LED 由 NINA 模块驱动,用于视觉反馈。
硬件规格一览
依据板卡文档与 板级 YAML 定义,该板完整硬件参数如下:
| 项目 | 规格 |
|---|---|
| 主控 | Raspberry Pi RP2040(双核 Arm Cortex-M0+,133 MHz) |
| SRAM | 264 KB |
| Flash | 16 MB(AT25SF128A 外部 QSPI Flash) |
| 无线 | u-blox NINA-W102(Wi-Fi 802.11b/g/n、蓝牙 4.2) |
| IMU | ST LSM6DSOX 六轴惯性测量单元 |
| 麦克风 | ST MP34DT06J MEMS 数字麦克风 |
| 加密 | Microchip ATECC608A 加密协处理器 |
| 板载 LED | 内置 LED 位于 GPIO6 |
| 数字 I/O 引脚 | 22 |
| PWM 引脚 | 20 |
| 模拟输入引脚 | 8 |
| 工作电压 | 3.3 V |
| 输入电压(VIN) | 5–21 V |
在 Zephyr 的板级描述中,该板arch: arm、ram: 264(KB)、flash: 16384(KB),并声明支持 adc、gpio、i2c、pwm、spi、uart、usb_device、watchdog 等外设类别。板级 Kconfig 选择项RP2_FLASH_AT25SF128A则确认了 16 MB 外部 Flash 的型号(见 Kconfig)。
Zephyr 中支持的外设(Supported Features)
原文档以.. zephyr:board-supported-hw::指令自动生成支持矩阵,我们可以在板级源码中进一步确认这些能力的实际实现状态。
板级默认启用的内核配置
arduino_nano_connect_defconfig 是构建时自动合并的默认配置,其中:
CONFIG_SERIAL=y CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y CONFIG_GPIO=y CONFIG_USE_DT_CODE_PARTITION=y CONFIG_BUILD_OUTPUT_UF2=y CONFIG_BUILD_OUTPUT_HEX=y CONFIG_UART_INTERRUPT_DRIVEN=y CONFIG_RESET=y CONFIG_CLOCK_CONTROL=y CONFIG_I2C=y CONFIG_SPI=y值得注意的两点:
CONFIG_BUILD_OUTPUT_UF2=y:构建时默认同时产出UF2 格式镜像,这正是原文档推荐的免工具链烧录方式的基础;CONFIG_USE_DT_CODE_PARTITION=y:应用固件被链接到设备树声明的code_partition分区中(详见下文 Flash 分区说明)。
板级 Kconfig 细节
Kconfig.defconfig 中还包含两条板级默认值:
if I2C_DW config I2C_DW_CLOCK_SPEED default 125 endif config USB_SELF_POWERED default n即在启用 DesignWare I2C 控制器时将 I2C 时钟速度默认设为 125(kHz,配合设备树中的标准速率I2C_BITRATE_STANDARD),并将 USB 设备配置为非自供电模式(USB_SELF_POWERED=n),符合该板通过 USB 供电的实际接线方式。
引脚连接与 Arduino 兼容映射
原文档建议前往 Arduino 官方 Store 与 Docs 查看详细的板卡引脚信息,并下载官方数据手册获取更多细节。在 Zephyr 仓库内,我们则可以依托设备树源码获得精确到引脚的映射。
Arduino Nano 排针的 GPIO 映射表
arduino_nano_connect.dts 中定义了arduino,nano-header兼容的排针连接器节点nano_header,把 Arduino Nano 逻辑引脚逐一映射到 RP2040 的 GPIO:
| Arduino 引脚 | RP2040 GPIO | 说明 |
|---|---|---|
| D0 | GPIO1 | RX |
| D1 | GPIO0 | TX |
| D2 | GPIO25 | — |
| D3 | GPIO15 | — |
| D4 | GPIO16 | — |
| D5 | GPIO17 | — |
| D6 | GPIO18 | — |
| D7 | GPIO19 | — |
| D8 | GPIO20 | — |
| D9 | GPIO21 | — |
| D10 | GPIO5 | SS |
| D11 | GPIO7 | MOSI |
| D12 | GPIO4 | MISO |
| D13 | GPIO6 | SCK / 板载 LED |
| D14 | GPIO26 | A0 |
| D15 | GPIO27 | A1 |
| D16 | GPIO28 | A2 |
| D17 | GPIO29 | A3 |
| D18 | GPIO12 | A4 / SDA |
| D19 | GPIO13 | A5 / SCL |
同时,设备树末尾提供了三个面向 Arduino 生态的兼容别名,便于应用代码以通用方式引用:
arduino_spi: &spi0 {}; arduino_i2c: &i2c0 {}; arduino_serial: &uart0 {};即Arduino SPI 总线对应 SPI0、Arduino I2C 总线对应 I2C0、Arduino 串口对应 UART0。
引脚复用(pinctrl)定义
arduino_nano_connect-pinctrl.dtsi 中为各外设声明了默认引脚复用:
- UART0:TX 位于 GPIO0(P0)、RX 位于 GPIO1(P1),与控制台/串口功能一致;
- I2C0:SDA 位于 GPIO12、SCL 位于 GPIO13,并开启
input-enable与施密特触发(input-schmitt-enable); - SPI0(用户可用主 SPI):SCK 位于 GPIO6、TX(MOSI) 位于 GPIO7、RX(MISO) 位于 GPIO4;
- SPI1(连接 NINA Wi-Fi 模块的内部 SPI):SCK 位于 GPIO14、TX 位于 GPIO11、RX 位于 GPIO8;
- ADC:模拟通道 CH0–CH3 对应 GPIO26–GPIO29(即 A0–A3);
- PWM:PWM 3A 输出位于 GPIO6。
外设连接深入:从设备树看板载器件
设备树文件还揭示了板载器件在 Zephyr 侧的连接拓扑,这也是原文档"Connections and IOs"在源码层面的落点。
I2C0 总线上的传感器与加密芯片
I2C0 以标准速率(100 kHz)工作,总线上挂载了两颗器件:
&i2c0 { clock-frequency = ; status = "okay"; pinctrl-0 = <&i2c0_default>; pinctrl-names = "default"; /* LSM6DSOX IMU */ lsm6dsox: lsm6dsox@6a { compatible = "st,lsm6dso"; reg = <0x6a>; irq-gpios = <&gpio0 24 GPIO_ACTIVE_HIGH>; }; /* ATECC608A Crypto */ atecc608a: atecc608a@60 { compatible = "microchip,atecc608"; reg = <0x60>; }; };- LSM6DSOX:I2C 地址
0x6a,兼容字符串st,lsm6dso(Zephyr 传感器驱动,见 st,lsm6dso-i2c.yaml),中断引脚接到 GPIO24; - ATECC608A:I2C 地址
0x60。
SPI1 与 UART1:NINA-W102 无线模块
NINA-W102 通过两条通道与 RP2040 通信:
&spi1 { /* SPI to NINA WiFi module */ clock-frequency = ; pinctrl-0 = <&spi1_default>; pinctrl-names = "default"; cs-gpios = <&gpio0 9 GPIO_ACTIVE_LOW>; nina_w102: nina_w102@0 { compatible = "u-blox,nina"; reg = <0>; spi-max-frequency = <8000000>; ready-gpios = <&gpio0 10 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; reset-gpios = <&gpio0 3 GPIO_ACTIVE_LOW>; irq-gpios = <&gpio0 2 GPIO_PULL_DOWN>; }; };- 数据通道:SPI1,8 MHz 时钟,片选为 GPIO9(低有效);
- 控制信号:
ready(GPIO10,上拉 + 低有效)、reset(GPIO3,低有效)、irq(GPIO2,下拉); - AT 命令通道:UART1 上声明了一个
espressif,esp-at兼容的nina_prog节点,复用了 GPIO3 作为复位引脚(参见 espressif,esp-at.yaml)。NINA-W102 固件基于 ESP32 的 AT 命令框架,因此沿用该兼容字符串。
板载 LED 与 Flash 分区
板载 LED 与内置 LED 共用 GPIO6(也是 D13/SCK 引脚),以高电平点亮:
led0: led_0 { /* Built-in LED on GPIO6 (accent LED, directly connected) */ gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>; };Flash 分区在设备树中被明确划分(16 MB AT25SF128A 通过 QSPI 控制器ssi访问):
second_stage_bootloader:位于0x0,大小0x100(256 字节),只读,保留给 RP2040 二级引导程序;code_partition:从0x100开始,大小为16 MB - 0x100,只读,作为zephyr,code-partition,应用固件即链接到此分区。
&ssi { ranges = <0x0 0x10000000 DT_SIZE_M(16)>; }; &flash0 { /* 16MB flash */ reg = <0x10000000 DT_SIZE_M(16)>; ranges = <0x0 0x0 DT_SIZE_M(16)>; partitions { ... second_stage_bootloader: partition@0 { ... reg = <0x00000000 0x100>; ... }; code_partition: partition@100 { ... reg = <0x100 (DT_SIZE_M(16) - 0x100)>; ... }; }; };烧录:UF2 引导加载器方式
原文档明确指出,烧录该板最简单的方式是使用UF2 引导加载器(板级默认构建配置已开启CONFIG_BUILD_OUTPUT_UF2=y,构建产物中会直接生成.uf2文件)。
以hello_world示例为例,完整的构建 + 烧录命令为:
$ west build -b arduino_nano_connect samples/hello_world $ west flash其实际执行流程如下:
west build -b arduino_nano_connect samples/hello_world会交叉编译示例并产出build/zephyr/zephyr.uf2(同时还有zephyr.hex);west flash调用 UF2 runner。板级 board.cmake 中注册了board_runner_args(uf2 "--board-id=RPI-RP2"),即向 UF2 引导加载器索取挂载卷的方式执行写入;- 实际操作时:按住板上的复位按钮接入 USB,使板卡进入 UF2 引导模式(此时系统会出现一个名为
RPI-RP2的 U 盘卷),将zephyr.uf2拖入该卷即可完成烧录。
west flash期间若板卡未处于引导模式,可手动进入 UF2 模式后重试。
串口控制台
烧录完成后,通过 USB 端口连接串口控制台即可查看应用输出。文档中的示例使用minicom:
$ minicom -D /dev/ttyACM0注意:设备节点名可能因系统而异(Linux 下常见为/dev/ttyACM0,macOS 下通常为/dev/tty.usbmodem*),可先通过ls /dev/ttyACM*或dmesg确认实际设备名。
Zephyr 板级配置中控制台默认挂在 UART0(见设备树zephyr,console = &uart0与zephyr,shell-uart = &uart0),波特率 115200:
&uart0 { current-speed = <115200>; status = "okay"; pinctrl-0 = <&uart0_default>; pinctrl-names = "default"; };烧录 hello_world 后,串口应输出:
Hello World! arduino_nano_connect(该输出由printf("Hello World! %s\n", CONFIG_BOARD_TARGET);生成,其中CONFIG_BOARD_TARGET在构建该板时即展开为arduino_nano_connect。)
调试:OpenOCD 与调试探针
可以使用OpenOCD配合调试探针对应用进行调试。以hello_world为例:
$ west build -b arduino_nano_connect samples/hello_world $ west debug板级 board.cmake 为多种调试器注册了运行参数:
board_runner_args(openocd --cmd-pre-init "source [find interface/${ARDUINO_NANO_RP2040_DEBUG_ADAPTER}.cfg]") board_runner_args(openocd --cmd-pre-init "transport select swd") board_runner_args(openocd --cmd-pre-init "source [find target/rp2040.cfg]") board_runner_args(openocd --cmd-pre-init "set_adapter_speed_if_not_set 2000") board_runner_args(jlink "--device=RP2040_M0_0") board_runner_args(uf2 "--board-id=RPI-RP2") board_runner_args(pyocd "--target=rp2040")几个实用要点:
默认探针:当未显式指定时,
ARDUINO_NANO_RP2040_DEBUG_ADAPTER默认为cmsis-dap(即 Arduino 官方调试探针方案);切换探针:可通过命令行参数选择其他 OpenOCD 接口配置,例如:
$ west build -b arduino_nano_connect -- -DARDUINO_NANO_RP2040_DEBUG_ADAPTER=cmsis-dapOpenOCD 将强制使用 SWD 传输协议并加载 RP2040 目标配置,若接口配置未设定适配器速度,则回退为 2000 kHz;
此外还支持 J-Link(目标器件
RP2040_M0_0)与 pyOCD(目标rp2040)等其他调试通道。
构建与调试的适用前提
- 本文所有命令均基于 Zephyr 标准工作流,需要预先安装 west、Zephyr SDK 并完成环境初始化(详见仓库根目录的 README.rst 与 zephyr-env.sh);
- 板级默认配置面向 RP2040(SOC_RP2040),工具链支持 zephyr、gnuarmemb、xtools 三种(见 arduino_nano_connect.yaml);
- NINA-W102 的 Wi-Fi/蓝牙协议栈、MP34DT06J 数字麦克风以及 ATECC608A 的完整驱动能力取决于所选的 Zephyr 子系统与模块配置,实际使用时请以对应子系统文档与构建输出为准;
- 串口设备节点、探针类型与宿主系统相关,命令中的路径请按实际环境调整。
小结
Arduino Nano RP2040 Connect 在 Zephyr 中的支持是"文档指引 + 源码落地"的典型样例:官方文档给出了硬件总览、UF2 烧录、串口控制台与 OpenOCD 调试的完整操作路径;而 设备树、引脚复用文件、默认配置 与 board.cmake 则进一步提供了精确到引脚的硬件拓扑、Flash 分区与多调试器支持细节。基于这些材料,你可以直接开始编写、烧录并调试自己的第一个 Zephyr 应用,再逐步扩展到 Wi-Fi、蓝牙、IMU 与加密等更丰富的物联网场景。
【免费下载链接】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),仅供参考