4、Nordic nRF52840深度解析:架构、内存、外设、SDK与协议栈、典型应用场景

好,咱们今天来聊聊 nRF52840。这颗芯片在 BLE 5.0 时代,可以说是现象级的产品。我当年做第一个多传感器物联网项目时,选型表上列了七八颗芯片,最后拍板用 52840,就是看中了它「啥都有」的底气。说白了,它不只是一颗蓝牙芯片,更像是一颗「全能型」的无线 MCU。

4.1 架构概览:一颗 Cortex-M4F 的「小钢炮」

nRF52840 的核心是一颗 64MHz 的 ARM Cortex-M4F。带 F 后缀,意味着它有硬件浮点运算单元。嗯,这里要注意,很多做传感器融合的工程师会忽略这个。你想想看,如果你要做卡尔曼滤波或者姿态解算,浮点运算用硬件算和用软件模拟,速度差好几倍。

它的架构图我建议你记住几个关键总线:

  • AHB-APB 桥接:外设挂载在 APB 总线上,CPU 通过 AHB 访问,速度有保障。
  • DMA 引擎:有独立的 EasyDMA 控制器,很多外设(比如 UART、SPI、TWI)都支持直接内存访问。
  • 多电源域:分成了恒开域(Always-On)和系统域。这在低功耗设计里非常关键。

我个人习惯,拿到新芯片第一件事就是看它的电源管理单元(PMU)。52840 的 PMU 支持 DCDC 和 LDO 两种模式。DCDC 效率高,但外围需要多一颗电感;LDO 简单,但功耗会高一些。我在项目中遇到过客户为了省成本去掉 DCDC 电感,结果电池续航直接砍半——这个坑,大家别踩。

4.2 内存配置:1MB Flash + 256KB RAM,够用吗?

52840 的存储配置是 1MB Flash 和 256KB RAM。这个组合在 BLE 芯片里算是「豪华配置」了。为什么这么说?

  • 1MB Flash:除了放协议栈(SoftDevice 大约占 150KB~200KB),你还能剩下 800KB 左右给应用代码。我做过一个 OTA 升级的项目,需要同时保留 Bootloader、两个应用镜像,再加上协议栈,Flash 空间依然绰绰有余。
  • 256KB RAM:这个比较有意思。BLE 协议栈本身会占用一部分 RAM(大约 30KB~50KB),剩下的给应用。如果你要做蓝牙 Mesh 节点,或者跑 Thread/Zigbee 的多协议应用,256KB 就显得很从容了。
我的小技巧:在 nRF5 SDK 里,你可以通过 sdk_config.h 精细调整协议栈的 RAM 占用。比如减少连接数量、关闭不必要的服务,都能省出几十 KB 的 RAM。我曾经把一个项目的 RAM 占用从 180KB 压到了 120KB,就靠这个。

4.3 外设资源:不只是蓝牙,它还是个「瑞士军刀」

52840 的外设丰富程度,在同代产品里是数一数二的。我列几个我觉得特别实用的:

外设 数量 我的评价
UART/EUART 2 个 支持 EasyDMA,波特率最高 1Mbps,够用
SPI/SPIM 3 个 主模式,支持 32MHz,驱动显示屏或传感器很爽
TWI/I2C 2 个 标准 I2C,挂载多个从设备没问题
ADC 12 位,8 通道 带过采样,可以做到 14 位有效分辨率
PWM 4 个 每个 4 通道,总共 16 路 PWM,做灯控或电机控制很合适
USB 1 个 支持 USB 2.0 全速,可以直接当 USB 蓝牙适配器用
QDEC 1 个 正交解码器,接旋转编码器不用额外芯片

这里我想重点说说 USB 外设。52840 是 Nordic 第一颗集成 USB 控制器的 BLE 芯片。我记得当时做一款「蓝牙转 USB 的加密狗」产品,以前需要两颗芯片(一颗 BLE + 一颗 USB 桥接),现在一颗 52840 全搞定。成本降了,BOM 也简单了。

