news 2026/9/19 10:17:11

Zephyr 开发指南:nRF52840 DK (PCA10056) 板级支持详解与实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Zephyr 开发指南:nRF52840 DK (PCA10056) 板级支持详解与实战

Zephyr 开发指南:nRF52840 DK (PCA10056) 板级支持详解与实战

【免费下载链接】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 仓库中的 nRF52840 DK(PCA10056)板级文档为核心,系统讲解该开发板在 Zephyr RTOS 中的硬件资源映射、LED/按键引脚定义、应用构建与烧录调试流程、UART1 引脚重映射方法,以及使用 nRF52840 DK 模拟开发 nRF52811 芯片的方案。读完本文,你将掌握 nRF52840 DK 在 Zephyr 中的完整开发套路:从 board 目录结构、设备树(DTS)引脚配置、pinctrl 复用,到用 overlay 文件自定义外设引脚,并能独立完成 blinky/button 等示例的验证与 UART 引脚的按需调整。

板卡总览:PCA10056 与 nRF52840 SoC

nRF52840 Development Kit(硬件型号 PCA10056)是 Nordic Semiconductor 官方推出的开发板,板载一颗 nRF52840 处理器,其内核为 ARM Cortex-M4F(带浮点单元)。在 Zephyr 中,该板对应的 board 标识为nrf52840dk/nrf52840,完整的板级定义位于 boards/nordic/nrf52840dk 目录。

从 board.yml 可以看到,该 board 实际声明了两颗 SoC 变体:

  • nrf52840:板卡上真实焊接的 nRF52840(PCA10056 原装);
  • nrf52811:通过软件约束模拟 nRF52811 的变体(详见下文"nRF52811 模拟"章节)。

资源规格

boards/nordic/nrf52840dk/nrf52840dk_nrf52840.yaml 中声明了该变体的基础资源与 Zephyr 支持的外设能力:

  • 架构:arm;
  • RAM:256 KB;
  • Flash:1024 KB(1 MB);
  • 工具链:zephyrgnuarmemb
  • 支持的外设:adc、gpio、i2c、i2s、pwm、spi、usb_device/usbd、watchdog、counter、arduino_gpio/arduino_i2c/arduino_serial/arduino_spi,以及netif:openthread网络接口。

时钟

nRF52840 DK 板载两颗外部晶振:

  • 慢速时钟(低频):32.768 kHz,通常用于 RTC、低功耗唤醒等场景;
  • 主时钟(高频):32 MHz,作为系统主时钟源。

板级目录结构与关键文件

在动手写应用前,先了解boards/nordic/nrf52840dk目录下的文件分工,这对理解后续配置非常关键:

文件作用
nrf52840dk_nrf52840.dtsnRF52840 变体的主设备树,定义 LED、按键、串口、I2C/SPI/PWM/QSPI/USB、Arduino 接口等全部外设节点
nrf52840dk_nrf52840-pinctrl.dtsinRF52840 变体的引脚复用(pinctrl)映射,定义各外设的 default/sleep 两组引脚状态
nrf52840dk_nrf52811.dtsnRF52811 模拟变体的设备树,额外定义了 mcuboot 分区布局
nrf52840dk_nrf52811-pinctrl.dtsinRF52811 模拟变体的引脚映射
nrf52840dk_nrf52840_defconfig/nrf52840dk_nrf52811_defconfig板级默认 Kconfig 配置(MPU、GPIO、UART、Console)
Kconfig.defconfig/Kconfig.nrf52840dk板级 Kconfig 逻辑与 SoC 选择
board.cmake定义烧录/调试 runner(jlink、pyocd、nrfutil、nrfjprog、openocd 等)
board.ymlboard 元数据(名称、厂商、SoC 列表)

硬件连接与 IO 映射

LED(发光二极管)

板载 4 颗绿色 LED,均位于 P0 端口,且为低电平有效(GPIO 输出低时点亮):

LED引脚
LED1(绿色)P0.13
LED2(绿色)P0.14
LED3(绿色)P0.15
LED4(绿色)P0.16

对应到设备树 nrf52840dk_nrf52840.dts 中的leds节点,每个 LED 被定义为gpio-leds兼容的节点,例如:

