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 。 arduino_nano_connect-pinctrl.dtsi 中为各外设声明了默认引脚复用: 设备树文件还揭示了板载器件在 Zephyr 侧的连接拓扑,这也是原文档"Connections and IOs"在源码层面的落点。 I2C0 以标准速率(100 kHz)工作,总线上挂载了两颗器件: NINA-W102 通过两条通道与 RP2040 通信: 板载 LED 与内置 LED 共用 GPIO6(也是 D13/SCK 引脚),以高电平点亮: Flash 分区在设备树中被明确划分(16 MB AT25SF128A 通过 QSPI 控制器 访问): 原文档明确指出,烧录该板最简单的方式是使用UF2 引导加载器(板级默认构建配置已开启 文件)。 以 示例为例,完整的构建 + 烧录命令为: 其实际执行流程如下: 期间若板卡未处于引导模式,可手动进入 UF2 模式后重试。 烧录完成后,通过 USB 端口连接串口控制台即可查看应用输出。文档中的示例使用 : 注意:设备节点名可能因系统而异(Linux 下常见为 确认实际设备名。 Zephyr 板级配置中控制台默认挂在 UART0(见设备树 ),波特率 115200: 烧录 hello_world 后,串口应输出: (该输出由 。) 可以使用OpenOCD配合调试探针对应用进行调试。以 为例: 板级 board.cmake 为多种调试器注册了运行参数: 几个实用要点: 默认探针:当未显式指定时, (即 Arduino 官方调试探针方案); 切换探针 :可通过命令行参数选择其他 OpenOCD 接口配置,例如: OpenOCD 将强制使用 SWD 传输协议并加载 RP2040 目标配置,若接口配置未设定适配器速度,则回退为 2000 kHz; 此外还支持 J-Link(目标器件 )等其他调试通道。 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引脚复用(pinctrl)定义
input-enable与施密特触发(input-schmitt-enable);外设连接深入:从设备树看板载器件
I2C0 总线上的传感器与加密芯片
&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>; }; };0x6a,兼容字符串st,lsm6dso(Zephyr 传感器驱动,见 st,lsm6dso-i2c.yaml),中断引脚接到 GPIO24;0x60。SPI1 与 UART1:NINA-W102 无线模块
&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>; }; };ready(GPIO10,上拉 + 低有效)、reset(GPIO3,低有效)、irq(GPIO2,下拉);espressif,esp-at兼容的nina_prog节点,复用了 GPIO3 作为复位引脚(参见 espressif,esp-at.yaml)。NINA-W102 固件基于 ESP32 的 AT 命令框架,因此沿用该兼容字符串。板载 LED 与 Flash 分区
led0: led_0 { /* Built-in LED on GPIO6 (accent LED, directly connected) */ gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>; };ssisecond_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 引导加载器方式
CONFIG_BUILD_OUTPUT_UF2=y,构建产物中会直接生成.uf2hello_world$ west build -b arduino_nano_connect samples/hello_world $ west flashwest 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 引导加载器索取挂载卷的方式执行写入;RPI-RP2的 U 盘卷),将zephyr.uf2拖入该卷即可完成烧录。west flash串口控制台
minicom$ minicom -D /dev/ttyACM0/dev/ttyACM0,macOS 下通常为/dev/tty.usbmodem*),可先通过ls /dev/ttyACM*或dmesgzephyr,console = &uart0与zephyr,shell-uart = &uart0&uart0 { current-speed = <115200>; status = "okay"; pinctrl-0 = <&uart0_default>; pinctrl-names = "default"; };Hello World! arduino_nano_connectprintf("Hello World! %s\n", CONFIG_BOARD_TARGET);生成,其中CONFIG_BOARD_TARGET在构建该板时即展开为arduino_nano_connect调试:OpenOCD 与调试探针
hello_world$ west build -b arduino_nano_connect samples/hello_world $ west debugboard_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$ west build -b arduino_nano_connect -- -DARDUINO_NANO_RP2040_DEBUG_ADAPTER=cmsis-dapRP2040_M0_0)与 pyOCD(目标rp2040构建与调试的适用前提
小结
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考