嵌入式Linux裸机开发笔记8(IMX6ULL)主频和时钟配置实验(1)

发布于:2025-07-29 ⋅ 阅读:(19) ⋅ 点赞:(0)

引言

        在前几章实验中我们都没有涉及到 I.MX6U 的时钟和主频配置操作,全部使用的默认配置,
默认配置下 I.MX6U 工作频率为 396MHz。但是 I.MX6U 系列标准的工作频率为 528MHz,有些
型号甚至可以工作到 696MHz。本章学习 I.MX6U 的时钟系统,学习如何配置 I.MX6U
系统时钟和其他的外设时钟,使其工作频率为 528MHz,其他的外设时钟源都工作在 NXP 推荐
的频率。

8.1 I.MX6U 时钟系统详解

        I.MX6U 的系统主频为 528MHz,有些型号可以跑到 696MHz,但是默认情况下内部 boot
rom 会将 I.MX6U 的主频设置为 396MHz。我们在使用 I.MX6U 的时候肯定是要发挥它的最大性能,那么主频肯定要设置到 528MHz(其它型号可以设置更高, 比如 696MHz),其它的外设时钟也要设置到 NXP 推荐的值。

8.1.1 系统时钟来源

        打开 I.MX6U-ALPHA 开发板原理图,开发板时钟原理图如图 8.1.1.1 所示:

图 8.1.1.1 开发板时钟原理图
        从图8.1.1.1 可以看出 I.MX6U-ALPHA 开发板的系统时钟来源于两部分:32.768KHz 和24MHz 的晶振,其中 32.768KHz 晶振是 I.MX6U RTC 时钟源,24MHz 晶振是 I.MX6U 内核和其它外设的时钟源,也是我们重点要分析的。

8.1.2 7PLL时钟源

        I.MX6U 的外设有很多,不同的外设时钟源不同,NXP 将这些外设的时钟源进行了分组,
一共有 7 组,这 7 组时钟源都是从 24MHz 晶振 PLL 而来的,因此也叫做 7 PLL,这 7 PLL
结构如图 8.1.1.2 所示:

图 8.1.2.1 初级 PLLs 时钟源生成图
        图8.1.2.1 展示了 7 PLL 的关系,我们依次来看一下这 7 PLL 都是什么做什么的:
        ①、 ARM_PLLPLL1),此路 PLL 是供 ARM 内核使用的,ARM 内核时钟就是由此 PLL
生成的,此 PLL 通过编程的方式最高可倍频到 1.3GHz
        ②、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 接口等等。
        ③、USB1_PLL(PLL3),此路 PLL 主要用于 USBPHY,此 PLL 也有四路 PFD,为:
PLL3_PFD0~PLL3_PFD3USB1_PLL 是固定的 20 倍频,因此 USB1_PLL=24MHz *20=480MHz
USB1_PLL虽然主要用于USB1PHY,但是其和四路PFD同样也可以作为其他外设的根时钟源。
        ④、USB2_PLL(PLL7,没有写错!就是 PLL7,虽然序号标为 4,但是实际是 PLL7),看名
字就知道此路PLL是给USB2PHY 使用的。同样的,此路PLL固定为20倍频,因此也是480MHz
        ⑤、ENET_PLL(PLL6),此路 PLL 固定为 20+5/6 倍频,因此 ENET_PLL=24MHz * (20+5/6)
= 500MHz。此路 PLL 用于生成网络所需的时钟,可以在此 PLL 的基础上生成 25/50/100/125MHz
的网络时钟。
        ⑥、VIDEO_PLL(PLL5),此路 PLL 用于显示相关的外设,比如 LCD,此路 PLL 的倍频可以
调整,PLL 的输出范围在 650MHz~1300MHz。此路 PLL 在最终输出的时候还可以进行分频,
可选 1/2/4/8/16 分频。
        ⑦、AUDIO_PLL(PLL4),此路 PLL 用于音频相关的外设,此路 PLL 的倍频可以调整,PLL
的输出范围同样也是 650MHz~1300MHz,此路 PLL 在最终输出的时候也可以进行分频,可选
1/2/4 分频。

8.1.3 时钟树简介

        在上一小节讲解了 7 PLLI.MX6U 的所有外设时钟源都是从这 7 PLL 和有些 PLL
PFD 而来的,这些外设究竟是如何选择 PLL 或者 PFD 的?这个就要借助《IMX6ULL 参考手
册》里面的时钟树了,如图 8.1.3.1 所示:
图 8.1.3.1 I.MX6U 时钟树
        在图 8.1.3.1 中一共有三部分:CLOCK_SWITCHERCLOCK 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 中选择合适的时钟源给外设使用。具体操作肯定是设置相应的寄存器,我们以
ESAI 这个外设为例,ESAI 的时钟图如图 8.1.3.2 所示:
图 8.1.3.2 ESAI 时钟        
        在图 8.1.3.2 中我们分为了 3 部分,这三部分如下:
        ①、此部分是时钟源选择器,ESAI 4 个可选的时钟源:PLL4PLL5PLL3_PFD2
pll3_sw_clk 。具体选择哪一路作为ESAI的时钟源是由寄存器CCM->CSCMR2的ESAI_CLK_SEL 位来决定的,用户可以自由配置,配置如图 8.1.3.3 所示:
图 8.1.3.3 寄存器 CSCMR2 ESAI_CLK_SEL
        ②、此部分是 ESAI 时钟的前级分频,分频值由寄存器 CCM_CS1CDR ESAI_CLK_PRED