led0: led_0 { gpios = <&gpio0 13 GPIO_ACTIVE_LOW>; label = "Green LED 0"; };

并在aliases中导出led0~led3别名(同时导出pwm-led0指向 PWM 通道),这是示例代码通过LED0等宏直接控制板载 LED 的基础。

按键(Push buttons)

板载 4 个用户按键加 1 个 BOOT 按键,均为低电平有效并启用内部上拉

按键丝印引脚
BUTTON1SW1P0.11
BUTTON2SW2P0.12
BUTTON3SW3P0.24
BUTTON4SW4P0.25
BOOTSW5boot/reset(复位/进入 bootloader)

设备树中按键被声明为gpio-keys节点并带zephyr,code输入事件码(INPUT_KEY_0~INPUT_KEY_3),例如:

button0: button_0 { gpios = <&gpio0 11 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; label = "Push button switch 0"; zephyr,code = <INPUT_KEY_0>; };

同时在aliases中提供sw0~sw3mcuboot-button0等别名。注意&gpio0节点中还通过gpio-reserved-ranges声明了被占用/保留的引脚区间,例如 P0.17~P0.23 被 QSPI 外接 Flash 占用(见 nrf52840dk_nrf52840.dts 的gpio-line-names注释)。

其它板载外设(来自设备树的细节)

除 LED 与按键外,主设备树还展示了板卡的完整外设接线:

  • UART0(调试串口):作为zephyr,consolezephyr,shell-uartzephyr,uart-mcumgrzephyr,bt-mon-uart等多个 chosen 默认入口,波特率 115200;
  • UART1(Arduino 串口):即arduino_serial,TX=P1.02、RX=P1.01;
  • I2C0(Arduino I2C):SDA=P0.26、SCL=P0.27(即 Arduino D14/D15);
  • SPI3(Arduino SPI):SCK=P1.15、MISO=P1.14、MOSI=P1.13,片选 D10(P1.12);
  • QSPI:外接 64 Mbit(8 MB)MX25R64 NOR Flash,引脚 P0.17~P0.23;
  • USBnordic,nrf-usbd控制器默认开启;
  • IEEE 802.15.4 射频zephyr,ieee802154已启用,支持 OpenThread 等协议栈;
  • ADC:Arduino A0~A5 分别映射到 AIN1/2/4/5/6/7;
  • 电源reg1设置为 DCDC 模式(NRF5X_REG_MODE_DCDC),reg0使能。

上述映射同时解释了 yaml 中arduino_gpio/arduino_i2c/arduino_serial/arduino_spi支持项的来源。

构建、烧录与调试

构建与烧录前的准备

nRF52840 DK 使用板载 SEGGER J-Link 调试器进行烧录与调试。请先按照仓库中 Nordic 的 SEGGER 说明页安装并配置相关软件(J-Link 驱动与工具链),再按 Zephyr 标准的构建与运行流程操作。

该板支持的烧录后端在 board.cmake 中声明,主要包括:

  • jlink--device=nRF52840_xxAA --speed=4000
  • pyocd--target=nrf52840 --frequency=4000000
  • nrfutil/nrfjprog(Nordic 官方工具,nrfutil 额外携带 QSPI 外部 Flash 配置);
  • openocd-nrf5

监听串口输出

烧录前先用终端程序打开调试串口,Linux 下典型设备节点为/dev/ttyACM0(具体以系统识别为准):

$ minicom -D /dev/ttyACM0 -b 115200

波特率固定为 115200,与设备树中uart0current-speed = <115200>一致。

构建并烧录 hello_world

以 Zephyr 自带的 hello_world 示例为例,在 Zephyr 环境初始化后执行:

$ west build -b nrf52840dk/nrf52840 samples/hello_world $ west flash
  • west build -b nrf52840dk/nrf52840指定 board 变体并编译;
  • west flash使用默认 runner(通常是 jlink)完成烧录。

烧录完成后,程序启动输出即可在 minicom 终端中看到Hello World!字样。

调试

如需调试,参照 Nordic 板卡与 SEGGER 调试器相关的文档进行配置,使用west debug即可启动调试会话:

