3. 低功耗模式进入与退出机制
RA 系列 MCU 的低功耗管理,核心并不只是“把 CPU 停下来”,而是围绕三条主线协同工作:用什么指令让内核进入等待、哪些外设事件可以把芯片从低功耗状态拉回来、唤醒之后如何保证程序状态与数据不丢失。理解这三条主线,才能在实际工程中把功耗、响应时间和数据完整性同时控制住。
WFI 与 WFE:两种等待指令的语义差异
RA 的 Cortex-M 内核提供两条等待指令。WFI(Wait For Interrupt)让内核立即进入等待,直到任意一个已使能且优先级足够的中断到来才继续执行;WFE(Wait For Event)则多了一层事件语义:如果事件寄存器中的事件标志已经置位,WFE 会立即返回而不进入等待,否则同样进入等待,直到事件或中断发生。简单说,WFI 面向“中断唤醒”,WFE 面向“事件唤醒”,后者常用于多核或事件驱动场景中避免丢失已经发生的事件。
在 RA 上,进入 Software Standby 的典型写法是先配置好唤醒源,再执行等待指令。下面是一段示意代码,展示进入前的关键动作:
/* 1. 关闭不需要的外设时钟,降低待机电流 */
R_MSTP->MSTPCRB_b.MSTPB31 = 1; /* 示例:关闭某外设模块 */
/* 2. 配置唤醒源,例如 RTC 周期中断 */
R_RTC_Open(&g_rtc_ctrl, &g_rtc_cfg);
R_RTC_EnableIrq(&g_rtc_ctrl, RTC_EVENT_PERIODIC_IRQ);
/* 3. 清除可能挂起的标志,避免“假唤醒” */
R_ICU_IrqStatusClear(...);
/* 4. 进入 Software Standby,等待中断唤醒 */
__WFI();
/* 5. 唤醒后重新初始化时钟与外设 */
R_CGC_SystemClockReInit();
需要强调的是,WFI/WFE 本身只是“让内核等待”,真正决定芯片进入哪种低功耗模式的是 SBYCR 等寄存器中的待机控制位。也就是说,指令负责“停”,寄存器负责“停多深”。
Snooze 模式与触发源
Snooze 模式是 RA 中一个非常实用的中间档位:CPU 停止运行,但部分外设仍保持工作,一旦指定触发源产生事件,系统可以快速唤醒并执行对应处理,而不必经历完整的 Software Standby 恢复流程。它的价值在于用较小的功耗代价换取较短的响应时间。
Snooze 的触发源通常来自 ICU 的事件检测,例如:外部 IRQ 引脚、AGT 比较匹配、RTC 闹钟、ADC 转换完成、SCI 接收等。配置时一般需要设置 SNZCR 中的使能位与触发源选择位,并确保对应外设中断已使能。触发发生后,CPU 会从 Snooze 返回并执行中断服务程序,处理完再决定是否再次进入。
Software Standby 的唤醒源
Software Standby 是 RA 中功耗最低的常规待机模式,唤醒源也更丰富。常见唤醒源包括:
- IRQ 外部中断:按键、传感器信号等,响应直接,适合人机交互。
- LVD 电压监测:电压跌落或恢复时唤醒,用于掉电保护与安全关机。
- RTC 闹钟/周期中断:定时唤醒,适合周期性采集与心跳任务。
- AGT 定时器:作为低功耗定时唤醒源,灵活配置周期。
- USB 事件:USB 挂起/恢复、VBUS 检测等,适合 USB 设备待机。
这些唤醒源并非全部默认可用,需要在进入待机前通过 SBYCR、ICU 及相关外设寄存器逐一使能。若某个唤醒源未使能,即使事件发生,芯片也不会退出待机。
唤醒时间与功耗的权衡
不同低功耗模式的唤醒时间差异明显。Snooze 模式因为保留了部分外设时钟,唤醒通常在微秒级;Software Standby 需要重新稳定主时钟、恢复外设,唤醒时间可能在几十微秒到毫秒级;Deep Software Standby 唤醒更慢,但静态电流最低。工程上要做的不是“选最省电的”,而是根据任务周期和响应要求选最合适的。
一个实用的判断方法是计算平均功耗。假设某应用每 1 秒采集一次数据,运行态电流 8 mA、持续 2 ms,Software Standby 电流 1.5 µA、持续 998 ms,则平均电流约为:
I_avg = (8 mA × 2 ms + 0.0015 mA × 998 ms) / 1000 ms
≈ (0.016 + 0.001497) / 1000
≈ 0.0175 mA ≈ 17.5 µA
如果换成 Snooze 模式,待机电流可能升到 20 µA,但唤醒时间缩短到 5 µs,运行时间几乎不变。此时平均电流反而可能更高。因此,唤醒时间越短并不一定越省电,关键看占空比和待机电流的乘积。
状态保存与恢复流程
进入 Software Standby 前,必须明确哪些状态需要保存。CPU 寄存器由硬件在唤醒后自动恢复,但外设配置、GPIO 电平、通信缓冲区、DMA 描述符等通常需要软件处理。推荐的做法是:
- 进入前关闭不必要的外设时钟,减少漏电。
- 将关键变量放入保留 RAM 区域,或写入备份寄存器。
- 记录当前工作状态(如通信阶段、采样序号),便于唤醒后判断从何处继续。
- 唤醒后先恢复时钟,再按依赖顺序重新初始化外设,最后恢复业务状态。
整体来看,RA 的低功耗进入与退出机制可以概括为:指令决定何时停,寄存器决定停多深,唤醒源决定何时醒,恢复流程决定醒后能否正确继续。把这四件事分别验证清楚,再组合成完整应用,才能在实际项目中稳定地降低功耗而不牺牲可靠性。