Zephyr 中 Adafruit ItsyBitsy nRF52840 Express 板级支持详解:从设备树到 UF2 烧录
【免费下载链接】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 仓库中boards/adafruit/itsybitsy板级目录的官方文档与配套源码,完整讲解 Adafruit ItsyBitsy nRF52840 Express 开发板在 Zephyr RTOS 中的支持细节:硬件能力、引脚与外设连接方式、设备树中各外设的配置逻辑,以及通过 UF2 引导程序烧录 Zephyr 应用的完整流程。读完本文后,你可以独立在这块 36 mm × 18 mm 的 ARM 开发板上构建、烧录并验证 Zephyr 示例程序,并理解其设备树与内存分区背后的设计。
硬件概览
Adafruit ItsyBitsy nRF52840 Express 是一款小型(36 mm × 18 mm)ARM 开发板,板载 RGB LED、USB 接口、2 MB QSPI 外部 Flash,并将 21 个 GPIO 引脚引出。根据板级目录 board.yml 的定义,其在 Zephyr 中的板级标识符为:
identifier: adafruit_itsybitsy/nrf52840 name: Adafruit ItsyBitsy nRF52840 Express type: mcu arch: arm ram: 256 flash: 1024即构建时使用的目标板参数为adafruit_itsybitsy/nrf52840。
核心规格
官方文档列出的硬件构成如下:
- nRF52840 ARM Cortex-M4F CPU,主频 64 MHz
- 1 MB 片上 Flash 和 256 KB SRAM
- 2 MB QSPI 外部 Flash
- 1 个用户 LED(红色)
- 1 个用户按键(开关)
- 1 颗 RGB DotStar 灯珠
- 原生 USB 接口
- 1 个复位按钮
板级 Kconfig Kconfig.adafruit_itsybitsy 中通过select SOC_NRF52840_QIAA指定了具体的 SoC 变体,即 QIAA 封装的 nRF52840。
支持的子系统
文档中的 "Supported Features" 章节由 Zephyr 构建系统依据 board.yml 自动展开,实际声明的支持特性为:
- ADC(模数转换)
- Bluetooth(BLE 与 802.15.4 无线电)
- Counter(计数器)
- GPIO
- I2C
- PWM
- SPI
- USB Device(usbd)
- Watchdog(看门狗)
文档同时列出了 SoC 级可用外设的完整清单,包括 CLOCK、FLASH、I2S、MPU、NVIC、QSPI、RTC、UARTE、USB、WDT 等。这意味着虽然并非每个子系统都在默认配置中打开,但通过 Kconfig 即可按需启用。
IO 与外设连接
LED、按键与 DotStar
文档给出了板上关键器件的引脚映射,这些定义都能在设备树 adafruit_itsybitsy_nrf52840.dts 中找到对应实现:
| 器件 | 引脚 | 设备树中的定义 |
|---|---|---|
| LED0(红色 LED) | P0.06 | led0: gpios = <&gpio0 6 GPIO_ACTIVE_HIGH> |
| DotStar LED | DATA = P0.08,CLK = P1.09 | 挂在spi2总线下,见下文 |
| 用户开关 SWITCH | P0.29 | button0: gpios = <&gpio0 29 (GPIO_PULL_UP \| GPIO_ACTIVE_LOW)> |
| 复位按钮 RESET | P0.18 | 通过&uicr { gpio-as-nreset; }复用为 nRESET |
有两点值得注意:
- 红色 LED 为高电平有效(
GPIO_ACTIVE_HIGH),而开关采用上拉 + 低电平有效(GPIO_PULL_UP | GPIO_ACTIVE_LOW),即按下时引脚拉低触发,这与gpio-keys绑定常用的接法一致。 - 复位按钮所在的 P0.18 并非普通 GPIO,设备树通过
&uicr { gpio-as-nreset; }将 nRESET 引脚配置为 GPIO 输入。从源码结构看,这意味着应用层可以读取该引脚状态来判断用户是否手动复位了设备,而不是简单地忽略这个按键。
DotStar LED 的 SPI 建模
文档指出 "DotStar LED has been implemented as a SPI device"。在设备树中,RGB DotStar 被建模为 SPI 从设备apa102(APA102 协议兼容器件):
&spi2 { compatible = "nordic,nrf-spi"; status = "okay"; pinctrl-0 = <&spi2_default>; pinctrl-1 = <&spi2_sleep>; pinctrl-names = "default", "sleep"; apa102: apa102@0 { compatible = "apa,apa102"; reg = <0>; spi-max-frequency = <5250000>; chain-length = <1>; color-mapping = <LED_COLOR_ID_BLUE LED_COLOR_ID_GREEN LED_COLOR_ID_RED>; }; };关键参数含义:
chain-length = <1>:SPI 总线上只挂了 1 颗灯珠;spi-max-frequency = <5250000>:SPI 时钟上限 5.25 MHz,符合 APA102 类器件的速率要求;color-mapping:声明送数顺序为蓝 → 绿 → 红(BG 序)。APA102 系列芯片的数据帧本身就是 BG 顺序,而 Zephyr LED strip 子系统通常以 RGB 顺序组织颜色,因此必须显式映射,否则颜色会串位;- 设备树顶层还定义了别名
led-strip = &apa102;,示例程序可通过DT_ALIAS(led_strip)直接找到该设备,无需硬编码节点名。
完整引脚分配(pinctrl)
板级 pinctrl 定义文件 adafruit_itsybitsy_nrf52840-pinctrl.dtsi 为每个外设分别声明了default与sleep两组引脚映射(sleep 组额外启用low-power-enable以降低休眠功耗)。整理后的完整引脚分配如下:
| 外设 | 信号 | 引脚 |
|---|---|---|
| UART0 | TX | P0.24 |
| UART0 | RX | P0.25 |
| I2C0 (TWIM) | SDA | P0.16 |
| I2C0 (TWIM) | SCL | P0.14 |
| SPI1 | SCK | P0.13 |
| SPI1 | MOSI | P0.15 |
| SPI1 | MISO | P0.20 |
| SPI2(DotStar) | SCK | P1.09 |
| SPI2(DotStar) | MOSI | P0.08 |
| QSPI | SCK | P0.19 |
| QSPI | IO0 | P0.21 |
| QSPI | IO1 | P0.22 |
| QSPI | IO2 | P1.00 |
| QSPI | IO3 | P0.17 |
| QSPI | CSN | P0.23 |
在 adafruit_itsybitsy_nrf52840.dts 中,各外设节点的启用状态为:
adc、gpiote、gpio0、gpio1、i2c0、spi1、spi2、qspi、usbd、ieee802154均为status = "okay";uart0被显式status = "disabled"——这与下文"控制台走 USB CDC"的设计一致:物理 UART 引脚虽然保留在 pinctrl 中,但默认不参与通信;reg1(LDO 调压器)设置regulator-initial-mode = <NRF5X_REG_MODE_DCDC>,让芯片上电后使用 DCDC 模式以降低功耗。
设备树关键配置解析
USB CDC ACM 作为控制台
文档 "Logging" 一节说明日志输出通过 USB-CDC 端口完成。其实现链路在设备树中一目了然:
- 启用 USB Device 控制器:
zephyr_udc0: &usbd { compatible = "nordic,nrf-usbd"; status = "okay"; };- 设备树末尾
#include <../boards/common/usb/cdc_acm_serial.dtsi>引入公共片段 boards/common/usb/cdc_acm_serial.dtsi,该片段在zephyr_udc0下挂了一个board_cdc_acm_uart子节点,并把zephyr,console、zephyr,shell-uart、zephyr,uart-mcumgr、zephyr,bt-mon-uart、zephyr,bt-c2h-uart等多个 chosen 节点全部指向它。
也就是说,串口控制台、Zephyr shell、MCUmgr、蓝牙 monitor 与 C2H 串口共享同一条 USB CDC ACM 通道。这就是为什么在这块板上启用CONFIG_SERIAL相关特性后,日志与 shell 直接出现在 USB 虚拟串口上,而无需外接 USB-TTL 转换器。文档建议参考logging示例与usb-cdc-acm-console示例来体验这一机制。
QSPI 外部 Flash 与内存分区
设备树将 2 MB 外部 Flash 声明为 GD25Q16 芯片:
gd25q16: gd25q16@0 { compatible = "nordic,qspi-nor"; reg = <0>; writeoc = "pp4o"; readoc = "read4io"; sck-frequency = <32000000>; jedec-id = [c8 40 15]; size = <16777216>; has-dpd; t-enter-dpd = <20000>; t-exit-dpd = <20000>; quad-enable-requirements = "S2B1v1"; };size = <16777216>即 16 MiB 位宽容量,换算正是 2 MB 字节数;- 写入使用 4 字节地址页编程(
pp4o),读取使用 Quad I/O 模式(read4io),时钟 32 MHz; has-dpd与t-enter-dpd/t-exit-dpd声明该芯片支持深度掉电模式,进入/退出各需 20 ms 延时,QSPI 驱动据此管理休眠时的芯片状态。
此外,外部 Flash 上还划出了一个 LittleFS 存储分区:
&gd25q16 { partitions { lfs_partition: partition@0 { label = "lfs_storage"; reg = <0x00000000 DT_SIZE_M(2)>; }; }; };而片上 1 MB Flash 的布局则由设备树引用的 dts/vendor/nordic/nrf52840_partition_uf2_sdv6.dtsi 给出,它面向 "UF2 引导程序 + SoftDevice S140 v6" 场景:
| 分区 | 起始地址 | 大小 | 说明 |
|---|---|---|---|
| SoftDevice | 0x00000000 | 152 kB | 只读,预置蓝牙协议栈 |
| Application | 0x00026000 | 792 kB | Zephyr 应用代码分区 |
| Storage | 0x000ec000 | 32 kB | 存储分区 |
| UF2 | 0x000f4000 | 48 kB | 只读,UF2 引导程序本体 |
设备树中的chosen节点将zephyr,flash、zephyr,sram、zephyr,code-partition分别指向flash0、sram0与code_partition,配合默认配置即可让链接脚本把应用正确放到 0x26000 之后。
默认 Kconfig
板级默认配置 adafruit_itsybitsy_nrf52840_defconfig 内容很短,但每项都有明确目的:
CONFIG_ARM_MPU=y # 使能 MPU 内存保护 CONFIG_GPIO=y # 使能 GPIO CONFIG_SERIAL=y CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y # 控制台(实际走 USB CDC ACM) CONFIG_USE_DT_CODE_PARTITION=y # 按设备树 code 分区放置代码 CONFIG_BUILD_OUTPUT_UF2=y # 构建产物生成 UF2 镜像其中CONFIG_USE_DT_CODE_PARTITION=y与上面 UF2 分区布局直接配合,CONFIG_BUILD_OUTPUT_UF2=y则保证west build的产物天然包含可直接拖拽烧录的zephyr.uf2文件——这正是该板烧录方式的基础。
用示例程序验证板卡功能
文档 "Testing LEDs and buttons" 一节推荐用三个官方示例验证板卡:
| 示例 | 验证对象 | 说明 |
|---|---|---|
blinky | 红色 LED(led0别名) | 确认 Zephyr 基本运行 |
button | 用户开关与红色 LED | 确认 GPIO 输入/输出 |
led-strip | DotStar(led-strip别名 →apa102) | 确认 SPI2 + LED strip 子系统 |
设备树中显式提供了一组"为示例程序服务"的别名:
aliases { led0 = &led0; sw0 = &button0; watchdog0 = &wdt0; led-strip = &apa102; };led0、sw0、watchdog0、led-strip都是 Zephyr 示例程序约定的通用别名,因此这些示例无需修改源码即可直接构建到本板。LED 与按键的具体引脚定义位于 boards/adafruit/itsybitsy/adafruit_itsybitsy_nrf52840.dts,如前文表格所列。
编程与调试
支持的调试/烧录运行器
board.cmake 通过 include 公共 runner 脚本声明了本板支持的运行器(文档中 "Supported Runners" 一节即由该文件展开):
bossac:经 boards/common/bossac.board.cmake 引入,用于 UF2 烧录;jlink:附加参数--device=nRF52840_xxAA --speed=4000;pyocd:附加参数--target=nrf52840 --frequency=4000000;nrfutil、nrfjprog、openocd(openocd-nrf5 公共配置)。
UF2 烧录流程
ItsyBitsy 出厂预置 Adafruit 的 BOSSA 兼容 UF2 引导程序,快速双击复位按钮即可进入引导模式。完整烧录步骤:
构建
blinky示例:west build -b adafruit_itsybitsy/nrf52840 samples/basic/blinky用 USB 线将 ItsyBitsy 连接到主机;
快速双击复位按钮,进入 bootloader 模式(此时设备枚举为
ITSY840BOOTU 盘);将构建产物
samples/basic/blinky/build/zephyr/zephyr.uf2拖拽到ITSY840BOOT盘;设备自动断开并重连,红色 LED 开始闪烁,即表示 Zephyr 运行正常。
由于adafruit_itsybitsy_nrf52840_defconfig已默认开启CONFIG_BUILD_OUTPUT_UF2=y,zephyr.uf2会在每次构建时自动生成,无需额外配置。
首次使用:引导程序更新
文档特别提示:部分批次该板出厂时带有 bug 的引导程序。建议首次使用前按照 Adafruit 官方的 "UF2 Bootloader update" 教程升级引导程序(该教程原本面向 Feather nRF52840,但操作步骤对 ItsyBitsy 同样适用),ItsyBitsy 专用的引导程序发布文件可在 Adafruit 的 nRF52 Bootloader 仓库(Adafruit_nRF52_Bootloader releases)中获取。文档说明 Zephyr 应用的构建与烧录已在UF2 引导程序 0.7.0版本上验证通过。
关键文件索引
| 文件 | 作用 |
|---|---|
| boards/adafruit/itsybitsy/doc/index.rst | 板级官方文档(本文核心依据) |
| boards/adafruit/itsybitsy/adafruit_itsybitsy_nrf52840.dts | 板级设备树:LED/按键/别名/QSPI 分区等 |
| boards/adafruit/itsybitsy/adafruit_itsybitsy_nrf52840-pinctrl.dtsi | 各外设 default/sleep 引脚映射 |
| boards/adafruit/itsybitsy/adafruit_itsybitsy_nrf52840_defconfig | 默认 Kconfig:MPU、控制台、UF2 输出 |
| boards/adafruit/itsybitsy/board.yml | 板级标识符、架构、支持特性清单 |
| boards/adafruit/itsybitsy/board.cmake | 支持的运行器及参数 |
| boards/adafruit/itsybitsy/Kconfig.adafruit_itsybitsy | 板级 Kconfig,选择 SoC 变体 |
| dts/vendor/nordic/nrf52840_partition_uf2_sdv6.dtsi | UF2 + SoftDevice v6 片上 Flash 分区布局 |
| boards/common/usb/cdc_acm_serial.dtsi | USB CDC ACM 控制台公共片段 |
适用前提说明:以上分区布局、UF2 引导流程均基于仓库当前版本的板级定义;若使用非 v6 版本的 SoftDevice 引导布局,需检查设备树所引用的分区 dtsi 是否匹配。板载引脚与功能特性以 Adafruit 官方 Learn 站点公布的 pinouts 与原理图为准(文档 References 一节指向该站点)。
【免费下载链接】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),仅供参考