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 及相关外设寄存器逐一使能。若某个唤醒源未使能,即使事件发生,芯片也不会退出待机。

RA 低功耗模式进入与退出机制 运行态 Run CPU 全速 / 外设工作 WFI / WFE 等待指令 SBYCR 决定待机深度 Snooze 模式 CPU 停 / 部分外设运行 Software Standby 最低功耗 / 时钟停止 Deep Software Standby 仅少数唤醒源可用 唤醒源与恢复流程 IRQ 外部中断 按键 / 传感器 LVD 电压监测 掉电 / 恢复 RTC 闹钟 定时唤醒 AGT 定时器 周期事件 USB 事件 挂起 / 恢复 唤醒 → 时钟恢复 → 外设重初始化 → 状态恢复 → 继续执行 唤醒时间与功耗在此权衡 返回运行态

唤醒时间与功耗的权衡

不同低功耗模式的唤醒时间差异明显。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 描述符等通常需要软件处理。推荐的做法是:

  1. 进入前关闭不必要的外设时钟,减少漏电。
  2. 将关键变量放入保留 RAM 区域,或写入备份寄存器。
  3. 记录当前工作状态(如通信阶段、采样序号),便于唤醒后判断从何处继续。
  4. 唤醒后先恢复时钟,再按依赖顺序重新初始化外设,最后恢复业务状态。
若使用 RTC 或 AGT 作为周期唤醒源,建议在唤醒后先读取并清除中断标志,再执行耗时操作,避免标志残留导致下一次立即再次唤醒。
进入 Software Standby 前若未正确配置唤醒源使能位,芯片可能无法被预期事件唤醒,只能依靠复位。调试阶段建议先用 IRQ 或 RTC 做最小验证,再逐步加入其他唤醒源。

整体来看,RA 的低功耗进入与退出机制可以概括为:指令决定何时停,寄存器决定停多深,唤醒源决定何时醒,恢复流程决定醒后能否正确继续。把这四件事分别验证清楚,再组合成完整应用,才能在实际项目中稳定地降低功耗而不牺牲可靠性。