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);
- 工具链:
zephyr与gnuarmemb; - 支持的外设: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.dts | nRF52840 变体的主设备树,定义 LED、按键、串口、I2C/SPI/PWM/QSPI/USB、Arduino 接口等全部外设节点 |
nrf52840dk_nrf52840-pinctrl.dtsi | nRF52840 变体的引脚复用(pinctrl)映射,定义各外设的 default/sleep 两组引脚状态 |
nrf52840dk_nrf52811.dts | nRF52811 模拟变体的设备树,额外定义了 mcuboot 分区布局 |
nrf52840dk_nrf52811-pinctrl.dtsi | nRF52811 模拟变体的引脚映射 |
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.yml | board 元数据(名称、厂商、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 按键,均为低电平有效并启用内部上拉:
| 按键 | 丝印 | 引脚 |
|---|---|---|
| BUTTON1 | SW1 | P0.11 |
| BUTTON2 | SW2 | P0.12 |
| BUTTON3 | SW3 | P0.24 |
| BUTTON4 | SW4 | P0.25 |
| BOOT | SW5 | boot/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~sw3、mcuboot-button0等别名。注意&gpio0节点中还通过gpio-reserved-ranges声明了被占用/保留的引脚区间,例如 P0.17~P0.23 被 QSPI 外接 Flash 占用(见 nrf52840dk_nrf52840.dts 的gpio-line-names注释)。
其它板载外设(来自设备树的细节)
除 LED 与按键外,主设备树还展示了板卡的完整外设接线:
- UART0(调试串口):作为
zephyr,console、zephyr,shell-uart、zephyr,uart-mcumgr、zephyr,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;
- USB:
nordic,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,与设备树中uart0的current-speed = <115200>一致。
构建并烧录 hello_world
以 Zephyr 自带的 hello_world 示例为例,在 Zephyr 环境初始化后执行:
$ west build -b nrf52840dk/nrf52840 samples/hello_world $ west flashwest 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/blinky、west build -b nrf52840dk/nrf52840 samples/basic/button并west 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;- 每个外设需要提供default与sleep两套引脚状态,通过
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-up、low-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=yCONFIG_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),仅供参考