$ west debug

用 blinky 与 button 验证板卡工作状态

官方提供了两个示例用于验证板卡上的 LED 与按键是否在 Zephyr 下正常工作:

samples/basic/blinky samples/basic/button
  • blinky:周期性翻转 LED(通过LED0别名对应板载 LED1);
  • button:检测按键(通过sw0别名对应 BUTTON1),按键按下时切换 LED 状态。

分别执行west build -b nrf52840dk/nrf52840 samples/basic/blinkywest build -b nrf52840dk/nrf52840 samples/basic/buttonwest flash,即可直观确认 Zephyr 在板上的运行情况。LED 与按键的完整定义可以在设备树文件 nrf52840dk_nrf52840.dts 中查阅。

更换 UART1 引脚:overlay 与 pinctrl 实战

默认情况下 UART1 使用 P1.01(RX)与 P1.02(TX)(见 nrf52840dk_nrf52840-pinctrl.dtsi)。当应用需要把 UART1 换到其它引脚时,官方推荐的做法是在应用根目录添加 devicetree overlay 文件,通过west build -d build -b nrf52840dk/nrf52840 app -- -DDTC_OVERLAY_FILE=xxx.overlay(或放入app/boards/目录自动加载)来覆盖引脚配置。

完整 overlay 示例

以下示例将 UART1 的 TX 设为 P0.14、RX 设为 P0.16:

&pinctrl { uart1_default_alt: uart1_default_alt { group1 { psels = <NRF_PSEL(UART_TX, 0, 14)>, <NRF_PSEL(UART_RX, 0, 16)>; }; }; /* required if CONFIG_PM_DEVICE=y */ uart1_sleep_alt: uart1_sleep_alt { group1 { psels = <NRF_PSEL(UART_TX, 0, 14)>, <NRF_PSEL(UART_RX, 0, 16)>; low-power-enable; }; }; }; &uart1 { pinctrl-0 = <&uart1_default_alt>; /* if sleep state is not used, use /delete-property/ pinctrl-1; and * skip the "sleep" entry. */ pinctrl-1 = <&uart1_sleep_alt>; pinctrl-names = "default", "sleep"; };

关键点解读

  • NRF_PSEL(peripheral, port, pin)是 Nordic 引脚选择宏,参数依次为外设功能(如UART_TX/UART_RX)、端口号(0 或 1)、引脚号。上例中 P0.16 用于 RX,P0.14 用于 TX;
  • 每个外设需要提供defaultsleep两套引脚状态,通过pinctrl-names = "default", "sleep"关联。sleep 状态用于低功耗模式(CONFIG_PM_DEVICE=y时必须提供),其中的low-power-enable允许引脚在休眠时释放/低功耗处理;
  • 若应用不使用 sleep 状态,可删除pinctrl-1属性(/delete-property/ pinctrl-1;)并移除 sleep 条目;
  • 引脚分组(group1/group2)可按需拆分,同组内可放置多个psels,并可为每组单独设置bias-pull-uplow-power-enable等属性——参考板级 pinctrl 文件中uart0_default将 TX/RTS 与 RX/CTS 分组、并给 RX 组加bias-pull-up的写法。

更详细的 overlay 使用说明参见 Zephyr 文档中关于 devicetree overlays 的章节。

选脚原则:避开低频专用引脚

更换引脚时必须查阅 nRF52840 产品规格书第 7 章 "Hardware and Layout" 的表 7.1.1 "aQFN73 ball assignments",从中挑选标记为 "General purpose I/O" 的引脚。

特别注意:标记为"low frequency I/O only"(仅限低频 IO)的引脚只能在 10 kHz 以下的低频应用中使用,不适合 UART 115200 的波特率,选脚时务必避开这类引脚。

用 nRF52840 DK 模拟开发 nRF52811

Nordic 并未为 nRF52811 芯片推出独立开发套件,因此 Zephyr 提供了nrf52840dk/nrf52811这个 board 变体:它是对 nRF52840 DK 的修改版本,通过设备树与配置强制施加 nRF52811 芯片的资源限制,让你可以借用手中的 PCA10056 开发板直接为 nRF52811 开发固件。

