IMX6UL主频与时钟配置

I.MX6U在默认配置下工作频率为396MHZ,但是I.MX6U系列标准的工作频率为528MHz

系统时钟来源

开发板时钟原理图:
在这里插入图片描述
I.MX6U-ALPHA 开发板的系统时钟来源于两部分: 32.768KHz 和24MHz 的晶振,其中 32.768KHz 晶振是 I.MX6U 的 RTC 时钟源,24MHz 晶振是 I.MX6U 内核和其它外设的时钟源。

7路PLL时钟源

I.MX6U 的外设有很多,不同的外设时钟源不同, NXP 将这些外设的时钟源进行了分组,一共有 7 组,这 7 组时钟源都是从 24MHz 晶振 PLL 而来的,因此也叫做 7 组 PLL。
在这里插入图片描述

  1. ARM_PLL(PLL1):供ARM内核使用,通过编程最高可倍频到1.3GHz
  2. 528_PLL(PLL2),此路 PLL 也叫做 System_PLL,此路 PLL 是固定的 22 倍频,不可编程修改,因此,此路 PLL 时钟=24MHz * 22 = 528MHz。此 PLL 分出了 4 路 PFD,分别为: PLL2_PFD0~PLL2_PFD3,这 4 路 PFD 和 528_PLL 共
    同作为其它很多外设的根时钟源。
  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,没有写错!就是 PLL7,虽然序号标为 4,但是实际是 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 分频

在这里插入图片描述
一共将时钟树分为三个部分:CLOCK_SWITCHER、 CLOCK ROOT GENERATOR 和SYSTEM CLOCKS。
CLOCK_SWITCHER是上面讲的7路PLL,SYSTEM CLOCKS就是芯片外设,从图中可以看出每个外设的时钟来源可以是多个。

内核时钟设置

在这里插入图片描述
①、内核时钟源来自于 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 就可以设置为 696MHz, CCM_CACRR 的 ARM_PODF 设置为 1 分频即可。现在问题很清晰了,寄存器 CCM_CACCR 的 ARM_PODF 位很好设置, PLL1 的频率可以通过寄存器 CCM_ANALOG_PLL_ARMn 来设置。

要修改内核时钟,有两个相关的寄存器 CCM_CACRR和CCM_ANALOG_PLL_ARMn
在这里插入图片描述
在这里插入图片描述
PLL1有两个可选可选时钟源 pll1_main_clk 和 step_clk,在修改 PLL1 时钟频率的时候我们需要先将内核时钟源改为其他的时钟源,修改步骤如下:
①、 设置寄存器 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。

void imx6u_clkinit(void)
{
	unsigned int reg = 0;
	//1.判断是由哪个时钟源启动,正常情况下是由pll1_sw_clk驱动的,如果要更换内核时钟
	//比如说将内核时钟更换为528MHZ,就要暂时将时钟源更换到step_clk下,等到pll1_sw_clk
	//的时钟配置完成之后再由step_clk下。
	if(((CCM->CCSR>>2)&0x1)==0)
	{
		CCM->CCSR&=~(1<<8);		/*配置step_clk时钟源为24MHz OSC*/
		CCM->CCSR|=(1<<2);		/*配置pll1_sw_clk时钟源为step_clk*/
	}
	
	/*2.设置pll1_main_clk为1056MHZ,也就是528*2=1056MHz,88分频*/
	CCM_ANALOG->PLL_ARM = (1<<13)|((88<<0)&0x7F);
	CCM->CCSR &= ~(1<<2);	//将pll_sw_clk时钟切换回pll1_main_clk
	CCM->CACRR = 1;			//这里是设置二分频,ARM内核时钟为pll1_sw_clk/2
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章