纸翼 · 加载中
2115 words
11 minutes
主频和时钟配置

初级PLLs时钟源生成图

详细时钟树图

一、时钟图详解#

一、第一张图:i.MX6U 时钟树顶层(PLL 与分频输出)#

这张图是 i.MX6U 芯片的时钟产生顶层架构,核心是 PLL(锁相环)PFD(分数分频器),把外部 24MHz 晶振(OSC24M)倍频成各种高频时钟源,再分频给不同模块。

1. 输入时钟#

  • OSC24M:外部 24MHz 晶振,是所有 PLL 的基准时钟。
  • CLK1/CLK2:备用外部时钟输入(一般不用)。

2. 主要 PLL 模块(7 个核心 PLL)#

编号PLL 名称作用典型输出频率
ARM PLL专门给 CPU 内核 提供时钟最高 996MHz(可配置)
528 PLL通用系统 PLL,输出 528MHz,再通过 528PFD0~3 分频528MHz → 分频后 352~528MHz 范围
480 PLL通用系统 PLL,输出 480MHz,再通过 480PFD0~3 分频480MHz → 分频后 320~480MHz 范围
USB1/2 PLL专门给 USB 模块 提供 480MHz 时钟480MHz(USB 必须精确 480MHz)
ENET PLL专门给 以太网模块 提供时钟500MHz → 分频后 100/125MHz 等
VIDEO PLL专门给 显示/视频模块 提供时钟可配置频率,支持多种显示分辨率
AUDIO PLL专门给 音频模块 提供时钟可配置频率,支持 I²S/SAI 等音频接口

3. 关键控制逻辑#

  • bypass 开关armpll_bypass/528pll_bypass 等,用于绕过 PLL,直接用 24MHz 时钟(调试或低功耗用)。
  • enable 开关armpll_enable/528pll_enable 等,用于关闭不用的 PLL 以节省功耗。
  • PFD 分频:528PLL 和 480PLL 各带 4 组 PFD(分数分频),可以把 528/480MHz 精细分频成不同频率,给不同外设用。
  • 最终输出:每个 PLL/PFD 输出一个 ref_xxx_clk,作为第二张图中“时钟根生成器”的输入源。

二、第二张图:时钟根生成器(Clock Root Generator)#

这张图是 时钟分发层,把第一张图的 PLL/PFD 时钟,通过 MUX(多路选择器)分频器门控,最终分配给每个外设模块(如 UART、I2C、SPI、GPIO 等)。

1. 核心组件#

  • PLL 输入:左侧 PLL1~PLL5 对应第一张图的 ARM PLL、528 PLL、480 PLL 等,频率标注如 996528480 等。
  • MUX(多路选择器):橙色梯形图标,用于选择时钟源(比如选择 PLL1 还是 PLL2 作为某个模块的时钟)。
  • 分频器
    • 灰色:静态分频(固定 1 分频)
    • 蓝色:2 分频
    • 青色:3 分频
    • 绿色:6 分频 用于把高频 PLL 时钟降到外设需要的频率(比如 UART 只需要 80MHz 左右)。
  • LPCG Gating:带锁的圆圈,时钟门控,可以单独关闭某个模块的时钟以节省功耗。
  • Clock Root Out:右侧 xxx_CLK_ROOT,就是最终给外设模块的时钟,比如 UART_CLK_ROOTSPI_CLK_ROOTIPG_CLK_ROOT 等。

2. 典型模块时钟路径示例(以 UART 为例)#

  1. 时钟源选择CSCDR[UART_CLK_SEL] 选择时钟源(比如 OSC 24MHz 或 PLL3 分频后的时钟)。
  2. 分频CSCDR[UART_CLK_PRED] + CSCDR[UART_CLK_PODF] 两级分频,把高频时钟降到 UART 所需的 80MHz 或 40MHz。
  3. 门控UART_CLK_ROOT 经过 LPCG 门控,控制是否给 UART 模块提供时钟。
  4. 模块使用:UART 模块用此时钟生成波特率,进行串口通信。

