IMX6ULL时钟树原理讲解(超详细)

        对于我们MX6U开发板的系统主频为528MHz,但是默认情况下内部bootroom会将IMX6U的主频设置为396MHz,为了能够让开发板能够达到最大的性能,以及之后学会自己去调整开发板的主频,所以我们要尝试将主频设置到528MHz,所以这一节博主会对IMX6UL的时钟树进行讲解

        我们需要先了解我们常说的主频是什么,也就是CPU内部数字脉冲信号震荡的频率,也就是CPU每秒钟能够处理的时钟周期数。主频的的单位是赫兹(HZ),表示每秒钟的时钟震荡次数。可以理解为主频的大小就直接决定了CPU执行命令的速度,主频越高,CPU在单位时间内能够处理执行的命令也就越多,越高的主频就有更高的性能
        其实对于我们平时了解电脑CPU与单片机的CPU还是有一定的区别,对于单片机往往并不会叫他CPU,而是MCU。例如以STM32举例,芯片内部集成了一个或者多个处理器核心,这些核心负责执行程序指令、处理数据、和控制系统等。对于STM32F1系列的芯片采取的是ARM,Cortex-M3内核,这个内核就是一个高性能的MCU,在芯片当中包含了这个MCU以及许多丰富的外设接口,例如GPIO,ADC等。
        在嵌入式系统或者微控制器领域,通常将这类集成了微处理器核心、存储器、输入输出接口等多种功能模块于一体的的小型计算机系统称为微控制器(Microcontroller Unit, MCU),也就是我们常说的单片机,虽然MCU和CPU在功能上有一定的重叠,但它们在集成度、应用场景、性能和指令集等方面存在显著差异。在嵌入式系统和微控制器领域,我们通常使用MCU;而在个人电脑和其他大型计算机系统中,则使用CPU作为核心处理部件。
 
        时钟树是计算机内部用于分发时钟信号的网络结构,一般起源于一个或者多个时钟源(例如RC振荡器,陶瓷谐振器),通过一系列的缓冲器、分频器,PLL(锁相环)等组件的协同工作,实现了时钟信号的发送、分配和倍频处理。为系统中的各个部件外设提供了稳定可靠的时钟源

        时钟树中的时钟源(例如晶体振荡器)产生的原始频率通常较低,但是它是整个系统时钟基础,通过PLL(相位锁定环),可以让晶体振荡器产生的原始频率倍频到CPU需要(也就是我们需要CPU输出)的主频,也就是可以理解为主频是时钟源频率经过倍频处理后的结果。
        但是在时钟树中,除了需要将时钟信号倍频到CPU需要的主频外,还需要通过分频器将时钟信号分发给系统的其他部分(如内存,外设)。这些部分可能需要与CPU不同的频率来正常工作,在设计时钟树时,也需要考虑 系统中各个部件的时钟需求,并通过分频器实现。
        所以时钟树是确保CPU和其他硬件组件能够同步共工作并发挥最佳性能的网络结构,CPU主频依靠时钟树进行配置。

        那么对于IMX6UL的开发板上面的时钟源是怎样的配置呢,如下图可以看到这是开发板的时钟原理图,在图中可以看到原理图中,有两个时钟源,系统时钟来源于两个部分32.768KHz 和 24MHz 的晶振(只要在晶体板极上施加交变电压,就会使晶片产生机械变形振动,此现象即所谓逆压电效应。当外加电压频率等于晶体谐振器的固有频率时,就会发生压电谐振,从而导致机械变形的振幅突然增大。),其中 32.768KHz 晶振是 I.MX6U 的 RTC 时钟源,24MHz 晶振是 I.MX6U 内核 和其它外设的时钟源。
        这里我们先了解什么是32.768KHz晶振,这个就是我们常说的外部低速晶振,这个晶振的主要作用于实时时钟功能(real-time-clock)。RTC需要一个稳定的,低功耗的时钟源来持续跟踪时间,即使在系统电源关闭的或低功耗模式下也能保证时间准确,32.768KHz,也是他们计算出来的结果,能够保证时间准确性的同时,降低功耗。
        对于另外一个24MHz,就是对应的外部高速时钟,对于开发板来说,这个晶振是IMX6U内核和其他外设的的主要时钟源。由于IMX6U这类需要完成很多复杂的任务,需要一个高频,稳定的时钟源来支持其高速运算和通信。对于所有这类微控制器都会有一个外部高速晶振,也例如STM32这类时钟通常会连接系统时钟SYSCLK(system clock),为芯片内部各大模块的运转提供动力。
        

       首先我们可以看到时钟图的最左上方是一个24MHz的振荡器晶振,如前面所说除了作为MCU的时钟源之一,还是生成多种外设时钟的基础。I.MX6U 的外设有很多,不同的外设时钟源不同,NXP 将这些外设的时钟源进行了分组, 一共有 7 组,这 7 组时钟源都是从 24MHz 晶振 PLL 而来的,因此也叫做 7 组 PLL
        PLL是一种能够生成稳定频率的电路,它可以通过对输入时钟信号进行倍频或分频来产生所需的输出频率。在IMX6UL中,24MHz的晶振信号首先被送入PLL,然后通过编程设置PLL的倍频系数,生成高频的时钟信号(如528MHz、480MHz等)。接着,这些高频信号可以通过分频器进一步分频,以得到适合不同外设使用的时钟频率。这 7 组 PLL 结构如图

                

                首先先介绍一下这七组对应的功能是

