NRF52840开发板实战:从BLE到Thread的多协议物联网开发指南
1. 从一块开发板开始为什么是NRF52840 Eval Kit如果你正在寻找一款能让你快速上手蓝牙低功耗BLE、Thread、Zigbee甚至NFC等无线技术的开发板并且希望它性能足够强劲、生态足够成熟那么Nordic Semiconductor的NRF52840 Eval Kit评估套件大概率会出现在你的候选清单前列。我手边这块板子已经陪我走过了好几个从原型验证到小批量试产的项目它远不止是一块“开发板”更像是一个功能齐全的“无线开发实验室”。NRF52840这颗芯片本身在物联网和穿戴设备领域可以说是明星级的存在。它基于ARM Cortex-M4F内核主频64MHz拥有1MB Flash和256KB RAM更重要的是集成了Nordic自家的多协议无线电支持蓝牙5.3、蓝牙Mesh、Thread、Zigbee、802.15.4和2.4GHz专有协议。这意味着你几乎可以用这一颗芯片覆盖绝大多数短距离无线应用场景。而Eval Kit就是官方为这颗芯片量身打造的最佳“舞台”。它把芯片的所有潜能都通过板载的接口、传感器和调试器暴露出来让你能跳过繁琐的硬件设计直接聚焦在应用开发和协议栈研究上。对于开发者来说这块板子的价值在于“开箱即用”和“深度可调”。新手可以借助丰富的示例代码和图形化配置工具nRF Connect SDK在几分钟内让LED闪烁、让蓝牙广播而资深工程师则可以深入到底层的Radio配置、功耗优化和天线匹配为产品量产做足准备。接下来我会结合自己实际的使用经验从硬件拆解、环境搭建、到第一个蓝牙应用和深入调试带你全面玩转这块强大的评估套件。2. 硬件深度解析板载资源与设计意图拿到NRF52840 Eval Kit第一感觉是接口丰富甚至有些“豪华”。这并非堆料每一处设计都对应着真实的开发与测试需求。理解这些硬件资源的用途能让你在后续开发中事半功倍。2.1 核心板与接口布局评估板的核心是一颗NRF52840-QIAA芯片这是芯片的BGA封装版本。围绕它板子提供了几乎所有的引脚扩展。正面最显眼的是那个10引脚的Debug接口它兼容标准的Arm Cortex-M Debug连接器可以直接连接J-Link、DAPLink等调试器。但更妙的是板子已经集成了一个Segger J-Link OB板载调试器你只需要一根USB线连接到板子的“J-Link”USB口就能同时完成供电、编程和调试这是对开发者最友好的设计之一。除了调试口板子上还有两个Micro-USB接口。一个标为“nRF USB”直接连接到NRF52840的USB控制器用于实现USB CDC串口、HID或大容量存储设备等功能。另一个就是刚才提到的“J-Link”口。这种分离设计非常清晰当你开发USB相关应用时数据流和调试流互不干扰。扩展接口方面板子边缘有两排密集的孔洞将NRF52840的所有GPIO除了少数用于模拟功能的都引了出来并以Arduino Uno Rev3的接口形式排列。这意味着你可以直接插上大量的Arduino兼容传感器扩展板Shield快速构建原型。同时板载了4个用户LED和4个用户按键这是最基本的人机交互单元。2.2 关键的射频部分与天线选择无线性能是这块板子的灵魂。板载了两套天线系统这是很多低成本开发板不具备的。第一套是PCB板载倒F天线PCB Antenna。它被印刷在电路板的左上角。这种天线成本低集成度高适合对空间要求苛刻的产品。在评估板上它让你能快速测试芯片的基本射频性能其辐射模式是定向的性能与摆放位置和周围环境尤其是你的手和桌面关系较大。第二套也是更专业的一套是通过U.FL连接器外接的偶极子天线Dipole Antenna。板子上预留了一个U.FL座子。当你需要更稳定、更优的射频性能进行测试时比如测量接收灵敏度、发射功率或者进行远距离测试就应该接上随板附赠或自行购买的2.4GHz偶极子天线。这种天线通常是全向的性能更接近最终产品中独立天线的效果。这里有一个非常重要的实操细节板子上有一个天线选择开关ANT SELECT。它是一个小小的贴片开关默认位置可能指向PCB天线。在你使用外接U.FL天线前必须手动将这个开关拨到“UFL”一侧。如果开关位置错误射频信号无法有效传递到外接天线会导致通信距离极短甚至完全失败。我就曾因为忽略了这个开关花了半天时间排查“为什么加了天线信号反而更差”的诡异问题。2.3 丰富的板载传感器与外部元件为了演示NRF52840丰富的模拟和数字接口能力板子上集成了一组实用的传感器数字环境光传感器通常是一颗APDS-9960它同时具备环境光感测、RGB颜色感测、接近检测和手势识别功能。通过I2C总线连接是学习I2C通信和传感器数据融合的好例子。数字麦克风一颗MP34DT05数字PDM输出可以直接连接到NRF52840的PDM接口用于实现语音触发、音频录制等低功耗音频应用。温湿度传感器可能是一颗HTS221或类似芯片通过I2C通信用于环境监测类应用。此外板载了一个64Mb的串行Flash芯片比如MX25R6435F通过QSPI接口连接。这可以用来存储日志、固件升级包、或者作为文件系统扩展存储空间。还有一个NFC标签芯片NT3H1101通过I2C连接展示了如何实现NFC配对、标签读写等交互功能。这些元件都不是“摆设”在nRF Connect SDK中都有对应的驱动Driver和示例Sample你可以直接拿来就用省去了自己画原理图、打样板、焊接调试的漫长过程。它们共同构成了一个微型的物联网节点原型。3. 开发环境搭建nRF Connect SDK与工具链抉择硬件熟悉之后就要准备软件武器。Nordic为NRF52840提供了两套主要的开发环境传统的nRF5 SDK和现代的nRF Connect SDKNCS。对于新项目我强烈推荐直接从NCS开始。3.1 nRF Connect SDK (NCS) 为何是现在的主流选择nRF5 SDK是一个相对传统的、围绕裸机或轻量级调度器如SoftDevice的SDK它成熟、稳定但模块化程度和对于复杂协议如Thread的支持不如NCS。而NCS则是一个基于Zephyr RTOS的、完全模块化的开发框架。Zephyr是一个Linux基金会旗下的开源实时操作系统专为资源受限的物联网设备设计。选择NCS有以下几个压倒性优势统一的代码库无论是开发BLE、Thread、Zigbee还是Wi-Fi对于其他Nordic芯片都使用同一套构建系统和API风格学习成本一次投入长期受益。强大的硬件抽象Zephyr的Devicetree设备树机制将硬件配置如哪个引脚连接LED使用哪个I2C总线与应用程序代码分离。同一份应用代码通过修改设备树文件可以轻松移植到不同的NRF52840开发板甚至其他架构的芯片上。丰富的组件与协议栈除了Nordic优化的蓝牙协议栈nRF Connect Bluetooth Low Energy还原生集成OpenThread、Zigbee协议栈以及大量的开源驱动、网络协议和中间件。未来的方向Nordic已将开发重心完全转向NCS所有新特性和芯片支持都会优先甚至只会在NCS上提供。3.2 一步一步搭建NCS开发环境搭建环境听起来麻烦但Nordic提供了非常便捷的工具——nRF Connect for Desktop它是一个桌面应用集成了多个工具插件。最核心的是Toolchain Manager。步骤一安装Toolchain Manager从Nordic官网下载并安装nRF Connect for Desktop。打开应用在“工具链管理器”Toolchain Manager插件中它会自动检测你的操作系统并推荐安装最新的NCS版本。点击安装它会自动下载并设置好包括编译器GNU Arm Embedded Toolchain、CMake、Ninja、Python依赖包等所有必要工具并配置好环境变量。这比手动配置省心太多。步骤二获取SDK和示例代码Toolchain Manager在安装工具链的同时也会将对应版本的NCS源代码下载到本地一个目录中例如C:\ncs\v2.5.0。这个目录里就包含了所有的库、协议栈、驱动和示例samples/和applications/目录。步骤三选择代码编辑器你可以使用任何文本编辑器但集成好的IDE能极大提升效率。主流选择有两个Visual Studio Code这是官方推荐且支持最好的。安装Nordic Semiconductor提供的“nRF Connect”扩展包。这个扩展提供了项目创建、构建、编译、烧录、调试、串口监视等一站式功能并与Toolchain Manager管理的工具链无缝集成。SEGGER Embedded Studio这是一款由Segger开发的优秀商用IDE对Nordic芯片有非常好的集成和优化其调试体验尤其出色。它有非商业用途的免费授权。我个人日常使用VS Code因为其生态活跃插件丰富与版本控制工具Git结合好。下面的操作也以VS Code为例。3.3 创建、构建并烧录第一个项目让我们用一个最简单的“Blinky”LED闪烁示例验证整个环境是否工作正常。打开示例项目在VS Code中按CtrlShiftP打开命令面板输入“nRF Connect: Show Examples”。在弹出的窗口中选择你的开发板型号例如nrf52840dk_nrf52840这就是NRF52840 Eval Kit在NCS中的设备名称。然后在示例列表中找到basic/blinky点击“复制示例”选择一个空目录存放你的项目。检查设备树在项目目录中打开boards/目录下的.overlay文件或查看nrf52840dk_nrf52840.dts文件。你会发现LED和按键的定义已经写好。例如LED0可能对应着P0.13引脚。这就是硬件抽象你的应用代码不需要关心具体引脚号。构建项目在VS Code中打开项目根目录。侧边栏的“NCS”活动栏会显示项目信息。点击底部的“构建”按钮或使用命令west build -b nrf52840dk_nrf52840 .工具链就会开始编译。第一次构建会下载一些依赖时间稍长。连接与烧录用USB线连接开发板的“J-Link”口到电脑。在VS Code的nRF Connect扩展中点击“烧录”按钮或使用命令west flash。如果一切正常你会看到编译输出然后程序被烧录到板子的Flash中。板子上标有LED1的绿色LED应该开始闪烁。注意如果烧录失败提示找不到J-Link设备请检查USB线是否完好且连接正确是J-Link口不是nRF USB口。电脑是否安装了Segger的J-Link驱动通常Toolchain Manager会一并安装但有时需要手动从Segger官网下载安装。在设备管理器中查看是否识别到了“J-Link CDC UART Port”和“J-Link driver”之类的设备。4. 深入蓝牙应用开发从广播器到复杂数据服务让LED闪烁只是第一步。NRF52840的核心价值在于无线连接。我们以最普遍的BLE为例看看如何快速开发一个功能完整的设备。4.1 理解BLE外设Peripheral的基本模型在BLE世界里你的评估板通常扮演“外设”角色比如手环、传感器向中心设备Central通常是手机提供数据和服务。一个典型的BLE外设包含以下几个层次GAP通用访问配置文件负责设备的广播、连接建立等通信层面的管理。比如设备叫什么名字Device Name以什么间隔广播Advertising Interval。GATT通用属性配置文件负责定义设备提供的“服务”Service和“数据”Characteristic。这是应用数据交换的核心。一个心率计可能提供一个“心率服务”里面包含一个“心率测量特征值”用于发送实时心率数据。在NCS中这些概念通过bt_le_adv_start(),bt_gatt_service_register()等API来实现但更常见的是使用更高级的“服务”定义方式。4.2 实现一个自定义的BLE服务以环境光传感器为例假设我们要把板载的环境光传感器数据通过BLE发送给手机。我们不需要从零开始写射频代码NCS提供了完整的层次。步骤一定义GATT服务在Zephyr/NCS中我们可以使用BT_GATT_SERVICE_DEFINE宏来静态定义服务。这比动态注册更简洁。例如我们可以定义一个“光感服务”UUID可以自定义如0xABCD其中包含一个“光强特征值”属性为可读Read和通知Notify这样手机既能主动读取也能在我们主动推送Notify时接收数据。// 自定义服务UUID (16位格式实际为128位简写) #define BT_UUID_CUSTOM_SERVICE_VAL 0xABCD #define BT_UUID_CUSTOM_SENSOR_VAL 0xABCE static struct bt_uuid_128 primary_service_uuid BT_UUID_INIT_128(BT_UUID_128_ENCODE(BT_UUID_CUSTOM_SERVICE_VAL, ...)); static struct bt_uuid_128 sensor_char_uuid BT_UUID_INIT_128(BT_UUID_128_ENCODE(BT_UUID_CUSTOM_SENSOR_VAL, ...)); // 光强特征值的读回调函数 static ssize_t read_light(struct bt_conn *conn, const struct bt_gatt_attr *attr, void *buf, uint16_t len, uint16_t offset) { uint16_t light_value read_apds9960(); // 假设的函数读取实际传感器值 return bt_gatt_attr_read(conn, attr, buf, len, offset, light_value, sizeof(light_value)); } // CCCD客户端特征配置描述符的回调用于处理手机开启/关闭通知的请求 static void cccd_changed(const struct bt_gatt_attr *attr, uint16_t value) { notif_enabled (value BT_GATT_CCC_NOTIFY); } // 定义服务 BT_GATT_SERVICE_DEFINE(my_sensor_svc, BT_GATT_PRIMARY_SERVICE(primary_service_uuid), BT_GATT_CHARACTERISTIC(sensor_char_uuid.uuid, BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY, BT_GATT_PERM_READ, read_light, NULL, NULL), BT_GATT_CCC(cccd_changed, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE), );步骤二初始化传感器与BLE栈在main()函数中我们需要依次初始化硬件驱动和蓝牙协议栈。void main(void) { int err; // 1. 初始化环境光传感器驱动 err apds9960_init(); // 伪代码实际调用传感器驱动初始化函数 if (err) { printk(Sensor init failed (err %d)\n, err); return; } // 2. 初始化蓝牙 err bt_enable(NULL); if (err) { printk(Bluetooth init failed (err %d)\n, err); return; } printk(Bluetooth initialized\n); // 3. 开始广播 err start_advertising(); if (err) { printk(Advertising failed to start (err %d)\n, err); return; } // 4. 主循环定期读取传感器并发送通知 while (1) { k_sleep(K_SECONDS(2)); // 每2秒一次 if (notif_enabled) { uint16_t light read_apds9960(); bt_gatt_notify(NULL, my_sensor_svc.attrs[1], light, sizeof(light)); } } }步骤三在手机上测试编译并烧录这个程序。打开手机上的BLE调试App如nRF Connect、LightBlue。扫描设备你应该能看到一个以“Zephyr”或你自定义名称广播的设备。连接后探索服务列表就能找到我们自定义的UUID为ABCD的服务以及其中的特征值。你可以点击“读”按钮获取当前光强或者点击“订阅”Notify/Indicate图标然后晃动开发板或改变光照就能在手机上实时收到数据更新。这个过程看似简单但背后是NCS的蓝牙协议栈、驱动框架和Zephyr RTOS的任务调度在协同工作。你写的应用代码只关心业务逻辑读传感器、发数据底层的连接管理、重传、加密等都由协议栈可靠地处理了。5. 功耗优化实战让设备运行数年而非数天很多物联网设备是电池供电的。NRF52840以其超低功耗著称但如果不加优化你的代码可能让电池几周就耗尽。功耗优化是产品化过程中至关重要的一环。5.1 测量与分析功耗的工具工欲善其事必先利其器。评估板本身没有集成电流表我们需要外接工具。专业方案使用高精度数字源表如Keysight的型号或专用的功耗分析仪如Nordic的Power Profiler Kit II。PPK II是Nordic官方的利器它可以通过图形化软件实时显示电流波形精确到微安甚至纳安级并能区分不同工作模式广播、连接、睡眠的功耗。简易方案在电池供电回路中串联一个精密的采样电阻例如10欧姆用示波器测量电阻两端的电压差根据欧姆定律I V/R计算电流。示波器可以捕获电流的瞬态峰值和动态变化。5.2 系统级低功耗策略最大化睡眠时间这是降低平均功耗的黄金法则。设备在大部分时间应该处于深度睡眠模式。在NCS/Zephyr中当所有线程Thread都进入空闲状态调用k_sleep()或等待信号量等内核对象时系统会自动进入低功耗模式对于NRF52840通常是System ON Idle模式。但这还不够深。使用挂起Suspend模式在应用代码中当你明确知道接下来有一段长时间比如几分钟无事可做时应该主动将系统置于更深的睡眠模式。可以使用pm_power_state_force()函数来请求进入特定的电源状态。NRF52840支持多种系统OFF模式如System OFF此时大部分时钟和RAM都会掉电功耗可低至0.3微安左右但唤醒后相当于复位重启。还有一种折中的模式是“深度睡眠”部分RAM保持通过配置CONFIG_PM_DEVICE和CONFIG_PM相关选项实现。外设电源管理不用的外设一定要关掉。在Zephyr中通过设备驱动接口device_power_domain或直接操作NRF的POWER寄存器关闭传感器、Flash、收音机等模块的电源。例如在读取完温湿度传感器后立即通过I2C发送一个关机命令如果传感器支持或者直接断开其电源如果硬件设计允许。5.3 无线连接期间的功耗优化即使设备处于连接状态也有大量优化空间。连接参数协商BLE连接由一系列参数控制最重要的是连接间隔Connection Interval。这是中心设备和外设之间交换数据的周期。间隔越长平均功耗越低但数据延迟越高。在建立连接时外设可以建议一个它偏好的连接参数最小间隔、最大间隔、从机延迟等。手机中心设备最终会决定使用什么参数。在NCS中可以通过struct bt_conn_le_create_param或GAP API来设置这些参数。对于低频更新的传感器如温湿度每分钟一次完全可以将连接间隔设置为1秒甚至更长。从机延迟Slave Latency这个参数允许外设在指定的连接事件中“睡觉”不理会中心设备的询问。例如连接间隔为100ms从机延迟为9意味着外设最多可以连续跳过9个连接事件只在第10个事件中醒来通信。这期间它处于睡眠状态大大降低了功耗。这非常适合那些大部分时间没有数据要发送的外设。广播优化对于非连接设备如信标优化广播间隔和广播数据长度。更长的广播间隔和更短的广播数据包能显著降低功耗。使用BT_LE_ADV_OPT_USE_IDENTITY等选项可以避免每次广播都改变随机地址从而减少手机端扫描处理的负担间接优化整体生态功耗。5.4 实际案例一个温湿度记录仪的功耗优化假设我们有一个设备每5分钟测量一次温湿度并通过BLE通知发送给手机其余时间深度睡眠。初始方案新手常见主循环里k_sleep(300秒)醒来后打开传感器、测量、初始化蓝牙、广播、连接、发送数据、断开、关闭传感器、继续睡眠。这个方案问题很大每次都要重新初始化蓝牙栈开销巨大连接建立过程功耗高。优化方案一保持连接设备上电后初始化蓝牙并建立连接。然后通过设置较长的连接间隔如4.5秒和适当的从机延迟让设备在连接间隙深度睡眠。每5分钟在应用层触发一次传感器读取和通知发送。这样避免了重复的连接/断开开销。但需要手机一直保持连接不灵活。优化方案二连接后快速睡眠这是更常见的方案。设备大部分时间深度睡眠System OFF。内置一个低功耗的RTC定时器NRF52840的LFCLK和RTC可以在深度睡眠下运行功耗极低。每5分钟RTC唤醒系统产生复位或中断。系统启动后快速初始化传感器、测量数据然后启动蓝牙以较快的广播间隔如20ms快速广播希望被手机发现并连接。一旦连接建立立即发送数据然后主动断开连接或等待手机断开最后系统再次进入深度睡眠。这里的关键是“快速”广播时间窗口要短连接建立后业务处理要快。这需要手机App端配合在约定时间点附近保持扫描和连接。通过使用PPK II测量方案三的平均电流可以轻松做到10微安以下。对于一颗1000mAh的纽扣电池理论续航可以超过10年。当然实际还要考虑电池自放电、传感器工作电流峰值等因素但做到1-2年的实际续航是完全可行的。6. 多协议与进阶功能探索NRF52840的“多协议”能力是其一大卖点。除了BLE你还可以在同一个硬件平台上探索其他网络。6.1 尝试OpenThreadMesh网络Thread是基于IEEE 802.15.4的IPv6 Mesh网络协议特别适合智能家居设备组网。NCS内置了完整的OpenThread协议栈。在VS Code的示例中你可以找到openthread/目录下的示例如cli命令行接口或cop边界路由器。搭建一个最简单的Thread网络至少需要两个设备。你可以用两块NRF52840评估板分别烧录cli示例。通过串口连接nRF USB口波特率115200连接到电脑在两个终端中分别操作在一个设备上输入ifconfig up、thread start它将成为Leader。在另一个设备上同样输入ifconfig up然后输入scan来搜索网络找到第一个设备的网络后使用panid、extpanid、networkname等命令配置相同的网络参数最后thread start。使用ping命令测试两个设备之间的IPv6连通性。你会看到即使两个设备不直接相邻如果中间有第三个路由设备数据也能自动路由。这就是Mesh网络的魅力。基于Thread你可以构建一个去中心化、自修复、低功耗的本地物联网。6.2 使用Zephyr的Devicetree与设备驱动前面提到硬件抽象是NCS/Zephyr的核心。在项目目录下的boards/子目录中.dts文件描述了开发板的硬件资源。例如LED可能被定义为/ { leds { compatible gpio-leds; led0: led_0 { gpios gpio0 13 GPIO_ACTIVE_LOW; label Green LED 0; }; }; };在你的C代码中你不需要知道LED连接在P0.13只需要通过DEVICE_DT_GET(DT_ALIAS(led0))获取设备指针然后用gpio_pin_set(dev, pin, value)来控制它。如果你想换一块板子只需要修改设备树文件应用代码完全不用动。这种“硬件描述与代码分离”的思想对于代码复用和项目管理至关重要。6.3 利用板载调试器进行高级调试板载的J-Link OB调试器功能强大。除了基本的烧录和单步调试你还可以实时变量监控在IDE的调试视图中添加对关键全局变量的监控观察其运行时的变化。RTT实时传输日志这是一种比UART更高效的日志输出方式。它通过调试接口传输数据不占用串口速度更快。在NCS中启用CONFIG_USE_SEGGER_RTTy就可以使用printk()输出到RTT并通过J-Link RTT Viewer工具在电脑上查看。性能分析使用J-Link的J-Scope工具可以实时图形化地显示指定内存地址如某个变量的值就像一台示波器对于观察传感器数据波形、系统状态机变化非常直观。功耗调试结合PPK II或外接电流表在代码中打点控制一个GPIO输出高低电平然后用示波器同时抓取电流波形和这个GPIO信号就能精确地将电流消耗与代码执行阶段对应起来找到功耗热点。7. 从评估板到产品原型必须考虑的跨越评估板是用来评估和原型开发的但最终产品需要自己的PCB。在这个过程中有几个关键点需要特别注意。7.1 射频电路设计成败在此一举NRF52840的射频性能高度依赖外围的匹配电路和PCB布局。评估板上的设计是经过优化的参考设计。射频匹配网络在芯片的RFIO引脚和天线之间有一个由电感电容组成的π型匹配网络。官方数据手册和参考设计会给出具体的元件值如2.2nH电感1pF电容。这些值不是绝对的它们会因你的PCB层叠结构、介电常数、天线型号而微调。最好能使用矢量网络分析仪VNA进行调试确保在2.4GHz频点上的阻抗匹配到50欧姆。失配会导致发射功率下降、接收灵敏度变差通信距离大打折扣。PCB布局射频走线尽可能短、直。使用微带线或共面波导计算好线宽以保持50欧姆特性阻抗。避免在射频路径上打过孔。电源去耦在芯片的每个电源引脚VDD附近放置一个100nF的陶瓷电容和一个更大容量的钽电容如10uF。这是为芯片内部的高速数字电路和射频电路提供瞬间电流、滤除噪声的关键。布局上小电容要尽可能靠近引脚。接地使用完整的接地平面。射频部分下方的地平面要完整不能有分割线穿过。天线选择与安装产品中常用的有陶瓷天线、PCB天线和外接天线。陶瓷天线体积小但性能一般方向性强。PCB天线免费但占面积需要净空区。外接天线如IPEX接口性能最好但成本高。无论哪种都必须严格按照天线厂商的规格书来设计PCB布局和净空区。7.2 时钟源的选择精度与功耗的权衡NRF52840需要两个时钟源一个高频时钟HFCLK给CPU和射频一个低频时钟LFCLK给RTC和低功耗定时。高频时钟通常使用内部RC振荡器64MHz精度±0.5%。这对于BLE通信通常足够因为协议本身有频率容错和同步机制。但如果需要更精确的射频性能或USB功能USB对时钟精度有要求则需要外接一个32MHz的晶体振荡器。评估板上就焊接了一个32MHz的晶体。低频时钟有三种选择内部RC振荡器功耗最低但精度很差可能±500ppm适用于对时间精度要求不高的深度睡眠定时。32.768kHz晶体精度高±20ppm功耗适中是大多数应用的选择。评估板上有这个晶体。外部低频时钟源如由主控提供的时钟信号。在软件配置prj.conf中你需要通过CONFIG_CLOCK_CONTROL_NRF_K32SRC_*这样的选项来指定你的硬件使用了哪种低频时钟源。配置错误会导致系统无法启动或功耗异常。7.3 生产编程与测试产品量产时不可能用J-Link一个一个烧录。你需要考虑编程接口保留一个简单的物理接口如测试点用于批量生产时的编程和测试。通常使用SWDSerial Wire Debug接口只需要四根线SWDIO SWDCLK VCC GND。可以使用便宜的J-Link EDU或DAPLink量产编程器。启动引导程序产品固件应该包含一个引导程序Bootloader比如NCS中的MCUboot。它可以通过串口、BLE或USB进行固件升级OTA DFU。在生产线上可以先烧录一个包含引导程序和初始应用镜像的Hex文件。射频测试量产时需要对每一片PCBA进行简单的射频性能测试至少确保它能正常广播和连接。可以设计一个简单的测试工装通过UART发送AT指令让设备进入测试模式发射特定功率的载波由近场探头或耦合器读取信号强度进行快速Pass/Fail判断。从一块功能强大的评估板开始到打造出稳定可靠的量产产品中间充满了工程细节的考量。NRF52840 Eval Kit的价值就在于它为你扫清了硬件和基础软件的障碍让你能集中精力在应用逻辑、协议理解和系统优化上最终将想法高效地转化为现实。