3. 关键时钟根说明#

  • ARM_CLK_ROOT:CPU 内核时钟,来自 ARM PLL,最高 996MHz。
  • IPG_CLK_ROOT:外设总线时钟(如 I2C、SPI、UART 等),一般 66MHz 或 80MHz。
  • AHB_CLK_ROOT:高速外设总线时钟(如 USB、SDHC、以太网等),一般 132MHz 或 166MHz。
  • PERCLK_ROOT:低功耗外设时钟(如 WDOG、GPT 等),一般 32kHz 或 24MHz。
  • UART_CLK_ROOT / SPI_CLK_ROOT / SAIn_CLK_ROOT:各外设专用时钟,可独立配置频率。

三、整体时钟工作流程#

  1. 源产生:外部 24MHz 晶振 → 各 PLL 倍频 → 生成 528MHz/480MHz/996MHz 等高频时钟。
  2. 精细分频:PLL 输出 → PFD 分频 → 生成多种中间频率时钟源。
  3. 路径选择:中间时钟源 → MUX 选择 → 分频器降频 → 生成 xxx_CLK_ROOT
  4. 模块使用xxx_CLK_ROOT → 外设模块 → 门控控制是否开启时钟。

四、开发中的实际意义#

  1. 配置时钟:裸机开发时,需要先配置 PLL 和分频器,给 CPU 和外设提供稳定时钟。
  2. 功耗控制:通过 bypassenableLPCG 关闭不用的 PLL 和模块时钟,降低功耗。
  3. 外设驱动:每个外设驱动都要配置对应的 xxx_CLK_ROOT 频率,比如 UART 要根据时钟频率计算波特率,SPI 要根据时钟频率配置分频。
  4. 性能调节:提高 ARM PLL 频率可以提升 CPU 性能,但会增加功耗;降低外设时钟可以节省功耗,但会降低外设速度。

五、总结#

  • 第一张图时钟源层,负责把 24MHz 晶振倍频成各种高频 PLL 时钟。
  • 第二张图时钟分发层,负责把高频时钟分频、选择,最终给每个外设模块提供合适的时钟。
  • 两者结合就是 i.MX6U 完整的时钟树,是嵌入式裸机开发中最核心的底层配置,所有外设驱动都依赖正确的时钟配置。

二、时钟核心概念#

1. 基础时钟源#

  • OSC24M:外部 24MHz 晶振,所有 PLL 的基准时钟源,稳定可靠。
  • step_clk:临时时钟源,默认来自 OSC24M,用于 PLL 配置时的安全过渡,避免时钟不稳定导致系统崩溃。

2. 核心 PLL 模块#

PLL 名称用途典型输出备注
PLL1(ARM_PLL)CPU 内核专用1056MHz(可配置)决定 CPU 运算性能,输出后经 CACRR 分频给 CPU
PLL2(528PLL)系统通用主 PLL固定 528MHz为大部分外设/总线提供时钟源,带 4 组 PFD 分频
PLL3(480PLL)系统通用 PLL固定 480MHz为 USB、外设等提供时钟源,带 4 组 PFD 分频
PLL4/5(USB/VIDEO/AUDIO)专用功能 PLL480MHz/可配置USB、视频、音频模块专用,保证协议精度

3. PFD(分数分频器)#

  • 依附于 PLL2/PLL3,每个 PLL 带 PFD0~PFD3 共 4 组独立 PFD。
  • 作用:将 PLL 固定输出的高频时钟(528MHz/480MHz)精细分数分频,生成多种频率,适配不同外设。
  • 公式:Output = F_PLL × 22 / PFD_FRAC(PFD_FRAC 为分频系数,范围 16~35)
  • 示例:PLL2=528MHz,PFD0_FRAC=27 → 528×22/27≈352MHz

4. 时钟分发关键组件#

  • MUX(多路选择器):选择时钟源,如 pll1_sw_clk 可选择 pll1_main_clkstep_clk
  • 分频器
    • CACRR:CPU 内核专属分频寄存器,ARM_PODF = 写入值 + 1,如写入 1 → 2 分频。
    • 通用分频器:2/3/6 分频,用于总线、外设降频。
  • LPCG(时钟门控):独立开关外设时钟,降低功耗。
  • Clock Root:最终给外设的时钟(如 UART_CLK_ROOTAHB_CLK_ROOT)。

三、PLL1(ARM_PLL)配置流程(CPU 主频 528MHz)#