1. ARM_PLL(PLL1) 是用于生成ARM CPU核心时钟的专用PLL,将OSC24M(24MHz)晶振倍频生成一个更高频率的时钟信号,驱动ARM处理器的内核

2. 528_PLL(PLL2) 此路 PLL 也叫做 System_PLL,此路 PLL 是固定的 22 倍频,不可编程修改。因此,此路 PLL 时钟=24MHz * 22 = 528MHz,这也是为什么此 PLL 叫做 528_PLL 的 原因。
        在上图中我们可以看到,PLL下方还分出了PFD(Phase Fractional Divider),在PLL输出一个高频信号时,系统中的不同模块可能需要不同的频率时钟信号来工作。这时,引入PFD,它是一种特殊二点分频器,能够将528MHz的时钟信号精确地分成不同的频率,产生多个子时钟。这些分频后的时钟信号通常同于不同的外设、总线等。在此528_PLL下方分出了四个PFD,PLL2_PFD0--PLL2_PFD3,这 4 路 PFD 和 528_PLL 共同作为其它很多外设的根时钟源。通常 528_PLL 和这 4 路 PFD 是 I.MX6U 内部系统总线的时钟源,比如内处理逻辑单元、DDR 接口、NAND/NOR 接口等等。

        这里插入一点,既然已经通过 PLL 将晶振的 24 MHz 倍频到 528 MHz,为何不直接通过 PLL 的配置来实现所需的不同频率,而是要通过 PFD 来生成多个频率?需要了解的是,PLL设计初衷是提供一个稳定且高精度的基准时钟。虽然 PLL 本身可以配置为不同的倍频输出,但一旦配置好,PLL 的输出频率通常是固定的,一般来说就是不会去随意改变。
        PFD能够以更高的精度和灵活性进行分频。与传统的整数分频器不同,PFD 可以实现分数分频,比如将 528 MHz 分频到 396 MHz(528 MHz / 1.33)。这种灵活的分频能力使得系统可以生成更适合不同模块需求的频率,而不需要改变 PLL 的主频。并且还考虑到在复杂设计中,PLL 是一个稀缺资源。每个 PLL 通常用于提供一个固定的高频时钟源。如果每个所需频率都依赖独立的 PLL,那将占用大量的硬件资而通过一个 PLL 输出 528 MHz,然后使用 PFD 分频,可以高效地生成多个频率,从而避免使用多个 PLL。PLL 是一个复杂的闭环控制系统,频繁调整其输出可能会引起时钟抖动和不稳定性。而 PFD 只是在 PLL 固定输出基础上进行分频,它本身不影响 PLL 的锁相状态,从而在生成不同频率时保持更高的稳定性和精度。

3. USB1_PLL(PLL3) 此路主要用于USB1PHY(Physical Layer USB 控制器中的第一个物理层接口),如图下方仍然包含了四路PFD,PLL3_PFD0--PLL3_PFD3是固定的 20 倍频,因此 USB1_PLL=24MHz *20=480MHz。 USB1_PLL虽然主要用于USB1PHY,但是其和四路PFD同样也可以作为其他外设的根时钟源

