3. i.MX时钟与电源门控基础
在 i.MX 系列处理器中,低功耗并不是靠某一个寄存器“一键省电”实现的,而是由时钟供给与电源域开关两条主线协同完成。理解这两条主线,必须先认识四个核心模块:CCM(Clock Controller Module,时钟控制模块)、GPC(General Power Controller,通用电源控制器)、LPCG(Low Power Clock Gating,低功耗时钟门控)以及它们所服务的时钟树与低功耗控制接口。本节从“信号从哪里来、经过谁、被谁关断”的角度,把这套机制讲清楚。
一、时钟树:从晶振到每个外设的供给路径
i.MX 的时钟树是一棵多级分叉的树。根节点通常是 24MHz 晶振(或外部差分时钟),经 PLL 倍频后产生若干高频源,例如 ARM_PLL、SYS_PLL、DDR_PLL、AUDIO_PLL、VIDEO_PLL 等。每个 PLL 输出再经过多路选择器(MUX)、分频器(DIV)和门控单元,最终送到 CPU 内核、总线、DDR、显示、音频、USB 等具体消费者。
以常见的 i.MX6ULL 为例,ARM 内核时钟路径大致为:24MHz 晶振 → PLL1(ARM_PLL,可倍频到 792MHz 或 996MHz)→ ARM 时钟分频器(CCM_CACRR)→ 内核。而 AHB、IPG、PERCLK 等总线时钟则由 PLL2(SYS_PLL,528MHz)经 CCM_CBCDR、CCM_CBCMR 中的分频与 MUX 派生。理解时钟树的关键,是知道每一级都有独立的使能位和分频比,关掉上游或把分频比调大,都会直接降低下游功耗。
二、CCM:时钟的“总调度台”
CCM 是时钟树的管理者,它提供三类寄存器:
- 时钟源选择:通过 MUX 位选择某个 PLL 或旁路时钟作为某条路径的输入;
- 分频控制:通过 DIV 字段设置分频系数,改变输出频率;
- 门控使能:通过 CCGR(Clock Gating Register)控制各模块时钟的开关。
CCGR 是 CCM 中最常被低功耗代码操作的部分。i.MX6ULL 有 CCGR0~CCGR6 共 7 个寄存器,每个寄存器管理 16 个模块的时钟门控,每 2 位对应一个模块,取值含义为:00 所有模式关闭、01 仅运行模式开启、10 保留、11 所有模式开启。例如把某个未使用外设对应的 2 位写成 00,该外设时钟即被切断,动态功耗随之下降。
/* 示例:关闭某外设时钟(以 CCGR 某 2 位为例) */
CCM_CCGRx &= ~(0x3u << (2 * n)); /* 置 00,关闭该模块时钟 */
CCM_CCGRx |= (0x3u << (2 * n)); /* 置 11,所有模式开启 */
需要注意,CCGR 控制的是“模块级”门控,粒度较粗;更细的关断由 LPCG 完成。
三、LPCG:更细粒度的时钟门控单元
LPCG 是分布在各个外设或子系统附近的低功耗时钟门控单元。与 CCGR 的集中式管理不同,LPCG 更靠近消费者,通常由 GPC 或外设自身的低功耗状态机触发。它的作用是:当某个外设进入 idle 或低功耗状态时,自动切断其时钟,而不需要 CPU 反复写 CCM 寄存器。LPCG 的典型输入包括时钟源、使能信号和低功耗请求信号,输出为被门控后的时钟。
可以把 CCGR 理解为“总闸”,LPCG 理解为“分闸”。总闸决定某模块是否允许有时钟,分闸决定在允许的前提下,当前是否真的把时钟送出去。两者配合,才能既保证功能正确,又尽可能省电。
四、GPC:电源域与低功耗模式的控制器
GPC 负责管理芯片的电源域和低功耗模式切换。它接收来自 CPU 的 WFI/WFE 请求、外部中断、以及各外设的低功耗握手信号,然后决定进入哪种低功耗状态。i.MX6ULL 的 GPC 支持 Run、Wait、Stop、DSM(Deep Sleep Mode)等模式,不同模式下关闭的电源域和时钟域不同。
GPC 与 CCM、LPCG 的关系是:GPC 发出低功耗请求 → LPCG 响应并门控相应时钟 → CCM 中的 CCGR 和 PLL 使能位根据模式进一步调整。例如进入 Stop 模式时,GPC 会请求关闭 ARM 内核时钟、部分总线时钟,并可能关闭某些 PLL;退出时再按相反顺序恢复。
五、低功耗控制接口:软件如何“说话”
软件与这套硬件机制交互,主要通过三类接口:
- CPU 指令接口:执行
WFI(Wait For Interrupt)或WFE(Wait For Event)后,CPU 停止取指,GPC 根据当前配置决定进入 Wait 还是 Stop。这是最常用的入口。 - 寄存器接口:通过 CCM_CCGRx 关闭模块时钟,通过 CCM_CCDR 关闭显示、DDR 等域时钟,通过 GPC 的 CNPC、PGR 等寄存器配置唤醒源和模式。
- 外设握手接口:某些外设(如 USB、ENET)在空闲时向 GPC 发出低功耗请求,GPC 再联动 LPCG 关断其时钟,实现“外设自主省电”。
一个典型的低功耗进入流程是:应用判断系统空闲 → 关闭未使用外设的 CCGR 位 → 配置 GPC 唤醒源(如 GPIO 按键、RTC 闹钟)→ 执行 WFI → GPC 请求 LPCG 门控相关时钟 → 系统进入 Stop → 唤醒事件到来 → GPC 恢复时钟 → CPU 从 WFI 后继续执行。退出后应回读 GPC 状态寄存器,确认模式切换是否成功,并检查关键外设时钟是否已恢复。
11;② GPC 是否被配置为仅进入 Wait 而非 Stop;③ 是否有外设持续产生中断阻止进入深睡。用示波器观察 24MHz 晶振或 PLL 输出是否停振,可以快速判断时钟是否真的被关断。