注意:USB 外设的电源管理要小心。52840 的 USB 模块在挂起模式下功耗大约 2.5mA,如果你做的是电池供电的 USB 设备,记得在不需要 USB 时把它彻底关掉。我曾经因为这个疏忽,导致设备待机电流多了 2mA,电池寿命直接少了三分之一。

4.4 SDK 与协议栈:SoftDevice 的「双刃剑」

说到 nRF52840,就绕不开 Nordic 的 SDK 和 SoftDevice。我刚开始用的时候,说实话有点不适应——它把协议栈做成了一个独立的二进制文件(.hex),和用户应用代码分开编译、分开链接。

这样做的好处很明显:

  • 协议栈稳定:Nordic 自己维护,通过了蓝牙认证,你不用操心协议栈的 bug。
  • 升级方便:可以单独升级 SoftDevice,不影响应用代码。

但坏处也很直接:

  • 调试困难:协议栈是闭源的,你没法单步跟踪进去。遇到协议栈崩溃,只能靠日志和断言信息猜。
  • RAM 占用固定:SoftDevice 会预留一块固定的 RAM 区域,应用代码不能碰。如果你 RAM 紧张,这个设计会让人抓狂。

我给大家一个建议:不要直接操作 SoftDevice 的 API。Nordic 提供了 nRF5 SDK,里面封装好了各种服务(比如 UART over BLE、DFU 升级)。你直接调用 SDK 的接口就好,既安全又省事。

下面是一个最简单的 BLE 广播代码示例,用 SDK 实现:

#include "ble_advdata.h"
#include "ble_advertising.h"

static void advertising_init(void)
{
    ret_code_t err_code;
    ble_advdata_t advdata;
    ble_advdata_t scanrsp;

    // 初始化广播数据
    memset(&advdata, 0, sizeof(advdata));
    advdata.name_type          = BLE_ADVDATA_FULL_NAME;
    advdata.include_appearance = true;
    advdata.flags              = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;

    // 初始化扫描响应数据
    memset(&scanrsp, 0, sizeof(scanrsp));
    scanrsp.uuids_complete.uuid_cnt = 1;
    scanrsp.uuids_complete.p_uuids  = &m_adv_uuids;

    // 配置广播参数
    ble_advertising_init_t init;
    memset(&init, 0, sizeof(init));
    init.advdata   = &advdata;
    init.scanrsp   = &scanrsp;
    init.config    = &m_advertising_config;
    init.evt_handler = on_adv_evt;

    err_code = ble_advertising_init(&m_advertising, &init);
    APP_ERROR_CHECK(err_code);
}

你看,代码量很少。Nordic 把复杂的协议栈细节都藏起来了。你只需要关心广播数据怎么填、事件怎么处理就行。

4.5 典型应用场景:52840 最适合做什么?

根据我这几年的项目经验,nRF52840 最适合以下三类场景:

  1. 高端可穿戴设备:比如智能手表、运动手环。需要同时跑蓝牙、传感器采集、图形显示,52840 的 Cortex-M4F 和 256KB RAM 能扛得住。
  2. 物联网网关:比如蓝牙 Mesh 网关、Thread 边界路由器。52840 支持多协议并发(BLE + Thread/Mesh),一颗芯片就能搞定。
  3. USB 蓝牙适配器:比如蓝牙转串口模块、无线鼠标接收器。内置 USB 控制器,省掉一颗桥接芯片。

我去年帮一个客户做「智能家居网关」,要求同时支持 BLE Mesh 和 Wi-Fi(通过 SPI 外接 ESP32)。52840 的 3 个 SPI 接口正好派上用场:一个接 Wi-Fi 模块,一个接 LCD 屏幕,一个留作调试。客户后来反馈说,选 52840 是整机最正确的决定——性能够、外设多、开发快。

总结一下:nRF52840 是一颗「水桶型」芯片。它没有特别突出的单项指标,但综合实力非常均衡。如果你做的是中高端 BLE 产品,选它基本不会错。但如果你追求极致低成本(比如 1 美元以下的 BLE 灯泡),那它可能有点「杀鸡用牛刀」了。

嗯,关于 52840 的深度解析就到这里。下一章咱们聊聊另一颗热门芯片——TI 的 CC2642R,看看它和 52840 相比,各自的优劣势在哪里。