2. nRF SoC硬件架构与无线外设

nRF系列SoC(以nRF52832、nRF52840、nRF5340为代表)之所以能在一颗芯片上同时跑BLE、Thread、Zigbee甚至2.4G私有协议,根本原因不在于软件协议栈写得多好,而在于硬件层面为无线协议预留了完整的“加速通道”。理解这套硬件架构,是判断一个无线功能能否低功耗、低抖动实现的前提。本节从内核、内存映射、PPI/DMA、RADIO外设、时钟与电源管理五个层面,说明它们各自承担什么角色,以及如何协同支撑无线协议。

Cortex-M内核:协议栈的“控制中枢”而非“数据搬运工”

nRF52832采用Cortex-M4F,nRF52840为Cortex-M4F,nRF5340则是双核Cortex-M33(应用核+网络核)。内核在无线系统中的定位是控制与调度:初始化RADIO、配置PPI通道、处理中断、运行协议栈状态机。真正的高频数据搬运(如射频收发FIFO与RAM之间的字节流)不应由CPU逐字节完成,否则每次收发都会带来大量中断和功耗。

以nRF52832为例,其内核运行在64MHz,Flash 512KB、RAM 64KB。协议栈(如SoftDevice S132)会占用固定的Flash与RAM区域,应用代码必须避开这些地址。这就是内存映射要解决的问题。

内存映射:协议栈与应用代码的“地盘划分”

nRF SoC的地址空间是统一编址的:Flash从0x0000_0000开始,RAM从0x2000_0000开始,外设寄存器从0x4000_0000开始,PPI、RADIO、TIMER、GPIOTE等都在这个区域。SoftDevice通过sd_ble_enable()返回的RAM起始地址,告诉应用“从哪个地址往上你可以用”。如果应用链接脚本没有按这个边界调整,就会出现协议栈与应用程序互相踩内存,表现为随机死机或射频异常。

实际工程中,常用做法是在链接脚本中预留协议栈区域,例如nRF52832+S132的典型配置:Flash前0x26000字节留给SoftDevice,RAM前0x1628字节留给协议栈。应用从0x26000和0x20001628之后开始放置。这个边界不是固定值,取决于协议栈版本和使能的特性数量,必须以sd_ble_enable()的输出为准。

PPI与DMA:让硬件自己“接力”,CPU只做决策

PPI(Programmable Peripheral Interconnect)是nRF SoC最具特色的外设之一。它允许一个外设的事件直接触发另一个外设的任务,不经过CPU。例如:TIMER0的COMPARE[0]事件可以通过PPI通道触发RADIO的TXEN任务,实现精确的发送定时;RADIO的READY事件可以触发TIMER的CAPTURE任务,测量空中包的时间戳。

DMA在nRF中主要体现在EasyDMA上。RADIO、UARTE、SPIM、SAADC等外设都带EasyDMA,可以直接在RAM和外设FIFO之间搬运数据。以RADIO发送为例:CPU只需把要发的数据包写入RAM缓冲区,配置RADIO的PACKETPTR指向该缓冲区,设置MAXLEN,然后触发TXEN。RADIO在发送时通过EasyDMA自动读取RAM,CPU可以立即进入睡眠或处理其他任务。

PPI与EasyDMA的组合,使得一个完整的BLE广播包发送过程可以做到:RTC超时→PPI触发RADIO TXEN→RADIO EasyDMA读包→发送完成→RADIO DISABLED事件→PPI触发下一次RTC比较。整个链路中CPU只在初始化时配置一次,之后每次广播几乎不消耗CPU时间。

nRF SoC无线协议硬件协同链路 Cortex-M内核 初始化/中断/状态机 RAM缓冲区 PACKETPTR指向 PPI通道 事件→任务直连 TIMER/RTC COMPARE事件源 RADIO外设 TXEN/READY/DISABLED EasyDMA RAM↔FIFO自动搬运 天线 2.4GHz 时钟与电源管理 HFCLK 16MHz / LFCLK 32.768kHz / DCDC / 系统ON-IDLE-OFF 配置 触发TXEN COMPARE 请求数据 自动读取 射频 供电与时钟供给 关键点:CPU只做初始化与决策;PPI负责事件-任务直连;EasyDMA负责数据搬运;RADIO负责射频收发;时钟电源决定功耗与唤醒精度。 典型低功耗广播链路:RTC COMPARE → PPI → RADIO TXEN → EasyDMA读RAM → 发送完成 → DISABLED → PPI → 下一次RTC比较。

RADIO外设:协议无关的射频前端

