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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章