2. nRF54电源系统与工作模式

nRF54系列在功耗管理上延续了Nordic一贯的“多电源域 + 多工作模式”思路,但在电源域划分、模式切换粒度和唤醒源配置上比nRF52系列更细。理解这套电源系统,核心不是记住几个模式名称,而是搞清楚三件事:哪些电源域在供电、CPU与时钟处于什么状态、哪些事件能把芯片从当前模式拉出来。这三者共同决定了某一时刻的电流消耗量级。

一、电源域与模式的关系

nRF54的内部大致可分为几个关键供电区域:核心域(CPU、内存、高速外设)、低功耗域(RTC、GPIO唤醒逻辑、部分定时器)、以及独立的无线域。不同模式本质上是这些域的供电与时钟组合:

  • System ON:核心域供电,CPU可运行或睡眠,外设按需开启。这是芯片的“正常工作态”,包含Run、Idle、Sleep三种子状态。
  • System OFF:核心域断电,仅保留极少量唤醒逻辑(GPIO、NFC字段检测等)。电流最低,但RAM内容丢失,唤醒等同于复位。
  • 休眠(Sleep):属于System ON的子状态,CPU停止,RAM保持,外设可继续运行(如RTC、PPI、DMA)。
  • 空闲(Idle):CPU停止但时钟仍运行,等待中断,功耗高于Sleep。
  • 运行(Run):CPU执行指令,功耗最高,与主频、外设开关强相关。

需要特别注意的是,nRF54引入了更细粒度的电源域控制,允许在System ON下单独关闭某些外设域,而不必进入System OFF。这意味着“休眠”不再是单一状态,而是可以根据保留哪些外设分成多个功耗档位。

nRF54 工作模式与唤醒源关系图 System ON(核心域供电) Run(运行) CPU执行 · 主频可调 电流:mA级 Idle(空闲) CPU停 · 时钟运行 电流:数百µA Sleep(休眠) CPU停 · RAM保持 电流:µA级 低功耗外设域 RTC / PPI / DMA 可独立保持运行 WFI/WFE 中断 事件 System OFF 核心域断电 · RAM丢失 仅保留唤醒逻辑 电流:nA~亚µA级 唤醒 = 复位重启 主要唤醒源 GPIO / DETECT 引脚 RTC 比较/溢出事件 NFC 字段检测 看门狗 / 复位引脚 进入 唤醒 注:电流值为典型量级示意,实际值取决于主频、外设配置与电源域开关状态

二、各模式电流消耗量级与影响因素

下面给出的是典型量级参考,用于建立数量级概念,并非某一具体型号的实测值。实际电流会随主频、外设开关、电源域配置、温度显著变化。

模式 CPU状态 RAM保持 典型电流量级 可运行外设
Run 执行指令 是 mA级(随主频上升) 全部
Idle 停止,时钟运行 是 数百µA 全部(时钟保持)
Sleep 停止,时钟停止 是 µA级 RTC、PPI、DMA等
System OFF 断电 否 nA~亚µA级 仅唤醒逻辑

影响电流的关键因素有三个:主频(Run模式下电流近似与主频成正比)、外设开关(每个开启的外设都会叠加静态或动态电流)、电源域配置(关闭未使用的域可显著降低Sleep电流)。例如,在Sleep下若保持RTC运行,电流通常在1~3µA量级;若同时保持多个外设域供电,可能上升到十几µA。

三、唤醒源与模式切换路径

不同模式对应不同的唤醒源集合,这是配置低功耗方案时最容易出错的地方:

  • Run → Sleep:执行WFI或WFE指令进入。唤醒源为任意已使能的中断(WFI)或事件(WFE)。
  • Sleep → Run:中断/事件触发后自动返回Run,无需复位。
  • System ON → System OFF:写POWER寄存器进入。此过程不可逆,只能通过唤醒源复位重启。
  • System OFF → System ON:由GPIO、NFC字段、复位引脚等触发,触发后芯片执行复位流程,程序从入口重新开始。
关键区别:Sleep唤醒后程序从WFI/WFE之后继续执行,变量和RAM内容保留;System OFF唤醒等同于复位,所有RAM内容丢失,必须重新初始化。选择哪种模式,取决于“是否需要保留运行上下文”。

四、实际配置示例:从Run进入Sleep并定时唤醒

下面是一段基于nRF54的典型低功耗配置流程,使用RTC作为唤醒源,让系统在Sleep与Run之间周期性切换。示例参数为教学假设值,实际使用需根据具体型号手册调整。

// 1. 配置RTC,设定比较值产生周期唤醒事件
//    假设使用32.768kHz时钟,目标每2秒唤醒一次
//    COMPARE = 2s × 32768 = 65536

// 2. 使能RTC中断,并配置为可唤醒Sleep
//    NVIC_EnableIRQ(RTC0_IRQn);

// 3. 进入Sleep前,关闭不需要的外设时钟
//    保留RTC、PPI,关闭其他外设域

// 4. 执行WFI进入Sleep
//    __WFI();

// 5. RTC比较事件触发中断,CPU被唤醒
//    中断服务程序中清除事件标志,处理任务

// 6. 任务完成后再次进入Sleep,循环往复

这段流程的关键判断点在于:进入Sleep前是否关闭了不必要的外设域。如果忘记关闭,Sleep电流可能从µA级上升到数十µA,续航时间成倍缩短。另一个常见问题是RTC事件标志未清除,导致反复进入中断而无法真正休眠。

五、模式选择与续航估算的对应关系

在实际项目中,模式选择直接决定续航。一个粗略的估算方法是:

平均电流 = (Run电流 × Run时间 + Sleep电流 × Sleep时间) / 总周期时间

例如,假设Run电流为5mA、持续10ms,Sleep电流为2µA、持续1990ms,周期2秒,则平均电流约为:

(5mA × 0.01s + 0.002mA × 1.99s) / 2s ≈ 0.027mA = 27µA

若使用1000mAh电池,理论续航约为1000/0.027 ≈ 37000小时,约4.2年。这个估算说明:占空比和Sleep电流共同决定续航,降低Run时间与压低Sleep电流同样重要。如果Sleep电流从2µA恶化到20µA,平均电流会上升到约45µA,续航缩短近一半。

实践建议:在调试低功耗时,先用电流表或功耗分析仪测量各模式实际电流,再对照数据手册确认是否达到预期量级。若Sleep电流偏高,优先检查:未关闭的外设时钟、GPIO悬空输入、未配置的电源域、以及调试接口是否仍处于使能状态。

理解nRF54的电源系统,最终要落到“在什么场景下选什么模式、配什么唤醒源、关哪些域”这三个决策上。Run用于计算密集任务,Idle用于短等待,Sleep用于长等待且需保留上下文,System OFF用于极低功耗且可接受复位重启的场景。把这四种模式与唤醒源对应清楚,低功耗设计就有了稳定的基础。