来确定的,可设置 1~8 分频,假如现在 PLL4=650MHz,我们选择 PLL4 作为 ESAI 时钟,前级
分频选择 2 分频,那么此时的时钟就是 650/2=325MHz
        ③、此部分又是一个分频器,对②中输出的时钟进一步分频,分频值由寄存器CCM_CS1CDR 的 ESAI_CLK_PODF 来决定,可设置 1~8 分频。假如我们设置为 8 分频的话,
经过此分频器以后的时钟就是 325/8=40.625MHz。因此最终进入到 ESAI 外设的时钟就是
40.625MHz
        上面我们以外设 ESAI 为例讲解了如何根据图 8.1.3.1 来设置外设的时钟频率,其他的外
设基本类似的。

8.1.4 内核时钟设置

        I.MX6U 的时钟系统前面几节已经分析的差不多了,现在就可以开始设置相应的时钟频率
了。先从主频开始,我们将 I.MX6U 的主频设置为 528MHz,根据图 8.1.3.2 的时钟树可以看到
ARM 内核时钟如图 8.1.4.1 所示:
图 8.1.4.1 ARM 内核时钟树        
        在图 8.1.4.1 中各部分如下:
        ①、内核时钟源来自于 PLL1,假如此时 PLL1 996MHz
        ②、通过寄存器 CCM_CACRR ARM_PODF 位对 PLL1 进行分频,可选择 1/2/4/8 分频,
假如我们选择 2 分频,那么经过分频以后的时钟频率是 996/2=498MHz
        ③、大家不要被此处的 2 分频给骗了,此处没有进行 2 分频(我就被这个2分频骗了好久,
主频一直配置不正确!)
        ④、经过第②步 2 分频以后的 498MHz 就是 ARM 的内核时钟,也就是 I.MX6U 的主频。
经过上面几步的分析可知,假如我们要设置内核主频为 528MHz,那么 PLL1 可以设置为
1056MHz,寄存器 CCM_CACRR ARM_PODF 位设置为 2 分频即可。同理,如果要将主频设
置为 696MHz,那么 PLL1 就可以设置为 696MHzCCM_CACRR ARM_PODF 设置为 1
频即可。现在问题很清晰了,寄存器 CCM_CACRR ARM_PODF 位很好设置,PLL1 的频率
可以通过寄存器 CCM_ANALOG_PLL_ARMn 来设置。接下来详细的看一下 CCM_CACRR
CCM_ANALOG_PLL_ARMn 这两个寄存器,CCM_CACRR 寄存器结构如图 8.1.4.2 所示:

图 8.1.4.2 寄存器 CCM_CACRR
        寄存器 CCM_CACRR 只有 ARM_PODF 位,可以设置为 0~7,分别对应 1~8 分频。如果要
设置为2分频的话CCM_CACRR就要设置为1。再来看一下寄存器CCM_ANALOG_PLL_ARMn
此寄存器结构如图 8.1.4.3 所示:

图 8.1.4.3 寄存器 CCM_ANALOG_PLL_ARMn
        在寄存器 CCM_ANALOG_PLL_ARMn 中重要的位如下:
        ENABLE: 时钟输出使能位,此位设置为 1 使能 PLL1 输出,如果设置为 0 的话就关闭 PLL1
输出。
        DIV_SELECT: 此位设置 PLL1 的输出频率,可设置范围为:54~108PLL1 CLK = Fin *
div_seclec/2.0Fin=24MHz。如果 PLL1 要输出 1056MHz 的话,div_select 就要设置为 88
在修改 PLL1 时钟频率的时候我们需要先将内核时钟源改为其他的时钟源,PLL1 可选择的
时钟源如图 8.1.4.4 所示:

图 8.1.4.4 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 的晶振。这里我们就用到了一个寄存器 CCM_CCSR,此寄存器结构如图 8.1.4.5 所示:

图 8.1.4.5 寄存器 CCM_CCSR 结构图
        寄存器 CCM_CCSR 我们只用到了 STEP_SELPLL1_SW_CLK_SEL 这两个位,一个是用
来选择 step_clk 时钟源的,一个是用来选择 pll1_sw_clk 时钟源的。
        到这里,修改 I.MX6U 主频的步骤就很清晰了,修改步骤如下:
        ①、 设置寄存器 CCSR STEP_SEL 位,设置 step_clk 的时钟源为 24M 的晶振。
        ②、设置寄存器 CCSR PLL1_SW_CLK_SEL 位,设置 pll1_sw_clk 的时钟源为
step_clk=24MHz,通过这一步我们就将 I.MX6U 的主频先设置为 24MHz,直接来自于外部的
24M 晶振。
        ③、设置寄存器 CCM_ANALOG_PLL_ARMn,将 pll1_main_clk(PLL1)设置为 1056MHz
        ④、设置寄存器 CCSR PLL1_SW_CLK_SEL 位,重新将 pll1_sw_clk 的时钟源切换回
pll1_main_clk,切换回来以后的 pll1_sw_clk 就等于 1056MHz
        ⑤、最后设置寄存器 CCM_CACRR ARM_PODF 2 分频,I.MX6U 的内核主频就为
1056/2=528MHz。        

网站公告

今日签到

点亮在社区的每一天
去签到