4. USB2_PLL(PLL7是的,没有写错,虽然目前博主也不知道为啥,反正官方手册是这么写的)名字也很明显,主要用于USB2PHY使用,同样固定20倍倍频,480Mhz

5. ENET_PLL(PLL6),此路 PLL 固定为 20+5/6 倍频,因此 ENET_PLL=24MHz * (20+5/6) = 500MHz。此路 PLL以太网(Ethernet)子系统的专用锁相环(PLL)。它的主要作用是为以太网接口及相关模块提供稳定的时钟信号,以确保以太网数据传输的正常进行。用于生成网络所需的时钟,可以在此 PLL 的基础上生成 25/50/100/125MHz 的网络时钟。根据以太网的速度(10/100/1000 Mbps),ENET_PLL 需要生成不同频率的时钟信号10 Mbps 通常需要 2.5 MHz 时钟。100 Mbps 通常需要 25 MHz 时钟。1 Gbps 通常需要 125 MHz 时钟。ENET_PLL 通过内部配置生成这些不同的频率,并提供给以太网 PHY(物理层)和 MAC(媒体访问控制层)。

6. VIDEO_PLL(PLL5),是专门为视频子系统设计的时钟源。它负责生成支持不同分辨率和刷新率的高精度时钟信号,以满足显示控制器、视频处理器等多媒体模块的需求。通过灵活的配置和时钟分配,VIDEO_PLL 可以为多种视频模式提供支持,从而保证视频输出的稳定性和质量。
        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 分频。

        这个就是对于IMX6UL开发板的时钟源生成图上的信息的一个基本讲解,接下来我们就需要开始讲解时钟树,作为时钟系统的基础,时钟源(如晶振或其他振荡器)生成系统中的基准时钟信号。这些信号是整个系统中所有时钟信号的起点,但是时钟树的作用是负责将时钟源中分配的信号到系统中的各个部分,并保持时钟信号的稳定性和完整性。
        从时钟源发出的信号需要通过时钟树传播,以确保系统中所有部件都能获得同步的时钟信号。时钟树实际上是在系统中创建一个分发网络,从源点到达每一个目标点。在设计时钟系统时,通常先确定时钟源的选择和要求,然后设计时钟树来满足系统的时钟分配需求。时钟树的设计直接受制于时钟源的特性,包括信号频率、强度等。

        

        在开发手册中,时钟树分了两个部分,用两条虚线分隔开来先依次讲解一下他们的意思

        CLOCK Switcher(时钟切换器),时钟切换器的作用在于在多个时钟源之间进行选择。它可以根据系统需求或不同的工作模式在多个时钟源之间进行切换,时钟切换器通常位于时钟源之后,并且在时钟信号传递给下游组件之间,决定哪个时钟源的信号被传递给时钟树的下游部分。可以看到时钟切换器上都是在时钟源上的PLL以及PFD。
        CLOCK Root Generator(时钟根生成器),它是时钟树的核心,负责从选择的时钟源生成基准时钟信号(Root Clock)。它可能包含一些基本的时钟处理功能,如频率调节、倍频或分频。这个生成的基准时钟信号会被进一步分配给系统的不同模块。根据从CLOCK Switcher传入的时钟源信号,生成适合系统需求的各种根时钟信号。这些信号将被传递给不同的模块,在图中可以看到多个分支,每个分支对应不同的时钟生成器。这些分支通过分频器和多路选择器对时钟信号进行处理,然后输出不同频率和配置的时钟信号,例如 ARM_CLK_ROOT、PERIPH_CLK_SEL、AXI_CLK_ROOT 等。
        System Clocks系统时钟是由 CLOCK Root Generator 生成的基准时钟信号进一步分配或调整后传递到各个功能模块(如CPU、外设、I/O等)的时钟信号。系统时钟可能经过更多的分频、倍频或门控以满足不同模块的需求。System Clocks 是时钟树的末端,它们从 CLOCK Root Generator 接受时钟信号,并通过时钟树中的各个节点分发到具体的功能模块中。系统时钟是时钟树的最终输出,确保系统中的每个组件都能接收到正确频率和稳定的时钟信号。
        如图中例如 ARM、MMDC、AXI、IPG、USDHC 等模块。每个模块需要的时钟信号可能不同,因此图中使用了各种分频器(如 1/2、1/4、1/8 等)和门控电路(LPCG Gating Option)来进一步细化和调整时钟信号。

        那么总的来说图中的时钟树,时钟信号从左侧的 CLOCK Switcher 开始,经过选择和处理后进入 CLOCK Root Generator。在这里,信号被进一步生成和分配,形成不同根时钟。最后,这些根时钟通过时钟树的不同分支传递到各个系统模块中,确保它们能够同步且按需工作。

        我们选择时钟树中的一条线来进行分析,首先从这个比较简介的ESAI开始分析,ESAI(Enhanced Serial Audio Interface)一般对应的是音频相关的外设。
        橙色的标记显示这是一个时钟选择器(MUX)它从多个输入时钟源中选择一个输入,其实这里我们可以看到有四种颜色的先,表示四种不同的时钟源。我们结合上面时钟树的图进行溯源,可以看到分别对应着PLL4(黑色)、PLL5(蓝色)、PLL3_PFD2(绿色)、pll3_sw_clk(紫色),会在这四个时钟源中选择一个源作为输入,由 寄 存 器 CCM->CSCMR2 的 ESAI_CLK_SEL 位来决定的,用户可以自由配置。
        为什么需要有多条时钟源可以选择,因为不同工作模式下需要不同频率的时钟,以及为了提高系统的可靠性,加入备用时钟源。如果选择的主时钟源发生故障,系统可以切换到备用时钟,确保系统稳定运行,也可能某些外设或模块可能需要特殊频率的时钟源。通过多个可选时钟源,可以覆盖更广泛的频率需求。

        褐色的圆圈CG,表示门控(Clock Gating,cg)选择了合适的时钟源后,信号进入一个门控模块。门控用于控制时钟信号的启用或者禁用,这个控制一般用于节能或者暂停默写功能模块的操作,只有在需要时才会激活时钟信号。
        然后接着进入一级分频器(CS1CDR[ESAI_CLK_PRED]),在门控后,信号进入一个分频器,该分频器可以将时钟频率除以2。这一操作由CS1CDR[ESAI_CLK_PRED]寄存器配置
        接着进入二级分频器(CS1CDR[ESAI_CLK_PODF]),它将时钟频率进一步除以8,由寄存器CS1CDR[ESAI_CLK_PODF]配置。
        通过多级分频,设计可以实现更复杂的分频比。例如,单级分频可能只能做到简单的除以 2、4、8 等倍数,而多级分频则可以实现更复杂的分频比,如 1/16、1/32 等,从而获得更精确的目标频率。多级分频使设计更具模块化,便于在系统中复用和扩展。每一级分频器可以独立配置,使得设置更加自由,在实际设计中,直接使用单级复杂分频器可能会导致电路设计难度增加,并带来不稳定性。通过多级组合,复杂的分频可以被分解成多个简单的步骤,这样更容易调试和验证。
        且分频的值可以自行根据实际情况来决定。

        这里我们通过实际情况再来举一个例假如现在 PLL4=650MHz,我们选择 PLL4 作为 ESAI 时钟,前级 分频选择 2 分频,那么此时的时钟就是 650/2=325MHz。此部分又是一个分频器,对②中输出的时钟进一步分频,分频值由寄存器 CCM_CS1CDR 的 ESAI_CLK_PODF 来决定,可设置 1~8 分频。假如我们设置为 8 分频的话, 经过此分频器以后的时钟就是 325/8=40.625MHz。因此最终进入到 ESAI 外设的时钟就是 40.625MHz。
        在经过以上选择,门控,分频处理后,信号最终输出为ESAI_CLK_ROOT,传递到ESAI模块中进行使用。

        这里整个时钟系统的原理讲解,我们已经分析二点差不多了,下一节就会对于如何设置IMX6ULL的时钟系统进行具体的实验分析,以及操作,如果读者在阅读的过程中发现有问题,欢迎指正与讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值