2. i.MX电源域与电源模式

在i.MX应用处理器上,功耗管理不是单一开关,而是由电源域(Power Domain)与电源模式(Power Mode)共同构成的分层体系。电源域决定“哪些硬件模块可以被独立供电或断电”,电源模式决定“CPU、总线、外设、内存控制器和时钟在某一时刻处于什么状态”。理解这两者的关系,是后续做低功耗配置、唤醒源设计和功耗测量前必须打牢的基础。

一、电源域:把芯片拆成可独立控制的供电区域

以i.MX6/6ULL、i.MX7、i.MX8M系列为例,芯片内部通常划分为多个电源域,典型包括:

  • ARM Core域:CPU核心、L1/L2缓存、SCU等,可独立调压调频,支持电源门控。
  • SoC/VDDSOC域:总线互连、部分外设控制器、GIC等,是CPU之外的主要逻辑供电区。
  • DDR/VDDR域:DDR PHY与内存控制器接口,进入低功耗时通常需要进入自刷新(Self-Refresh)。
  • SNVS域:Secure Non-Volatile Storage,包含RTC、SNVS_LP、防篡改、唤醒控制等,是唯一在最低功耗模式下仍保持供电的域。
  • MIX域:i.MX7/8M中常见的显示、GPU、VPU、MIPI等多媒体子域,可单独上电或断电。

每个域内部又可能包含电源开关(Power Switch)、隔离单元(Isolation Cell)和状态保持单元(Retention Cell)。断电前必须先把输出信号隔离,避免悬空信号影响其他域;需要保留的寄存器状态则通过retention或备份寄存器保存。这就是“状态保持”的硬件基础。

二、电源模式:从Run到SNVS的逐级降耗

i.MX的电源模式通常按功耗从高到低排列,常见定义如下:

模式CPU状态时钟/电源典型唤醒源
Run全速运行全部时钟开启,电压正常—
WaitCPU停止取指,WFI核心时钟门控,外设时钟保留任意使能的中断
StopCPU掉电或深度门控SoC部分域关闭,DDR自刷新GIC中断、GPIO、RTC
DSMDeep Sleep Mode,深度睡眠更多域断电,仅SNVS+少量唤醒逻辑RTC、SNVS域GPIO、ONOFF
SNVS最低功耗待机仅SNVS域供电,RTC走时RTC闹钟、SNVS_TAMPER、ONOFF按键

需要强调:不同i.MX型号对模式命名略有差异,例如i.MX8M系列常用Run、Wait、Stop、Deep Sleep、SNVS,而i.MX7还引入Low Power Idle、Deep Sleep、SNVS等。工程上应以具体芯片的参考手册(RM)和电源管理章节为准,不能跨型号直接套用。

三、状态保持:哪些内容必须“活下来”

进入低功耗模式前,软件必须明确三件事:

  1. 哪些寄存器必须保留:如DDR控制器的自刷新配置、引脚复用、唤醒屏蔽位、SNVS备份寄存器。
  2. 哪些外设可以断电:如未使用的UART、I2C、PWM,可关闭其时钟和电源域。
  3. 哪些状态需要备份到SNVS或DDR:如系统上下文、唤醒标志、RTC时间。

以DDR为例,进入Stop或DSM前,必须让DDR控制器进入Self-Refresh,否则DDR内容会丢失。唤醒后,Boot ROM或SPL需要根据唤醒源判断是“冷启动”还是“从低功耗恢复”,并决定是否重新初始化DDR。SNVS域中的SNVS_LP寄存器组通常用于保存唤醒原因和少量关键数据,即使其他域断电也不会丢失。

四、唤醒源分类:谁能把系统叫醒

唤醒源可按“来自哪个域”和“是否经过GIC”分类:

  • GIC中断唤醒:GPIO、UART、I2C、USB、定时器等外设中断,经GIC送到CPU。适用于Wait和部分Stop模式。
  • SNVS域唤醒:RTC闹钟、SNVS_TAMPER引脚、ONOFF按键。这些信号在SNVS域内直接触发,不依赖主域时钟,因此可用于DSM和SNVS模式。
  • 外部引脚唤醒:部分GPIO在低功耗模式下仍可由GPIO唤醒控制器检测边沿,但需要该GPIO所在域保持供电。
  • 看门狗/复位唤醒:WDOG超时或外部复位,属于异常或强制唤醒路径。

配置唤醒源时,关键动作是:使能对应中断、清除旧唤醒标志、设置唤醒屏蔽位,并在唤醒后读取SNVS_LPSR或GIC pending寄存器判断来源。若唤醒后系统反复重启,常见原因是唤醒标志未清除或DDR未正确恢复。

i.MX 电源域 · 电源模式 · 唤醒源关系图 电源域(Power Domain) ARM Core 域 CPU / L2 / SCU SoC / VDDSOC 域 总线 / GIC / 外设 DDR / VDDR 域 DDR PHY / 控制器 MIX 域 GPU / VPU / 显示 SNVS 域(常供电) RTC / SNVS_LP / TAMPER 电源模式(功耗由高到低) Run — 全速运行 Wait — WFI 时钟门控 Stop — 部分域断电 + DDR自刷新 DSM — 深度睡眠 SNVS — 仅SNVS域供电 唤醒源分类 GIC 中断 GPIO / UART / I2C / USB SNVS 域唤醒 RTC闹钟 / TAMPER / ONOFF GPIO 唤醒控制器 边沿检测 / 保持供电域 WDOG / 复位 异常或强制唤醒 关键工程要点: ① 进入 Stop/DSM 前,DDR 必须进入 Self-Refresh,否则内存内容丢失;唤醒后需判断冷启动或恢复路径。 ② SNVS 域是唯一在 SNVS 模式下仍供电的域,RTC、SNVS_LP 备份寄存器和 TAMPER 均在此域。 ③ 唤醒后先读 SNVS_LPSR / GIC pending 判断来源,再清除唤醒标志,避免反复唤醒或误判。

五、模式选择与配置思路

实际项目中,模式选择通常由“响应时间”和“功耗预算”共同决定。若系统需要毫秒级响应,优先选Wait;若允许几十毫秒到几百毫秒恢复,可选Stop;若设备大部分时间处于待机、仅靠RTC或按键唤醒,则选DSM或SNVS。配置时建议按以下顺序推进:

  1. 确认当前芯片型号支持的电源模式列表,查阅RM中“Power Management”章节。
  2. 梳理所有外设的电源域归属,关闭未使用模块的时钟和电源。
  3. 配置DDR自刷新参数,确保进入低功耗前完成。
  4. 设置唤醒源:使能中断、清除标志、配置GPIO边沿或RTC闹钟。
  5. 进入低功耗模式,唤醒后读取唤醒状态寄存器,验证来源是否正确。
调试建议:先用示波器或电流探头测量Run、Wait、Stop、DSM、SNVS各模式下的典型电流,建立基线。若某模式电流明显偏高,优先检查是否有外设时钟未关、GPIO悬空或DDR未进入自刷新。
注意:不同i.MX型号的电源域划分和模式命名差异较大,例如i.MX8M的MIX域与i.MX6的GPU域并不完全对应。移植低功耗代码时,必须以目标芯片的参考手册和BSP为准,不可直接复制其他型号的寄存器配置。