- 操作系统
- 嵌入式
- RTOS
- 物联网
【免费下载链接】zephyr
Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.
本文基于 Zephyr RTOS 仓库中 boards/qorvo/decawave_dwm1001_dev/doc/index.rst 展开,系统讲解 Qorvo(原 Decawave)DWM1001-DEV 开发板在 Zephyr 中的支持情况:从板级设备树(DTS)、引脚复用、Kconfig 配置,到基于 J-Link OB 的构建、烧录与调试流程。读完本文,你将能够独立完成该板卡的 hello_world 示例构建与烧录,并理解其 UWB 无线定位模块 DW1000 在 Zephyr 中的驱动集成方式。
板卡概述:DWM1001 模块与开发板
DWM1001-DEV 是 Decawave(现已被 Qorvo 收购)推出的超宽带(UWB)开发板。Zephyr 仓库中的 board.yml 将其标识为:
- 板卡名称:
decawave_dwm1001_dev,全称 Decawave DWM1001 - 厂商:
qorvo - 板载 SoC:
nrf52832
DWM1001 模块本身集成了两块核心芯片:Nordic nRF52832 蓝牙 SoC(负责应用处理)与 Decawave DW1000 UWB 收发器(负责 IEEE 802.15.4 UWB 物理层通信)。开发板在此基础上增加了:
- 电池连接器与充电电路:支持电池供电与充电管理;
- LED 与按键:用户交互;
- Raspberry-Pi 兼容排针:便于与树莓派等主机对接;
- USB 连接器:供电与数据;
- 板载 J-Link OB:提供 SWD 调试、虚拟串口(Virtual COM Port)与 Segger RTT 能力。
从 decawave_dwm1001_dev.dts 可以看到其设备树模型声明为model = "Decawave DWM1001-DEV"、compatible = "decawave,dwm1001",这也是应用中通过 devicetree 匹配该板卡的关键标识。
板级硬件资源:从设备树看外设分布
decawave_dwm1001_dev.dts 是理解该板卡能力的第一手资料。它基于 Nordicnrf52832_qfaa.dtsi展开,并引入了独立的引脚复用描述文件 decawave_dwm1001_dev-pinctrl.dtsi。
系统角色分配(chosen 节点)
chosen { zephyr,console = &uart0; zephyr,shell-uart = &uart0; zephyr,uart-mcumgr = &uart0; zephyr,bt-mon-uart = &uart0; zephyr,bt-c2h-uart = &uart0; zephyr,sram = &sram0; zephyr,flash = &flash0; zephyr,code-partition = &slot0_partition; zephyr,ieee802154 = &ieee802154; };uart0同时承担控制台、shell、mcumgr 以及蓝牙监控/主机通信的角色,波特率在 decawave_dwm1001_dev.dts 中固定为current-speed = <115200>。zephyr,ieee802154指向板载的 DW1000 节点,表明该板卡在 Zephyr 中默认作为 802.15.4(UWB)无线节点使用。
板载外设
| 外设 | 节点 | 引脚/参数 | 说明 |
|---|---|---|---|
| 红色 LED 0 | led0_red | P0.14,低电平有效 | GPIO LED |
| 绿色 LED 1 | led1_green | P0.30,低电平有效 | GPIO LED |
| 红色 LED 2 | led2_red | P0.22,低电平有效 | GPIO LED |
| 蓝色 LED 3 | led3_blue | P0.31,低电平有效 | GPIO LED |
| 红色 PWM LED | pwm_led0_red | PWM0 通道 0,P0.22,20ms 周期,极性反转 | 可用于呼吸灯等 PWM 效果 |
| 按键 | button0 | P0.2,上拉 + 低电平有效 | 映射为INPUT_KEY_0 |
aliases节点将sw0、led0~led3、pwm-led0、watchdog0、accel0等别名导出,以便 samples 直接引用。值得注意的是accel0 = &lis2dh12:板载了一颗 ST LIS2DH12 加速度计,挂在 I2C0 总线上(地址0x19),中断引脚为 P0.25。
总线与外设配置
- UART0:使用
nordic,nrf-uart驱动,默认与睡眠两套引脚配置; - I2C0:使用
nordic,nrf-twim,时钟频率为I2C_BITRATE_FAST(400 kHz),SDA/SCL 位于 P0.29/P0.28,启用上拉; - SPI1:使用
nordic,nrf-spi,CS 为 P0.3; - SPI2:使用
nordic,nrf-spi,CS 为 P0.17(低有效),其上挂载了核心的DW1000节点; - ADC:
status = "okay"使能; - PWM0:输出到 P0.22(与红色 LED 2 复用,启用极性反转);
- UICR:设置
gpio-as-nreset,启用 GPIO 作为复位控制; - GPIO / GPIOTE:均使能,支撑按键与中断功能。
引脚复用的完整映射(TX/RX/SCK/MOSI/MISO 等)集中在 decawave_dwm1001_dev-pinctrl.dtsi 中,且每个外设都同时提供default与sleep两套状态,睡眠态启用low-power-enable以降低静态功耗——这体现了 Zephyr pinctrl 机制在低功耗场景下的典型用法。
核心无线模块:DW1000 UWB 收发器
DWM1001 的亮点在于其 UWB 能力。设备树中 DW1000 节点如下(位于 SPI2 上):
ieee802154: dw1000@0 { compatible = "decawave,dw1000"; spi-max-frequency = <8000000>; int-gpios = <&gpio0 19 GPIO_ACTIVE_HIGH>; /* P0.19 中断 */ reset-gpios = <&gpio0 24 GPIO_ACTIVE_LOW>; /* P0.24 复位 */ status = "okay"; reg = <0>; };该节点由 Zephyr 的 IEEE 802.15.4 驱动栈承载,驱动实现在 drivers/ieee802154/ieee802154_dw1000.c,配套的寄存器定义见 drivers/ieee802154/ieee802154_dw1000_regs.h。驱动的使能依赖 Kconfig 中的 IEEE802154 与 SPI 选项——在 Kconfig.defconfig 中可以看到:
config SPI default y depends on IEEE802154即只要启用了 IEEE802154 无线协议栈,SPI 总线会自动开启以驱动 DW1000。这一设计保证了 DW1000 的 SPI 通信始终可用,支撑 UWB 测距/定位应用的开发。
默认软件配置与 Kconfig 选项
板级 defconfig 文件 decawave_dwm1001_dev_defconfig 给出了板卡的默认软件配置:
# 使能 MPU CONFIG_ARM_MPU=y # 使能 Segger RTT CONFIG_USE_SEGGER_RTT=y # 使能 GPIO CONFIG_GPIO=y # 使能 UART 驱动 CONFIG_SERIAL=y # 使能控制台 CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y CONFIG_RTT_CONSOLE=y要点解读:
CONFIG_ARM_MPU=y:启用 ARM MPU,为应用提供内存保护;CONFIG_USE_SEGGER_RTT=y与CONFIG_RTT_CONSOLE=y:由于板载 J-Link OB 支持 RTT,控制台输出既可以通过 USB 虚拟串口(CONFIG_UART_CONSOLE)查看,也可以通过 Segger RTT Viewer 查看,二者同时可用;CONFIG_GPIO、CONFIG_SERIAL、CONFIG_CONSOLE:保证 LED、按键、串口控制台开箱即用。
板卡选择由 Kconfig.decawave_dwm1001_dev 定义:
config BOARD_DECAWAVE_DWM1001_DEV select SOC_NRF52832_QFAA而 Kconfig.defconfig 中的config I2C / default SENSOR保证启用传感器框架时 I2C(LIS2DH12 加速度计依赖)随之开启。此外 board.yml 声明该板卡为arm架构 MCU,RAM 64 KB、Flash 512 KB(对应 nRF52832 的 512KB Flash / 64KB RAM),支持 Zephyr 与 GNU ARM Embedded 两套工具链。
Flash 分区布局与 MCUboot 支持
decawave_dwm1001_dev.dts 中定义了完整的 Flash 分区表,支持 MCUboot 引导加载与固件升级:
| 分区 | 起始地址 | 大小 | 标签 |
|---|---|---|---|
| boot_partition | 0x00000000 | 0xc000(48 KB) | mcuboot |
| slot0_partition | 0x0000c000 | 0x32000(200 KB) | image-0 |
| slot1_partition | 0x0003e000 | 0x32000(200 KB) | image-1 |
| scratch_partition | 0x00070000 | 0xa000(40 KB) | image-scratch |
| storage_partition | 0x0007a000 | 0x6000(24 KB) | storage |
chosen中的zephyr,code-partition = &slot0_partition表明应用程序默认烧写到 slot0。这一布局与 Nordic 生态的 DFU(固件升级)流程一致,若使用 MCUboot 进行 A/B 升级,两个 200KB 的镜像槽位可以容纳大部分 Zephyr 应用。
构建、烧录与调试
环境准备:J-Link 工具链
DWM1001-DEV 板载 J-Link OB,烧录与调试完全复用 Nordic nRF5x 的开发工具链。参考 doc/develop/flash_debug/nordic_segger.rst 完成以下安装:
- Segger J-Link 软件包:提供 J-Link 固件、桌面工具、SWD 调试、拖放烧录的 Mass Storage 设备、USB CDC ACM 虚拟串口、RTT 控制台与 Ozone 调试器;
- nRF5x 命令行工具(nrfjprog):用于擦除、编程与复位目标芯片。
安装完成后,确认nrfjprog位于 PATH 中。Linux 下若使用虚拟串口,可将当前用户加入dialout组并重新登录;若系统装有 ModemManager,建议先停止它(systemctl stop ModemManager.service)以免其向 TTY 设备发送 AT 指令干扰串口通信。
查看串口输出
原文档给出了使用 minicom 监听串口的示例:
$ minicom -D <tty_device> -b 115200其中<tty_device>替换为开发板的串口设备节点,例如 Linux 下的/dev/ttyACM0(波特率与设备树中uart0的current-speed = <115200>一致)。也可以直接使用west的串口监视能力或其他终端工具。
构建并烧录 hello_world
以 samples/hello_world 为例,构建并烧录:
$ west build -b decawave_dwm1001_dev samples/hello_world $ west flashwest build -b decawave_dwm1001_dev指定板卡,west flash会自动选择可用的 runner 完成烧录。烧录完成后,hello_world 会在串口上打印经典的 "Hello World!" 与 Zephyr 版本信息。
支持的烧录与调试后端(Runners)
board.cmake 声明了三种烧录后端及其参数:
board_runner_args(jlink "--device=nRF52832_xxAA" "--speed=4000" "--reset-after-load") board_runner_args(pyocd "--target=nrf52832") set(OPENOCD_NRF5_SUBFAMILY "nrf52") include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake) include(${ZEPHYR_BASE}/boards/common/openocd-nrf5.board.cmake)- J-Link(默认优先):以
nRF52832_xxAA为目标器件,SWD 时钟 4000 kHz,烧录后自动复位运行; - pyOCD:目标为
nrf52832; - OpenOCD:使用 nRF52 子系列配置。
三者均可通过west flash/west debug使用;也可以绕过 runner 直接使用 nrfjprog 手动烧录:
$ nrfjprog --eraseall -f nrf52 $ nrfjprog --program build/zephyr/zephyr.hex -f nrf52 $ nrfjprog --reset -f nrf52调试与 RTT 输出
由于板载 J-Link OB,除 SWD 单步调试外,还可以使用 Segger RTT 查看控制台日志(配合 defconfig 中的CONFIG_USE_SEGGER_RTT=y与CONFIG_RTT_CONSOLE=y)。这在虚拟串口被占用或需要低延迟日志时尤为实用。west debug可启动 J-Link 调试会话(如 Ozone / GDB 后端),具体配置沿用 nordic_segger 文档中的通用 Nordic 流程。
扩展阅读
- 板卡设备树与分区:decawave_dwm1001_dev.dts
- 引脚复用:decawave_dwm1001_dev-pinctrl.dtsi
- 板级 Kconfig:Kconfig.decawave_dwm1001_dev、Kconfig.defconfig
- 构建/烧录后端:board.cmake
- DW1000 无线驱动:drivers/ieee802154/ieee802154_dw1000.c 与 寄存器定义
- Nordic J-Link 工具链安装:doc/develop/flash_debug/nordic_segger.rst
- Qorvo 板卡系列索引:boards/qorvo/index.rst
需要注意的是,以上构建与烧录流程适用于当前仓库版本所支持的 Zephyr 工具链环境;实际使用时请以仓库内west.yml声明的版本依赖为准。
- 操作系统
- 嵌入式
- RTOS
- 物联网
【免费下载链接】zephyr
Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.
相关推荐
RIOT OS 支持 Decawave DWM1001 板卡:硬件配置、烧录流程与 UART 串口实战
RIOT OS 支持 Decawave DWM1001 板卡:硬件配置、烧录流程与 UART 串口实战 本文基于 RIOT 仓库中 boards/dwm1001
物联网嵌入式操作系统实时系统Decawave DWM3001CDK 开发板 Zephyr 使用指南:板载资源、环境配置与烧录调试
Decawave DWM3001CDK 开发板 Zephyr 使用指南:板载资源、环境配置与烧录调试 Decawave DWM3001CDK 是 Qorvo(D
操作系统嵌入式RTOS物联网Zephyr 中 RSK-RX140 开发板支持详解:从板级硬件到 E2 Lite 烧录与调试
Zephyr 中 RSK RX140 开发板支持详解:从板级硬件到 E2 Lite 烧录与调试 导读 本文围绕 Zephyr RTOS 仓库中 RSK RX14
操作系统嵌入式RTOS物联网
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考