nRF的RADIO外设本身不绑定任何协议。它提供的是:频率设置(FREQUENCY)、输出功率(TXPOWER)、数据速率(MODE:1Mbps/2Mbps/长距离)、包格式(PCNF0/PCNF1)、地址(BASE/PREFIX)、CRC配置、以及TXEN/RXEN/START/DISABLE等任务和READY/ADDRESS/PAYLOAD/END/DISABLED等事件。BLE、802.15.4、私有2.4G协议,都是通过不同的寄存器配置和时序控制,让同一个RADIO外设表现出不同的空中行为。

例如BLE广播包使用1Mbps、CRC 3字节、固定前导码;而802.15.4使用250kbps、O-QPSK调制、不同的前导码和SFD。这些差异全部由软件在启动RADIO前写入寄存器完成。RADIO的SHORTS寄存器还可以让READY自动触发START、END自动触发DISABLE,进一步减少CPU干预。

时钟与电源管理:低功耗的“节拍器”

无线协议对时钟有两个硬性要求:射频载波精度和协议时序精度。nRF SoC内部有HFCLK(16MHz,用于RADIO和高速外设)和LFCLK(32.768kHz,用于RTC和协议栈时基)。HFCLK可以来自内部RC或外部晶振;LFCLK可以来自内部RC、外部晶振或合成。BLE协议要求LFCLK精度在±500ppm以内(实际建议±50ppm以内),否则连接维持和广播间隔会漂移。

电源管理方面,nRF52832支持系统ON、IDLE、OFF三种模式。无线协议栈通常让系统在IDLE和ON之间快速切换:RTC保持运行,CPU睡眠,RADIO按PPI定时唤醒。DCDC转换器(nRF52840支持)可以在射频工作时显著降低电流。以BLE广播为例,使用DCDC、1Mbps、0dBm、广播间隔100ms时,平均电流可做到约20μA量级;如果关闭DCDC并使用内部RC作为LFCLK,平均电流会明显上升,且广播间隔精度变差。

硬件协同的实际配置示例

下面是一段基于nRF5 SDK风格的PPI+RADIO配置片段,用于说明“RTC触发RADIO发送”的硬件链路如何建立。参数为教学示例,实际值需按协议和硬件调整。

// 1. 配置RTC0产生100ms比较事件
NRF_RTC0->PRESCALER = 0;          // 32.768kHz直接计数
NRF_RTC0->CC[0] = 3277;           // 100ms
NRF_RTC0->EVTENSET = RTC_EVTENSET_COMPARE0_Msk;

// 2. 配置PPI:RTC0 COMPARE0 → RADIO TXEN
NRF_PPI->CH[0].EEP = (uint32_t)&NRF_RTC0->EVENTS_COMPARE[0];
NRF_PPI->CH[0].TEP = (uint32_t)&NRF_RADIO->TASKS_TXEN;
NRF_PPI->CHENSET = PPI_CHENSET_CH0_Msk;

// 3. 配置RADIO为BLE 1Mbps广播
NRF_RADIO->MODE = RADIO_MODE_MODE_Ble_1Mbit;
NRF_RADIO->FREQUENCY = 37;        // 2402MHz
NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_0dBm;
NRF_RADIO->PACKETPTR = (uint32_t)adv_packet;
NRF_RADIO->PCNF0 = ...;           // 前导码/地址/CRC长度
NRF_RADIO->SHORTS = RADIO_SHORTS_READY_START_Msk |
                    RADIO_SHORTS_END_DISABLE_Msk;

// 4. 启动RTC,之后每次COMPARE0都会自动触发一次发送
NRF_RTC0->TASKS_START = 1;

这段配置完成后,CPU不需要在每次广播时介入。RTC每100ms产生一次COMPARE0事件,PPI把它直接接到RADIO的TXEN任务,RADIO自动发送adv_packet指向的缓冲区,发送完成后END事件通过SHORTS自动DISABLE。整个过程CPU可以一直睡眠,直到需要处理连接事件或应用逻辑时才被唤醒。

判断一个nRF无线功能是否“硬件友好”,可以看三点:数据搬运是否走了EasyDMA;定时触发是否走了PPI;空闲时CPU是否进入了睡眠。三者都满足,功耗和实时性通常不会差。
修改链接脚本或协议栈RAM起始地址时,必须重新调用sd_ble_enable()确认边界。不同SDK版本、不同协议栈配置下,这个边界会变化。直接照搬旧工程的地址,是nRF开发中常见的隐蔽故障来源。

把以上五个层面串起来看:Cortex-M内核负责“想”,内存映射负责“分地盘”,PPI负责“传令”,EasyDMA负责“搬货”,RADIO负责“收发”,时钟与电源管理负责“省电和守时”。无线协议栈本质上就是在这套硬件骨架上,按协议规范编排事件与任务的顺序。理解这套骨架,才能在协议栈行为异常时,判断问题出在软件配置还是硬件资源冲突。