Zephyr 开发板实战:Arduino Nano RP2040 Connect 板级支持与从零烧录指南

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)
SRAM264 KB
Flash16 MB(AT25SF128A 外部 QSPI Flash)
无线u-blox NINA-W102(Wi-Fi 802.11b/g/n、蓝牙 4.2)
IMUST 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说明
D0GPIO1RX
D1GPIO0TX
D2GPIO25—
D3GPIO15—
D4GPIO16—
D5GPIO17—
D6GPIO18—
D7GPIO19—
D8GPIO20—
D9GPIO21—
D10GPIO5SS
D11GPIO7MOSI
D12GPIO4MISO
D13GPIO6SCK / 板载 LED
D14GPIO26A0
D15GPIO27A1
D16GPIO28A2
D17GPIO29A3
D18GPIO12A4 / SDA
D19GPIO13A5 / 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

其实际执行流程如下:

  1. west build -b arduino_nano_connect samples/hello_world会交叉编译示例并产出build/zephyr/zephyr.uf2(同时还有zephyr.hex);
  2. west flash调用 UF2 runner。板级 board.cmake 中注册了board_runner_args(uf2 "--board-id=RPI-RP2"),即向 UF2 引导加载器索取挂载卷的方式执行写入;
  3. 实际操作时:按住板上的复位按钮接入 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-dap
  • OpenOCD 将强制使用 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),仅供参考