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;退出时再按相反顺序恢复。

24MHz 晶振 XTAL / 外部时钟 PLL 组 ARM / SYS / DDR AUDIO / VIDEO CCM 时钟控制模块 MUX 时钟源选择 DIV 分频控制 CCGR 模块门控 CCGR0 ~ CCGR6 LPCG 低功耗时钟门控 外设级细粒度门控 idle 自动关断 低功耗握手信号 靠近消费者 时钟源 GPC 通用电源控制器 电源域管理 · 低功耗模式切换 · WFI/WFE 响应 Run / Wait / Stop / DSM 模式仲裁 接收中断、外设握手、CPU 低功耗请求 低功耗请求 模式控制 时钟消费者 CPU 内核 · 总线 · DDR · 显示 · 音频 · USB · 定时器 · 外设控制器 门控后时钟 分频后时钟 低功耗控制接口 WFI / WFE 指令 中断唤醒源 外设低功耗握手 模式状态回读 请求 状态 时钟源 CCM LPCG GPC 低功耗接口

五、低功耗控制接口:软件如何“说话”

软件与这套硬件机制交互,主要通过三类接口:

  1. CPU 指令接口:执行 WFI(Wait For Interrupt)或 WFE(Wait For Event)后,CPU 停止取指,GPC 根据当前配置决定进入 Wait 还是 Stop。这是最常用的入口。
  2. 寄存器接口:通过 CCM_CCGRx 关闭模块时钟,通过 CCM_CCDR 关闭显示、DDR 等域时钟,通过 GPC 的 CNPC、PGR 等寄存器配置唤醒源和模式。
  3. 外设握手接口:某些外设(如 USB、ENET)在空闲时向 GPC 发出低功耗请求,GPC 再联动 LPCG 关断其时钟,实现“外设自主省电”。

一个典型的低功耗进入流程是:应用判断系统空闲 → 关闭未使用外设的 CCGR 位 → 配置 GPC 唤醒源(如 GPIO 按键、RTC 闹钟)→ 执行 WFI → GPC 请求 LPCG 门控相关时钟 → 系统进入 Stop → 唤醒事件到来 → GPC 恢复时钟 → CPU 从 WFI 后继续执行。退出后应回读 GPC 状态寄存器,确认模式切换是否成功,并检查关键外设时钟是否已恢复。

调试提示:如果执行 WFI 后电流没有明显下降,优先检查三处:① CCGR 中是否仍有大量模块处于 11;② GPC 是否被配置为仅进入 Wait 而非 Stop;③ 是否有外设持续产生中断阻止进入深睡。用示波器观察 24MHz 晶振或 PLL 输出是否停振,可以快速判断时钟是否真的被关断。

六、四者协作关系小结