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 | 全速运行 | 全部时钟开启,电压正常 | — |
| Wait | CPU停止取指,WFI | 核心时钟门控,外设时钟保留 | 任意使能的中断 |
| Stop | CPU掉电或深度门控 | SoC部分域关闭,DDR自刷新 | GIC中断、GPIO、RTC |
| DSM | Deep 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)和电源管理章节为准,不能跨型号直接套用。
三、状态保持:哪些内容必须“活下来”
进入低功耗模式前,软件必须明确三件事:
- 哪些寄存器必须保留:如DDR控制器的自刷新配置、引脚复用、唤醒屏蔽位、SNVS备份寄存器。
- 哪些外设可以断电:如未使用的UART、I2C、PWM,可关闭其时钟和电源域。
- 哪些状态需要备份到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未正确恢复。
五、模式选择与配置思路
实际项目中,模式选择通常由“响应时间”和“功耗预算”共同决定。若系统需要毫秒级响应,优先选Wait;若允许几十毫秒到几百毫秒恢复,可选Stop;若设备大部分时间处于待机、仅靠RTC或按键唤醒,则选DSM或SNVS。配置时建议按以下顺序推进:
- 确认当前芯片型号支持的电源模式列表,查阅RM中“Power Management”章节。
- 梳理所有外设的电源域归属,关闭未使用模块的时钟和电源。
- 配置DDR自刷新参数,确保进入低功耗前完成。
- 设置唤醒源:使能中断、清除标志、配置GPIO边沿或RTC闹钟。
- 进入低功耗模式,唤醒后读取唤醒状态寄存器,验证来源是否正确。