I.MX6UL:主频和时钟配置实验
默认配置下 I.MX6U 工作频率为 396MHz。但是 I.MX6U 系列标准的工作频率为 528MHz,有些型号甚至可以工作到 696MHz。本章我们就学习 I.MX6U 的时钟系统,学习如何配置 I.MX6U 的
系统时钟和其他的外设时钟,使其工作频率为 528MHz,其他的外设时钟源都工作在 NXP 推荐的频率。
一、I.MX6UL时钟系统分析
很多外设器件,每个器件的时钟信号不一样,所以要将一个固定的信号频率进行倍频/分频处理,达到每个外设需要的频率。时钟信号的分频就像树的分支一样,这就是时钟树。
时钟树,可以理解为🌳的主干为24Mhz晶振,24M晶振驱动所有外设是无法满足的,所有树木的主干延伸出了一些枝干,这些枝干为PLL1、PLL2....PLL3,PLL又延伸出了PFD,分支的枝干结出的小果实对应外设,这些小果实需要养分(时钟)。
1.1 系统时钟来源
下图为I.MX6U-ALPHA 开发板原理图,开发板时钟原理图。从图可以看出 I.MX6U-ALPHA 开发板的系统时钟来源于两部分:32.768KHz 和24MHz 的晶振,其中 32.768KHz 晶振是 I.MX6U 的 RTC 时钟源,24MHz 晶振是 I.MX6U 内核和其它外设的时钟源。
32.768KHz晶振是外部低速晶振,这个晶振的主要作用于实时时钟功能(real-time-clock)。RTC需要一个稳定的,低功耗的时钟源来持续跟踪时间,即使在系统电源关闭的或低功耗模式下也能保证时间准确。
24MHz 的晶振是外部高速时钟,对于开发板来说,这个晶振是IMX6U内核和其他外设的的主要时钟源。
1.2 7 路PLL时钟源
I.MX6U 的外设有很多,不同的外设时钟源不同,NXP 将这些外设的时钟源进行了分组,一共有 7 组,这 7 组时钟源都是从 24MHz 晶振 PLL 而来的,因此也叫做 7 组 PLL,这 7 组 PLL结构如图所示。
(1)ARM_PLL(PLL1),此路 PLL 是供 ARM 内核使用的,ARM 内核时钟就是由此 PLL
生成的,此 PLL 通过编程的方式最高可倍频到 1.3GHz。
(2)528_PLL(PLL2),此路 PLL 也叫做 System_PLL,此路 PLL 是固定的 22 倍频,不可编
程修改。因此,此路 PLL 时钟=24MHz * 22 = 528MHz,这也是为什么此 PLL 叫做 528_PLL 的原因。此 PLL 分出了 4 路 PFD,分别为:PLL2_PFD0~PLL2_PFD3,这 4 路 PFD 和 528_PLL共同作为其它很多外设的根时钟源。通常 528_PLL 和这 4 路 PFD 是 I.MX6U 内部系统总线的时钟源,比如内处理逻辑单元、DDR 接口、NAND/NOR 接口等等。
(3)USB1_PLL(PLL3),此路 PLL 主要用于 USBPHY,此 PLL 也有四路 PFD,为:
PLL3_PFD0~PLL3_PFD3,USB1_PLL 是固定的 20 倍频,因此 USB1_PLL=24MHz *20=480MHz。
USB1_PLL 虽然主要用于 USB1PHY,但是其和四路 PFD 同样也可以作为其他外设的根时钟源。
(4)USB2_PLL(PLL7),看名字就知道此路 PLL 是给 USB2PHY 使用的。同样的,此路 PLL 固定为 20 倍频,因此也是 480MHz。
(5)ENET_PLL(PLL6),此路 PLL 固定为 20+5/6 倍频,因此 ENET_PLL=24MHz * (20+5/6)
= 500MHz。此路 PLL 用于生成网络所需的时钟,可以在此 PLL 的基础上生成 25/50/100/125MHz
的网络时钟。
(6)VIDEO_PLL(PLL5),此路 PLL 用于显示相关的外设,比如 LCD,此路 PLL 的倍频可以调整,PLL 的输出范围在 650MHz--1300MHz。此路 PLL 在最终输出的时候还可以进行分频,可选 1/2/4/8/16 分频。
(7)AUDIO_PLL(PLL4),此路 PLL 用于音频相关的外设,此路 PLL 的倍频可以调整,PLL的输出范围同样也是 650MHz--1300MHz,此路 PLL 在最终输出的时候也可以进行分频,可选1/2/4 分频。
1.3 时钟树
在图主要为三部分:CLOCK_SWITCHER、CLOCK ROOT GENERATOR 和SYSTEM CLOCKS。其中左边的 CLOCK_SWITCHER 就是我们上一小节讲解的那 7 路 PLL 和8 路 PFD,右边的 SYSTEM CLOCKS 就是芯片外设,中间的 CLOCK ROOT GENERATOR 是最复杂的!这一部分就像“月老”一样,给左边的 CLOCK_SWITCHER 和右边的 SYSTEM CLOCKS进行牵线搭桥。外设时钟源是有多路可以选择的,CLOCK ROOT GENERATOR 就负责从 7 路 PLL 和 8 路 PFD 中选择合适的时钟源给外设使用。
图中长得像梯形的是数据选择器,数据选择器标黑点的一路表示要在黄色标识的寄存器的位写入1,表示选择黑点的路。
二、I.MX6UL时钟系统配置
2.1 内核时钟配置
我们将 I.MX6U 的主频设置为 528MHz,根据时钟树可以看到ARM 内核时钟如图所示。
①、内核时钟源来自于 PLL1,假如此时 PLL1 为 996MHz。
②、通过寄存器 CCM_CACRR 的 ARM_PODF 位对 PLL1 进行分频,可选择 1/2/4/8 分频,假如我们选择 2 分频,那么经过分频以后的时钟频率是 996/2=498MHz。
③、灰色方块处没有进行 2 分频!!!
④、经过第②步 2 分频以后的 498MHz 就是 ARM 的内核时钟,也就是 I.MX6U 的主频。
在修改 PLL1 时钟频率的时候我们需要先将内核时钟源改为其他的时钟源,改变时钟需要提供一个备用时钟,时钟相当于心跳。
①、pll1_sw_clk 也就是 PLL1 的最终输出频率。
②、 此 处 是 一 个 选 择 器 , 选 择 pll1_sw_clk 的时 钟 源 , 由 寄 存 器 CCM_CCSR 的
PLL1_SW_CLK_SEL 位决定 pll1_sw_clk 是选择 pll1_main_clk 还是 step_clk。正常情况下应该选择 pll1_main_clk,但是如果要对 pll1_main_clk(PLL1)的频率进行调整的话,比如我们要设置PLL1=1056MHz,此时就要先将 pll1_sw_clk 切换到 step_clk 上。等 pll1_main_clk 调整完成以后再切换回来。
③、此处也是一个选择器,选择 step_clk 的时钟源,由寄存器 CCM_CCSR 的 STEP_SEL 位来决定 step_clk 是选择 osc_clk 还是 secondary_clk。一般选择 osc_clk,也就是 24MHz 的晶振。
2.2 PFD时钟的配置
设置好主频以后我们还需要设置好其他的 PLL 和 PFD 时钟,PLL1 上一小节已经设置,PLL2、PLL3 和 PLL7 固定为528MHz、480MHz 和 480MHz,PLL4~PLL6 都是针对特殊外设的,用到的时候再设置。因此,接下来重点就是设置 PLL2 和 PLL3 的各自 4 路 PFD,NXP 推荐的这 8 路 PFD 频率如图所示。
2.3 AHB、IPG和PERCLK 根时钟设置
7 路 PLL 和 8 路 PFD 设置完成以后最后还需要设置 AHB_CLK_ROOT 和 IPG_CLK_ROOT
的时钟,I.MX6U 外设根时钟可设置范围如图。
更新中.....