Zephyr 开发 nRF21540 DK(nrf21540dk/nrf52840)开发板指南:引脚映射、烧录调试与 UART1 重映射实战
【免费下载链接】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
nRF21540 DK(PCA10112)是 Nordic Semiconductor 的官方开发板,将 nRF52840 主控 SoC 与 nRF21540 射频前端模块(Front End Module, FEM)集成在一起,用于验证和开发远距离、低功耗无线应用。本文以 Zephyr 仓库中该板的 板级文档 为主体,结合 设备树文件 与 引脚配置 等仓库源码,系统讲解该板的硬件布局、LED/按键/前端模块的引脚映射、构建烧录与调试流程、板载自检示例,以及如何通过 devicetree overlay 将 UART1 重映射到其他引脚。
nRF21540 DK 开发板实物图
板卡概述
nRF21540 DK 展示了 Nordic Semiconductor 的nRF21540 射频前端模块与nRF52840(ARM Cortex-M4F 内核)主控协同工作的完整方案。nRF21540 FEM 位于射频收发器与天线之间,用于放大发射/接收信号、扩展链路预算,从而提升无线通信的覆盖范围与可靠性;nRF52840 则负责应用逻辑、协议栈以及对外设的控制。二者通过 SPI 接口相连(详见下文“前端模块”一节)。
在 Zephyr 中,该板的 target 标识为nrf21540dk/nrf52840,其 SoC 配置在 Kconfig.nrf21540dk 中通过config BOARD_NRF21540DK并select SOC_NRF52840_QIAA关联到 nRF52840 QIAA 型号,板级信息(名称、厂商、SoC)记录在 board.yml 中。
硬件与时钟配置
nRF21540 DK 板载的 nRF52840 使用两颗外部晶振:
- 慢时钟(slow clock):32.768 kHz,作为低功耗 RTC 与看门狗等低速外设的时钟源;
- 主时钟(main clock):32 MHz,作为系统与高速外设的主时钟源。
板级默认配置定义在 nrf21540dk_nrf52840_defconfig 中,包含:
CONFIG_ARM_MPU=y:使能 ARM 内存保护单元;CONFIG_GPIO=y:使能 GPIO 驱动;CONFIG_SERIAL=y:使能串口驱动;CONFIG_CONSOLE=y、CONFIG_UART_CONSOLE=y:使能控制台与 UART 控制台,默认通过 UART0 输出。
此外,Kconfig.defconfig 中默认开启HW_STACK_PROTECTION(在架构支持栈保护的前提下),为应用提供更强的栈溢出检测能力。
支持的功能特性
Zephyr 通过zephyr:board-supported-hw::指令自动汇总该板在仓库中支持的外设(详见板级文档原始渲染结果)。从设备树源码 nrf21540dk_nrf52840.dts 可以确认板级已启用的外设包括:
uart0(nRF UARTE,默认 115200 波特率,作为 console/shell/蓝牙监测串口,见chosen节点);uart1(映射到 Arduino 串口,arduino_serial别名,115200);i2c0(arduino_i2c)、spi1、spi3(用于 FEM 控制);pwm0、adc、gpiote、gpio0/gpio1、nfct、usbd(Zephyr USB 设备);radio+ieee802154:nRF21540 FEM 通过fem = <&nrf_radio_fem>接入射频子系统,支持 802.15.4 协议栈。
更完整的硬件功能清单请参阅 nRF52840 与 nRF21540 的产品规格书及 nRF21540 DK 硬件手册(链接见文末“参考资料”)。
连接与 IO 映射
以下引脚映射可直接用于编写应用代码与 devicetree overlay,同时与 设备树源码 中的节点一一对应。
LED
板载 4 颗绿色 LED,均以低电平有效(GPIO_ACTIVE_LOW)方式驱动:
| 器件 | 引脚 |
|---|---|
| LED1(绿) | P0.13 |
| LED2(绿) | P0.14 |
| LED3(绿) | P0.15 |
| LED4(绿) | P0.16 |
对应设备树中的gpio-leds节点led0~led3,并提供了led0~led3别名,方便示例代码直接通过DT_ALIAS()引用。另外设备树还定义了一个 PWM LED(pwm-led0),使用pwm0输出、周期 20 ms、极性反转。
按键(Push buttons)
| 器件 | 丝印 | 引脚 |
|---|---|---|
| BUTTON1 | SW1 | P0.11 |
| BUTTON2 | SW2 | P0.12 |
| BUTTON3 | SW3 | P0.24 |
| BUTTON4 | SW4 | P0.25 |
| BOOT | SW5 | 启动/复位 |
设备树中对应gpio-keys节点button0~button3,均配置为上拉且低电平有效(GPIO_PULL_UP | GPIO_ACTIVE_LOW),并为按键关联了输入事件码(INPUT_KEY_0~INPUT_KEY_3),可直接配合 Zephyr 的 input 子系统使用。别名sw0~sw3供示例程序引用。
前端模块(nRF21540 FEM)
nRF21540 FEM 与 nRF52840 之间的控制信号与 SPI 接口引脚如下(与文档一致):
| 信号 | 引脚 |
|---|---|
| MOSI | P1.13 |
| MISO | P1.14 |
| CLOCK | P1.15 |
| CHIP SELECT | P0.21 |
| PDN | P0.23 |
| MODE | P0.17 |
| RXEN | P0.19 |
| ANTSEL | P0.20 |
| TXEN | P0.22 |
在设备树中,FEM 被建模为两个节点:
nrf_radio_fem(compatible 为nordic,nrf21540-fem):通过tx-en-gpios(P0.22)、rx-en-gpios(P0.19)、pdn-gpios(P0.23)、ant-sel-gpios(P0.20)、mode-gpios(P0.17)描述控制 GPIO,spi-if = <&nrf_radio_fem_spi>指向其 SPI 配置接口,supply-voltage-mv = <3000>声明供电电压;nrf_radio_fem_spi(compatible 为nordic,nrf21540-fem-spi):挂在spi3总线上,片选为 P0.21(低有效),spi-max-frequency = <8000000>(8 MHz)。
对应引脚复用定义在 nrf21540dk_nrf52840-pinctrl.dtsi 的spi3_default节点中:SCK=P1.15、MISO=P1.14、MOSI=P1.13,与上表完全吻合。最后通过&radio { fem = <&nrf_radio_fem>; };将 FEM 接入射频子系统。
构建、烧录与调试
nrf21540dk/nrf52840板配置的应用可以按 Zephyr 常规流程构建、烧录与调试。板上集成了 J-Link OB 调试器(基于 Segger),因此烧录与调试均通过 Segger J-Link 完成。
安装工具链与驱动
请先按照 Zephyr 文档中 Nordic 板卡的 Segger 工具说明,安装并配置所需软件(J-Link 软件与调试器驱动)。安装完成后,即可按标准方式构建与烧录应用。
监听串口输出
烧录前先打开串口终端监听板卡输出,nRF21540 DK 默认通过 USB 枚举为串口设备:
$ minicom -D <tty_device> -b 115200将<tty_device>替换为板卡对应的串口设备。例如在 Linux 下通常是/dev/ttyACM0。波特率固定为 115200。
构建并烧录 hello_world
以hello_world示例为例,构建并烧录:
$ west build -b nrf21540dk/nrf52840 samples/hello_world $ west flash也可以一步完成构建与烧录:
$ west build -b nrf21540dk/nrf52840 samples/hello_world -- -DCONFIG_... # 按需附加配置实际执行时,可在构建目录下直接使用west flash完成下载。Zephyr 应用构建与运行的一般性说明,可参考仓库中的 构建应用文档(build_an_application)与 应用运行说明(application_run)相关章节。
调试
如需调试,可参考 Nordic Segger 调试指南,使用 J-Link 配合 GDB 等工具进行断点调试、内存查看与单步执行。构建时加入-D调试信息并使用west debug(或west debugserver+ 外部 GDB)即可。
用 blinky 与 button 示例自检板卡
Zephyr 仓库提供两个示例用于验证 nRF21540 DK 的按键与 LED 是否正常工作:
samples/basic/blinky samples/basic/button- blinky:周期闪烁 LED(默认使用
led0,即 P0.13 上的绿色 LED1),用于确认系统时钟、GPIO 驱动与构建工具链工作正常; - button 示例(
samples/basic/button):读取按键状态并在串口打印,按下任意按键(如 SW1~SW4)即可看到对应事件输出,用于验证按键电路与 GPIO 中断路径。
将上述示例分别构建并烧录到板卡,即可确认 Zephyr 在该板上运行正确。按键与 LED 的完整设备树定义见 nrf21540dk_nrf52840.dts。
修改 UART1 引脚(通过 devicetree overlay)
当应用需要将 UART1 使用到另一组引脚时,可在应用目录下添加 devicetree overlay 文件。以将 UART1 的 TX 改到 P0.14、RX 改到 P0.16 为例:
- 在应用主目录中新建 devicetree overlay 文件(例如
app.overlay),内容如下:
&pinctrl { uart1_default_alt: uart1_default_alt { group1 { psels = <NRF_PSEL(UART_TX, 0, 14)>, <NRF_PSEL(UART_RX, 0, 16)>; }; }; /* 当 CONFIG_PM_DEVICE=y 时必须提供 sleep 状态 */ 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>; /* 如果未使用 sleep 状态,可删除 pinctrl-1 并去掉 "sleep" 项 */ pinctrl-1 = <&uart1_sleep_alt>; pinctrl-names = "default", "sleep"; };- 重新构建应用,overlay 会被自动合并到最终设备树中。上述示例中,P0.16 用作 RX、P0.14 用作 TX。
关于 devicetree overlay 的更多用法,可参考仓库中的 devicetree overlay 说明文档(set-devicetree-overlays)相关章节。
为什么需要 sleep 状态?
nRF 系列在使能设备电源管理(CONFIG_PM_DEVICE=y)时,外设进入低功耗状态需要一组专用的引脚配置。上例中的uart1_sleep_alt通过low-power-enable让相关引脚在休眠时保持正确状态、降低漏电。若应用未启用电源管理,则可以不定义 sleep 状态,并删除pinctrl-1与"sleep"项(overlay 注释中已给出提示)。
选择可用的引脚
引脚复用配置最终写入板级 pinctrl 文件(nrf21540dk_nrf52840-pinctrl.dtsi)。若要为自定义外设挑选引脚,请查阅 nRF52840 产品规格书第 7 章 “Hardware and Layout”,在表 7.1.1 “aQFN73 ball assignments” 中选择标记为“General purpose I/O”的引脚。
需要注意:标记为“low frequency I/O only”(仅低频 I/O)的引脚只能用于 10 kHz 以下的低频应用,不适用于 UART 115200 波特率等高速信号场景。选错引脚可能导致串口通信不稳定或功能异常。
板级默认引脚分配速查
| 外设 | 引脚(默认) | 说明 |
|---|---|---|
| UART0 | TX=P0.06, RX=P0.08, RTS=P0.05, CTS=P0.07 | 控制台/默认串口,115200 |
| UART1 | RX=P1.01, TX=P1.02 | Arduino 串口(D0/D1) |
| I2C0 | SDA=P0.26, SCL=P0.27 | Arduino I2C(D14/D15),与 SPI0 互斥 |
| SPI1 | SCK=P0.31, MOSI=P0.30, MISO=P1.08 | Arduino SPI 引脚 |
| SPI3 | SCK=P1.15, MISO=P1.14, MOSI=P1.13 | nRF21540 FEM 专用 |
| PWM0 | OUT0=P0.13 | PWM LED |
在设备树中,i2c0与spi0、i2c1与spi1存在引脚复用冲突,二者不能同时启用(源码中以注释明确标注,例如&i2c1 { /* Cannot be used together with spi1. */ })。编写 overlay 时应避免占用相互冲突的外设引脚。
参考资料
- 板级文档原文:boards/nordic/nrf21540dk/doc/index.rst
- 板级设备树:nrf21540dk_nrf52840.dts
- 板级引脚复用:nrf21540dk_nrf52840-pinctrl.dtsi
- 板级默认 Kconfig:nrf21540dk_nrf52840_defconfig
- 板卡信息:board.yml
- nRF21540 产品网站、nRF21540 产品规格书、nRF52840 产品规格书、nRF21540 DK 硬件手册、Segger J-Link 软件与文档包等外部资料链接见板级文档原文末尾的 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),仅供参考