从 nrf52840dk_nrf52811.yaml 可以看到该变体被约束为:

  • RAM:24 KB;
  • Flash:192 KB;
  • 支持外设:counter、pwm、gpio、netif:openthread(相比 nRF52840 变体大幅缩减,与 nRF52811 实际硬件能力对应)。

其设备树 nrf52840dk_nrf52811.dts 额外定义了适合 192 KB Flash 的 mcuboot 分区布局(boot 分区、slot0/slot1、storage 分区),并沿用 nRF52811 的 SoC 头文件<nordic/nrf52811_qfaa.dtsi>

使用方式与 nRF52840 变体完全一致:

$ west build -b nrf52840dk/nrf52811 samples/hello_world $ west flash

需要注意:板级默认配置 nrf52840dk_nrf52811_defconfig 中默认未启用 Bluetooth,注释说明这是为避免默认内核测试集在有限 RAM 下超限;如需蓝牙支持,请在应用的prj.conf中自行开启(nRF52811 本身支持 BLE)。

板级默认配置速查

nrf52840dk_nrf52840_defconfig 提供了 nRF52840 变体的最小默认配置,可作为理解板级裁剪的入口:

# Enable MPU CONFIG_ARM_MPU=y # enable GPIO CONFIG_GPIO=y # enable uart driver CONFIG_SERIAL=y # enable console CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y
  • CONFIG_ARM_MPU=y:启用 ARM MPU 内存保护;
  • CONFIG_GPIO=y+CONFIG_SERIAL=y:GPIO 与 UART 驱动;
  • CONFIG_CONSOLE=y+CONFIG_UART_CONSOLE=y:UART 控制台输出,保证 printf/printk 输出到调试串口。

另外 Kconfig.defconfig 中还包含两项关键细节:

  • ARCH_HAS_STACK_PROTECTION时默认开启硬件栈保护(HW_STACK_PROTECTION);
  • 使用 mcuboot 引导时,QSPI NOR Flash 布局页大小默认为 4096(NORDIC_QSPI_NOR_FLASH_LAYOUT_PAGE_SIZE),与板载 MX25R64 外置 Flash 配合。

总结

本文围绕 boards/nordic/nrf52840dk/doc/index.rst 展开,完整覆盖了 nRF52840 DK 在 Zephyr 中的板级资源(LED/按键/时钟/Arduino 接口)、构建烧录调试工作流(jlink/pyocd/nrfutil 多后端)、UART1 引脚重映射的 overlay 实战、选脚注意事项,以及 nRF52811 模拟开发这一特色能力,并补充了设备树与 pinctrl 源码层面的实现细节。无论你是首次在 PCA10056 上点亮 Zephyr,还是需要为特定应用定制引脚与分区,本文列出的文件路径与命令均可作为直接可用的起点。

参考资料

  • 板级文档:boards/nordic/nrf52840dk/doc/index.rst
  • nRF52840 设备树:nrf52840dk_nrf52840.dts
  • nRF52840 引脚映射:nrf52840dk_nrf52840-pinctrl.dtsi
  • nRF52811 模拟设备树:nrf52840dk_nrf52811.dts
  • board 元数据:board.yml 与 nrf52840dk_nrf52840.yaml
  • 烧录/调试配置:board.cmake
  • 板级默认配置:nrf52840dk_nrf52840_defconfig 与 nrf52840dk_nrf52811_defconfig
  • 验证示例:blinky 与 button

【免费下载链接】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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 10:17:01

Windows下Java -jar运行失败的三大根源与修复指南

1. 为什么一个简单的“java -jar xxx.jar”会失败十次&#xff1f;——从报错信息反推真实瓶颈你双击 jar 文件&#xff0c;弹出“无法打开此文件”&#xff1b;你在命令行敲下java -jar app.jar&#xff0c;却收到“找不到或无法加载主类”&#xff1b;你确认 JDK 已安装&…

作者头像 李华
网站建设 2026/9/19 10:16:17

10 分钟用 TaoToken 跑通 Dify 知识库 Agent 的 Token 链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 10:15:17

京东h5st 3.1签名逆向实战:从断点调试到环境校验

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华