I.MX6U 裸机开发11.主频和时钟配置实验
一、I.MX6U的晶振
前面章节的测试程序,I.MX6ULL都是在以默认主频 396M 速度在运行,而该芯片可以以多种速率运行。本章节介绍如何配置主频。
1. 32.768KHz晶振
该晶振主要有以下作用:
- 该晶振供RTC(实时时钟)使用,通常用于驱动RTC模块,以提供准确的时间和日期信息,即使处理器在低功耗时也能保持运行。
- 在低功耗模式下,32.768KHz的时钟也可以作为系统时钟源,以减少功耗。
- 32.768KHz的时钟还可以作为其他模块的时钟源,如看门狗定时器(WDT)、低功耗定时器(LPT)。
2. 24MHz晶振
(1)硬件电路
(2)主要作用
在芯片的T16、T17引脚,接了24MHz的晶振,这个晶振是系统的主要的时钟源,主要有以下作用:
- 系统时钟源:24MHz 晶振作为主时钟源,为处理器和其他外设提供时钟信号。
- PLL 输入:24MHz 晶振信号可以作为锁相环(PLL)的输入,PLL 可以将其倍频生成更高频率的时钟信号,用于 CPU 和其他高速外设。
- 外设时钟:一些外设模块可以直接使用 24MHz 晶振作为时钟源。
(3)PLL介绍
在 I.MX6ULL 处理器中,PLL(锁相环)用于生成各种频率的时钟信号,以满足不同模块的需求。以下是几种常见的 PLL:
ARM PLL :
用于生成 ARM Cortex-A7 内核的时钟信号。
System PLL (528PLL):
用于生成系统总线和外设的时钟信号。
USB1、USB2 PLL :
用于生成 USB 模块的时钟信号。
ENET PLL
Audio PLL:
用于生成音频模块的时钟信号。
Video PLL:
用于生成视频模块的时钟信号。
二、时钟树
1. 时钟树的概念
I.MX6ULL 的时钟树是一个复杂的时钟分配网络,用于将时钟信号从时钟源分配到处理器内的各个模块和外设。以下是 I.MX6ULL 时钟树的主要组成部分:
-
外部时钟源:
- 24MHz 晶振:主要的时钟源,用于生成系统时钟和外设时钟。
- 32.768KHz 晶振:用于低功耗模式和 RTC(实时时钟)。
-
PLL(锁相环):
- PLL1 (ARM PLL):用于生成 ARM Cortex-A7 内核的时钟信号。
- PLL2 (System PLL):用于生成系统总线和外设的时钟信号,输出频率为 528MHz。
- PLL3 (USB PLL):用于生成 USB 模块的时钟信号,输出频率为 480MHz。
- PLL4 (Audio PLL):用于生成音频模块的时钟信号。
- PLL5 (Video PLL):用于生成视频模块的时钟信号。
-
时钟分配:
- CCM(Clock Control Module):时钟控制模块,用于管理和分配时钟信号。
- 时钟门控:通过启用或禁用时钟信号来控制各个模块的时钟,以节省功耗。
-
时钟域:
- 系统时钟域:包括 CPU、总线和内存控制器等。
- 外设时钟域:包括 UART、I2C、SPI 等外设模块。
- 低功耗时钟域:包括 RTC 和低功耗定时器等。
2. I.MX6ULL 时钟树结构:
外部时钟源
├── 24MHz 晶振
│ ├── PLL1 (ARM PLL) -> ARM Cortex-A7 内核时钟
│ ├── PLL2 (System PLL) -> 系统总线和外设时钟 (528MHz)
│ ├── PLL3 (USB PLL) -> USB 模块时钟 (480MHz)
│ ├── PLL4 (Audio PLL) -> 音频模块时钟
│ └── PLL5 (Video PLL) -> 视频模块时钟
└── 32.768KHz 晶振
├── RTC (实时时钟)
└── 低功耗模式时钟
时钟分配
├── CCM (Clock Control Module)
│ ├── 系统时钟域
│ │ ├── CPU
│ │ ├── 总线
│ │ └── 内存控制器
│ ├── 外设时钟域
│ │ ├── UART
│ │ ├── I2C
│ │ └── SPI
│ └── 低功耗时钟域
│ ├── RTC
│ └── 低功耗定时器
└── 时钟门控
├── 启用时钟
└── 禁用时钟
3. 外设找到PLL的方式
在《IMX6ULL参考手册》 P629:
最右侧是外设,顺着线路向左找对应的PLL。
三、7路PLL
1. ARM PLL(PLL1)
ARM PLL详解
ARM PLL (PLL1) 用于生成 ARM Cortex-A7 内核的时钟信号,其主要特点:
- 输入时钟源:通常为 24MHz 晶振。
- 输出频率范围:650 MHz 到 1.3 GHz。
- 输出频率选择:通过 7 位寄存器字段
CCM_ANALOG_PLL_ARM[DIV_SELECT]
进行选择。 - 频率计算公式:PLL 输出频率 = Fref * DIV_SEL / 2,其中 Fref 为 24MHz。
2. SYSTEM PLL(PLL2)
PLL2 (System PLL) 用于生成系统总线和外设的时钟信号,其主要特点:
- 输入时钟源:通常为 24MHz 晶振。
- 输出频率:默认频率为 528MHz。
- 低抖动时钟:从 24MHz 参考时钟合成低抖动时钟。
- 输出时钟:一个主输出时钟和四个 PFD(Phase Fractional Divider)输出。
- 扩频调制:支持扩频调制,用于减少辐射发射。
- 锁定时间:由于支持扩频调制,PLL 的锁定时间比不支持扩频调制的 PLL 更长。
扩频调制
扩频操作通过配置 CCM_ANALOG_PLL_SYS_SS
寄存器来控制。当启用时,PLL 输出频率将根据 STEP
字段定义的量减少,直到达到 STOP
字段中的限制频率。然后频率将类似地返回到原始标称频率。
- 扩频范围:
Spread spectrum range = Fref x CCM_ANALOG_PLL_SYS_SS[STOP] / CCM_ANALOG_PLL_SYS_DENOM[B]
- 调制频率:
Modulation frequency = Fref x CCM_ANALOG_PLL_SYS_SS[STEP] / (2 x CCM_ANALOG_PLL_SYS_SS[STOP])
PLL2 分出的 PFD 详解
在 i.MX6ULL 处理器中,PLL2(System PLL)除了提供主输出时钟外,还分出四个 PFD(Phase Fractional Divider)输出。PFD 是一种相位分数分频器,用于生成不同频率的时钟信号,以满足不同模块的需求。
3. USB1 PLL(PLL3)
USB1 PLL 用于生成 USB 模块的时钟信号,其主要特点:
- 输入时钟源:通常为 24MHz 晶振。
- 输出频率:USB1 PLL 的输出频率为 480MHz。
- 低抖动时钟:从 24MHz 参考时钟合成低抖动时钟。
- PFD 输出:USB1 PLL 具有 4 个频率可编程的 PFD(Phase Fractional Divider)输出。
- 固定频率:尽管 USB1 PLL 具有
DIV_SELECT
寄存器字段,但在正常操作中应始终设置为 480MHz。
4. Audio PLL(PLL4)
Audio PLL用于生成音频模块的时钟信号。
5. Video PLL(PLL5)
Video PLL主要用于液晶显示之类的外设模块的时钟信号 。
6. ENET PLL(PLL6)
ENET PLL 用于生成特定模块的时钟信号。
7. USB2 PLL(PLL7)
USB2 PLL仅通过直接连接用于 USB UTM 接口。
主要需要初始化的PLL和PFD有:
- PLL1
- PLL2、PLL2的PFD0~PFD3
- PLL3、PLL3的PFD0~PFD3
频率的设置一般按时钟树的值设置,另外可以根据《IMX6ULL参考手册》第641页的表格设置: