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 就显得很从容了。
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 也简单了。
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 最适合以下三类场景:
- 高端可穿戴设备:比如智能手表、运动手环。需要同时跑蓝牙、传感器采集、图形显示,52840 的 Cortex-M4F 和 256KB RAM 能扛得住。
- 物联网网关:比如蓝牙 Mesh 网关、Thread 边界路由器。52840 支持多协议并发(BLE + Thread/Mesh),一颗芯片就能搞定。
- USB 蓝牙适配器:比如蓝牙转串口模块、无线鼠标接收器。内置 USB 控制器,省掉一颗桥接芯片。
我去年帮一个客户做「智能家居网关」,要求同时支持 BLE Mesh 和 Wi-Fi(通过 SPI 外接 ESP32)。52840 的 3 个 SPI 接口正好派上用场:一个接 Wi-Fi 模块,一个接 LCD 屏幕,一个留作调试。客户后来反馈说,选 52840 是整机最正确的决定——性能够、外设多、开发快。
总结一下:nRF52840 是一颗「水桶型」芯片。它没有特别突出的单项指标,但综合实力非常均衡。如果你做的是中高端 BLE 产品,选它基本不会错。但如果你追求极致低成本(比如 1 美元以下的 BLE 灯泡),那它可能有点「杀鸡用牛刀」了。
嗯,关于 52840 的深度解析就到这里。下一章咱们聊聊另一颗热门芯片——TI 的 CC2642R,看看它和 52840 相比,各自的优劣势在哪里。