1. 配置步骤#

  1. 判断当前时钟源

    if(((CCM->CCSR >> 2) & 0X1) == 0) { ... }
    • pll1_sw_clk_sel(bit2)=0,表示当前使用 pll1_main_clk,需先切换到 step_clk
  2. 切换到临时时钟 step_clk

    CCM->CCSR &= ~(1 << 8); // step_clk 选择 OSC24M(bit8=0)
    CCM->CCSR |= (1 << 2); // pll1_sw_clk 切换到 step_clk(bit2=1)
  3. 配置 PLL1 输出 1056MHz

    • 公式:Output = f_ref × DIV_SELECT / 2
    • 代入:1056 = 24 × DIV_SELECT / 2 → DIV_SELECT=88
    CCM_ANALOG->PLL_ARM = (1 << 13) | (88 & 0x7F);
    • bit13=1:使能 PLL1;bit0~6=88:设置倍频系数。
  4. 配置 CPU 分频(CACRR)

    CCM->CACRR = 1; // ARM_PODF=1 → 2 分频(1056MHz/2=528MHz)
  5. 切回 PLL1 时钟源

    CCM->CCSR &= ~(1 << 2); // pll1_sw_clk 切换回 pll1_main_clk(bit2=0)

2. 关键寄存器总结#

寄存器作用关键位
CCM->CCSR时钟控制/状态bit2:pll1_sw_clk_sel;bit8:step_clk_sel
CCM_ANALOG->PLL_ARMPLL1 配置bit13:PLL 使能;bit0~6:DIV_SELECT(倍频系数)
CCM->CACRRCPU 分频ARM_PODF(07 对应 18 分频)

四、PLL2/PLL3 及 PFD 配置#

1. PLL2(528MHz)固定配置#

  • PLL2 为系统主 PLL,固定输出 528MHz,一般不修改倍频系数。
  • 寄存器:CCM_ANALOG->PLL_SYS(默认配置即可)。

2. PLL2_PFD0~PFD3 配置#

  • 寄存器:CCM_ANALOG->PFD_528
  • 每路 PFD 对应独立分频位(6 位),设置 PFDx_FRAC 即可。
  • 示例:PLL2_PFD0 输出 352MHz
    // PFD0_FRAC=27 → 528×22/27≈352MHz
    CCM_ANALOG->PFD_528 &= ~(0x3F << 0); // 清除 PFD0 位
    CCM_ANALOG->PFD_528 |= (27 << 0); // 设置 PFD0_FRAC=27

3. PLL3(480MHz)及 PFD 配置#

  • PLL3 固定输出 480MHz,寄存器:CCM_ANALOG->PLL_USB1
  • PFD 配置同 PLL2,寄存器:CCM_ANALOG->PFD_480,公式:Output = 480 × 22 / PFD_FRAC

五、时钟树整体工作流程#

  1. 源产生:OSC24M → PLL 倍频 → 生成 1056/528/480MHz 等高频时钟。
  2. 精细分频:PLL 输出 → PFD 分数分频 → 生成多组中间频率。
  3. 路径选择:MUX 选择时钟源 → 分频器降频 → 生成 xxx_CLK_ROOT
  4. 模块使用xxx_CLK_ROOT → 外设模块 → LPCG 门控控制时钟开关。

六、开发关键注意事项#

  1. PLL 配置安全规范:修改 PLL 前必须切换到 step_clk(24MHz),避免时钟不稳定导致死机。
  2. 分频与倍频的关系
    • PLL1 是生频(24MHz → 1056MHz),CACRR 是降频(1056MHz → 528MHz),二者共同决定 CPU 主频。
    • 不直接将 PLL1 设为 528MHz:高倍频下时钟稳定性更好,且预留扩展空间。
  3. 功耗控制:通过 PLL enable/bypassLPCG 关闭不用的时钟,降低功耗。
  4. 外设时钟依赖:所有外设驱动必须先配置 xxx_CLK_ROOT 频率,再初始化寄存器(如 UART 波特率计算)。
主频和时钟配置
https://blog.huangzy.xyz/posts/主频和时钟配置/
Author
纸翼
Published at
2026-02-04
License
CC BY-NC-SA 4.0

Some information may be outdated