2. nRF52/nRF53/nRF54硬件资源剖析

多协议并发不是“把两个协议栈都编译进去”就能跑起来的功能,它首先是一道硬件资源分配题。nRF52、nRF53、nRF54 三代芯片虽然都围绕 2.4 GHz Radio 构建,但在外设互联、定时器资源、DMA 能力和内存分区上的差异,直接决定了并发方案的上限。理解这些资源,才能判断某个协议组合是否可行、需要牺牲哪些性能、以及冲突发生时该从哪里下手。

Radio 外设:唯一的射频通道

无论芯片型号如何,2.4 GHz Radio 始终是独占资源。它支持 BLE、802.15.4、私有 2.4 GHz 以及 Nordic 的 ESB(Enhanced ShockBurst)等模式,但同一时刻只能工作在一种模式、一个频点上。多协议并发的本质,是让多个协议栈分时复用这一个 Radio,而不是真正同时发射。Radio 内部包含频率合成器、调制解调器、包处理器和 RSSI 采样,切换协议时需要重新配置模式、速率、前导码、地址和 CRC 等寄存器,这些配置切换本身要消耗时间。

nRF52 系列(如 nRF52840)的 Radio 通过 PPI 与定时器、GPIO 联动,协议切换由软件在中断中完成。nRF53 系列(如 nRF5340)把 Radio 放在网络核(Network Core)上,应用核(Application Core)通过 IPC 与网络核通信,Radio 的实时控制被隔离在网络核内,这使 BLE 与 802.15.4 的并发调度更干净,但跨核通信带来额外延迟。nRF54 系列进一步提高了 Radio 的灵活性和能效,支持更细粒度的时隙调度和更快的模式切换,为高密度并发提供了硬件基础。

PPI 与 DPPI:让事件直接触发任务

PPI(Programmable Peripheral Interconnect)是 nRF52 的关键机制,它允许一个外设事件直接触发另一个外设任务,不经过 CPU。例如 TIMER 比较事件可以通过 PPI 触发 Radio 的 TXEN 或 RXEN 任务,实现精确到微秒级的收发时序。多协议并发中,PPI 通道是稀缺资源:每个协议栈都要占用若干通道来绑定定时器、Radio 和 GPIO,通道耗尽时只能退化为软件中断处理,时序抖动随之增大。

nRF53 和 nRF54 引入了 DPPI(Distributed PPI),把 PPI 通道分布到不同电源域和外设组中,每个域有独立的通道集合。DPPI 的好处是网络核和应用核可以各自使用本地通道,减少跨域竞争;同时 DPPI 支持更灵活的触发源和目标组合。配置时需要注意:某个外设属于哪个 DPPI 组、该组还剩多少通道、跨组触发是否需要额外路由。这些细节在 nRF52 上不存在,却是 nRF53/nRF54 并发设计必须核对的。

nRF52 / nRF53 / nRF54 多协议并发资源关系 2.4 GHz Radio BLE / 802.15.4 / ESB / 私有 BLE 协议栈 连接 / 广播 / 扫描 802.15.4 协议栈 Thread / Zigbee 私有 2.4G / ESB 低延迟自定义 分时复用 · 同一时刻仅一种模式 时隙调度与事件触发层 TIMER 比较事件 PPI / DPPI 通道 RTC 低功耗计时 EasyDMA 搬运 并发资源约束 Radio 独占 模式/频点切换耗时 PPI/DPPI 通道 数量有限,需分配 TIMER/RTC 实例与位宽限制 RAM / Flash 分区 协议栈与缓冲占用

TIMER 与 RTC:时基资源的分工

TIMER 提供高分辨率计数,适合驱动 Radio 的精确收发时序;RTC 则运行在低频时钟域,功耗极低,适合维持协议栈的调度节拍和超时计时。nRF52840 有 5 个 TIMER 和 3 个 RTC,看似充裕,但 BLE 协议栈本身会占用 RTC0 作为协议定时基准,SoftDevice 还会占用部分 TIMER 和 PPI。留给应用和第二个协议栈的资源往往只剩 1~2 个 TIMER 和少量 PPI 通道。

