3. ARM Cortex-M低功耗架构基础

在SAM系列MCU上做低功耗设计,第一步不是急着写代码,而是先建立一张“架构地图”:Cortex-M内核提供了哪些低功耗状态,芯片厂商又在此基础上叠加了哪些时钟与电源控制手段,二者如何对应到具体寄存器。只有把这条映射关系理清,后面配置PMU、SUPC、时钟树时才知道每一步在动什么。

一、内核级低功耗状态:从Sleep到Deep Sleep

Cortex-M内核本身定义了两级低功耗入口,通过WFI(Wait For Interrupt)或WFE(Wait For Event)指令触发。执行WFI后,内核停止取指与执行,但外设、时钟和电源域是否继续工作,取决于芯片的电源管理实现。

  • Sleep(睡眠):内核时钟停止,CPU不再执行指令,但系统时钟、外设时钟和SRAM供电保持。任何使能的中断都能唤醒,唤醒延迟极短,通常只有几个时钟周期。适合“等一个事件、马上要接着算”的场景。
  • Deep Sleep(深度睡眠):内核与大部分系统时钟关闭,部分外设时钟被门控,SRAM可保持或部分掉电。唤醒源受限,通常需要特定外设中断或事件。唤醒延迟比Sleep长,但静态功耗显著下降。

需要强调:Cortex-M规范只定义了“进入低功耗”的机制,具体进入哪一级、哪些时钟被关、哪些电源域被切,由芯片的电源管理单元决定。SAM系列通过PM(Power Manager)和SUPC(Supply Controller)实现这套控制。

二、时钟门控:低功耗的第一道闸门

动态功耗近似满足 P ≈ C·V²·f。在电压不变时,降低频率或关闭时钟是最直接的省电手段。SAM的时钟门控分两个层次:

  • 外设时钟使能/禁止:通过PM->PM_APBCMASK、PM_APBBMASK等寄存器,按外设粒度开关时钟。未使用的外设(如未接的SERCOM、未用的ADC)应默认关闭。
  • 通用时钟与分频:通过GCLK(Generic Clock)为每个外设选择时钟源和分频系数。低频外设(如RTC、WDT)可挂到32.768kHz,高速外设再挂到主时钟。

时钟门控的关键原则是“按需开、用完关”。例如一次ADC采样:先使能ADC时钟,配置并启动转换,等待转换完成中断,读取结果后立即关闭ADC时钟。这样ADC只在采样窗口内消耗动态功耗。

三、电源域与待机模式

SAM器件通常划分多个电源域,典型包括:

  • VDDCORE:内核与数字逻辑供电,可在深度睡眠时降压或断电。
  • VDDIO:I/O供电,通常保持,以维持引脚状态和外部接口。
  • VDDANA:模拟外设供电,独立控制。
  • 备份域:由VBAT供电,维持RTC、备份寄存器和唤醒逻辑。

Standby(待机)是SAM上比Deep Sleep更深的模式:内核电源域关闭,主时钟停止,仅备份域和少量唤醒逻辑工作。唤醒源通常限于RTC闹钟、外部唤醒引脚、BOD等。唤醒后相当于一次复位启动,程序从复位向量重新执行,因此进入待机前必须把关键状态保存到备份寄存器或非易失存储。

判断该用哪一级:如果唤醒后需要继续执行原上下文,选Sleep或Deep Sleep;如果允许重新初始化,且追求最低静态电流,选Standby。

四、SAM实现映射:从概念到寄存器

把上述概念落到SAM的具体实现,可以按下面的对应关系理解:

架构概念SAM实现关键寄存器/接口
SleepCPU停止,外设时钟保持__WFI(),PM睡眠配置
Deep Sleep关闭GCLK、部分APB时钟PM->SLEEP,PM->PM_APBxMASK
StandbyVDDCORE掉电,备份域保持SUPC->VREG,SUPC->VREF,RTC
时钟门控GCLK与APB掩码GCLK->GENCTRL,PM->PM_APBCMASK
电源域VDDCORE/VDDIO/VDDANA/VBATSUPC电压调节器配置

下面这张图把“内核状态—时钟门控—电源域—SAM寄存器”的映射关系集中呈现,便于对照查阅。

Cortex-M低功耗状态与SAM实现映射 内核状态 Sleep WFI / WFE 外设时钟保持 Deep Sleep 部分时钟门控 SRAM保持 Standby VDDCORE掉电 备份域保持 唤醒源 中断/事件/RTC/引脚 时钟门控 GCLK 通用时钟源/分频 GCLK->GENCTRL APB掩码 PM_APBCMASK PM_APBBMASK PM->SLEEP 睡眠深度配置 IDLE/STANDBY 时钟源 XOSC32K/OSC16M/DFLL 电源域 VDDCORE 内核/数字逻辑 可降压/断电 VDDIO I/O供电 通常保持 VDDANA 模拟外设 独立控制 VBAT备份域 RTC/备份寄存器 SUPC控制 VREG 电压调节器 低功耗模式 BOD 欠压检测 唤醒源 VREF 参考电压 可关闭 唤醒逻辑 RTC/引脚 箭头表示控制/配置关系:内核状态选择 → 时钟门控策略 → 电源域管理 → SUPC寄存器实现

五、典型配置流程与观察点

以“RTC定时唤醒、其余时间Deep Sleep”为例,配置顺序如下:

  1. 关闭未使用外设时钟:PM->PM_APBCMASK.reg = 0;,再按需打开RTC和SUPC。
  2. 配置RTC时钟源为32.768kHz,设置周期唤醒中断。
  3. 配置PM->SLEEP.reg,选择IDLE或STANDBY睡眠深度。
  4. 进入主循环,执行__WFI()。
  5. RTC中断唤醒后,读取标志、处理任务,再次进入__WFI()。

观察与判断:用万用表或功耗分析仪测量VDDCORE电流。若Deep Sleep电流明显高于数据手册典型值,优先检查是否有外设时钟未关闭、GPIO是否悬空或配置为输出高、以及BOD是否仍处于高功耗模式。Standby模式下若无法唤醒,检查RTC是否已切换到VBAT域、唤醒使能位是否置位。

进入Standby前必须保存关键状态到备份寄存器或Flash,因为唤醒后程序从复位向量重新执行,RAM内容不保证保持。

把这张映射图记牢,后续配置时钟树、PMU和SUPC时,每一步都能对应到“关了什么、保了什么、靠什么唤醒”,低功耗调试就不会变成盲目试参数。