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。这意味着“休眠”不再是单一状态,而是可以根据保留哪些外设分成多个功耗档位。
二、各模式电流消耗量级与影响因素
下面给出的是典型量级参考,用于建立数量级概念,并非某一具体型号的实测值。实际电流会随主频、外设开关、电源域配置、温度显著变化。
| 模式 | 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字段、复位引脚等触发,触发后芯片执行复位流程,程序从入口重新开始。
四、实际配置示例:从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,续航缩短近一半。
理解nRF54的电源系统,最终要落到“在什么场景下选什么模式、配什么唤醒源、关哪些域”这三个决策上。Run用于计算密集任务,Idle用于短等待,Sleep用于长等待且需保留上下文,System OFF用于极低功耗且可接受复位重启的场景。把这四种模式与唤醒源对应清楚,低功耗设计就有了稳定的基础。