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等。唤醒后相当于一次复位启动,程序从复位向量重新执行,因此进入待机前必须把关键状态保存到备份寄存器或非易失存储。
四、SAM实现映射:从概念到寄存器
把上述概念落到SAM的具体实现,可以按下面的对应关系理解:
| 架构概念 | SAM实现 | 关键寄存器/接口 |
|---|---|---|
| Sleep | CPU停止,外设时钟保持 | __WFI(),PM睡眠配置 |
| Deep Sleep | 关闭GCLK、部分APB时钟 | PM->SLEEP,PM->PM_APBxMASK |
| Standby | VDDCORE掉电,备份域保持 | SUPC->VREG,SUPC->VREF,RTC |
| 时钟门控 | GCLK与APB掩码 | GCLK->GENCTRL,PM->PM_APBCMASK |
| 电源域 | VDDCORE/VDDIO/VDDANA/VBAT | SUPC电压调节器配置 |
下面这张图把“内核状态—时钟门控—电源域—SAM寄存器”的映射关系集中呈现,便于对照查阅。
五、典型配置流程与观察点
以“RTC定时唤醒、其余时间Deep Sleep”为例,配置顺序如下:
- 关闭未使用外设时钟:
PM->PM_APBCMASK.reg = 0;,再按需打开RTC和SUPC。 - 配置RTC时钟源为32.768kHz,设置周期唤醒中断。
- 配置
PM->SLEEP.reg,选择IDLE或STANDBY睡眠深度。 - 进入主循环,执行
__WFI()。 - RTC中断唤醒后,读取标志、处理任务,再次进入
__WFI()。
观察与判断:用万用表或功耗分析仪测量VDDCORE电流。若Deep Sleep电流明显高于数据手册典型值,优先检查是否有外设时钟未关闭、GPIO是否悬空或配置为输出高、以及BOD是否仍处于高功耗模式。Standby模式下若无法唤醒,检查RTC是否已切换到VBAT域、唤醒使能位是否置位。
把这张映射图记牢,后续配置时钟树、PMU和SUPC时,每一步都能对应到“关了什么、保了什么、靠什么唤醒”,低功耗调试就不会变成盲目试参数。