nRF5340 的网络核和应用核各自拥有独立的 TIMER/RTC 资源,BLE 控制器运行在网络核,应用核可以自由使用自己的定时器,这显著缓解了资源争抢。nRF54 系列进一步增加了定时器实例并优化了低功耗定时精度。实际分配时,建议把“协议栈固定占用”和“应用可分配”分开列表,先扣除协议栈占用,再评估剩余资源能否支撑第二个协议的时隙调度。

EasyDMA 与内存分区

EasyDMA 允许外设直接读写 RAM,无需 CPU 逐字节搬运。Radio、UARTE、SPIM、SAADC 等外设都支持 EasyDMA。多协议并发时,每个协议栈都需要自己的收发缓冲区和事件队列,这些缓冲区必须放在 EasyDMA 可访问的 RAM 区域。nRF52 的 EasyDMA 对缓冲区地址和长度有对齐要求,跨区域访问可能失败;nRF53/nRF54 的内存保护单元(MPU)和分区机制更严格,网络核与应用核的 RAM 物理隔离,跨核共享数据必须通过 IPC 和共享内存区完成。

Flash 分区同样关键。BLE 协议栈、802.15.4 协议栈、Bootloader 和应用各自占用独立的 Flash 区域。以 nRF52840 为例,SoftDevice S140 约占 150 KB,Thread 协议栈约 100~200 KB,若再叠加 Bootloader 和双协议应用,1 MB Flash 会相当紧张。分区表必须在链接脚本和协议栈配置中保持一致,否则会出现协议栈初始化失败或运行中越界。

并发资源约束的核对方法

面对一个具体的并发需求,可以按以下顺序核对资源:先确认 Radio 模式切换是否满足时隙间隔要求;再统计 PPI/DPPI 通道需求,扣除协议栈占用后看剩余量;接着分配 TIMER/RTC,确保高精度时序和低功耗计时各有归属;然后计算 RAM 缓冲总量,包括各协议栈的收发队列、EasyDMA 缓冲和共享内存;最后核对 Flash 分区,确认协议栈、应用和 Bootloader 不重叠。任何一项不足,都需要调整协议参数、降低并发密度或更换芯片型号。

在 nRF52 上做 BLE + 802.15.4 并发时,常见做法是让 BLE 保持连接但降低连接间隔,把更多时隙让给 802.15.4;同时用 RTC 维持 BLE 协议定时,用剩余 TIMER 驱动 802.15.4 的 CSMA/CA 退避计时。若 PPI 通道不足,可把非关键触发改为软件中断,但需接受更大的时序抖动。

示例:nRF52840 上 BLE 与私有 2.4G 并发的资源估算

假设使用 nRF52840,SoftDevice S140 已占用 RTC0、TIMER0、部分 PPI 通道和约 150 KB Flash、8 KB RAM。应用侧计划再运行一个私有 2.4G 协议,需要 1 个 TIMER、2 个 PPI 通道、4 KB 收发缓冲和 32 KB Flash。核对结果:TIMER 剩余 4 个,满足;PPI 若 S140 占用 8 个、总共 32 个,剩余 24 个,满足;RAM 若总 256 KB,扣除协议栈和系统后剩余约 180 KB,满足;Flash 1 MB 扣除 S140、Bootloader 后剩余约 700 KB,满足。此时并发可行,但需注意私有 2.4G 的时隙不能与 BLE 连接事件重叠,否则会丢包。

如果换成一个需要 3 个 TIMER、10 个 PPI 通道、64 KB RAM 的复杂私有协议,PPI 和 RAM 就会成为瓶颈。此时要么精简私有协议的定时需求,要么改用 nRF5340 把两个协议分到不同核上,利用 DPPI 和独立内存域解除竞争。资源估算的意义,就是在写代码之前先判断方案是否成立,而不是等到运行中频繁丢包再去排查。