/**
******************************************************************************
* @author Maoxiao Hu
* @version V1.0.0
* @date Jan-2015
******************************************************************************
* < COPYRIGHT 2015 ISE of SHANDONG UNIVERSITY >
******************************************************************************
**/
時鐘初始化的一般方法和順序,u-boot、普通裸機程序如果需要都可以使用。
—————————————————————————————-
本文解決的問題:
1、宏觀上幾個大模塊的時鐘配置順序。
2、小模塊的時鐘選擇、分頻和一般的配置順序。
3、對小模塊來說,官方手冊推薦的時鐘源選擇問題。
4、本文只以手冊的“推薦配置”進行說明,“自由玩法”不保證穩定性。
—————————————————————————————-
多路選擇器選擇原則:
1、盡量保持默認配置不動。
2、盡量選擇前端頻率最高的源。
3、其它手冊要求的特殊情況。
—————————————————————————————-
幾個符號:
左邊深色的:無抖動多路選擇器,無抖動意味著在多路選擇切換的瞬間,下游時鐘就可以穩定下來。需要注意是在切換時要保證上游時鐘已經存在並穩定,不然下游時鐘狀態不確定。
右邊淺色的:有抖動多路選擇器,意味著多路選擇切換後,要經歷一段時間的不穩定時間,但是有穩定後有相應寄存器標志位標示下游時鐘已經穩定,這類指示寄存器器一般以CLK_MUX_STAT開頭。
—————————————————————————————-
全局約束條件:
1、無抖動多路選擇器的時鐘源需要存在並且穩定。
2、當某個PLL被設置為關閉狀態,是不可以使用它的輸出信號的。
—————————————————————————————-
晶振說明:
由於一般USB IP核需要直接使用高精度時鐘,所以在XUSBXTI引腳上接24M晶振,XXTI引腳就不需要接了。手冊上說由於iROM代碼是根據24M晶振頻率設計的,所以24M的選擇沒什麼好說的。
—————————————————————————————-
一、時鐘之源PLL配置
原因:根據全局約束條件2,如果PLL關閉那麼不可以使用它的輸出,再根據全局約束條件1,多路選擇器此時只能選擇外部時鐘!而24M的時鐘直接作為系統的時鐘顯然是不合適的!
4412有4個PLL:APLL, MPLL, EPLL, and VPLL。推薦使用24M外部晶振作為它們的時鐘源。
理論上講,4個PLL均可以在22 ~ 1400MHz之間自由設置,但是手冊強烈推薦的頻率范圍為:
/*———————————————*/
APLL & MPLL:200 ~ 1400MHz
EPLL:90 ~ 416MHz
VPLL:100 ~ 440MHz
/*———————————————*/
1.0 設置PLL_LOCKTIME
PLL頻率從小變到指定頻率需要一段時間(圖中標紅框的部分雖然不是PLL實際波形但可以參考著理解),當PLL頻率在變化的時候,比如由復位後的初始的400MHz升到1000MHz, 這時,首先把CPU的頻率鎖定,因這此時CPU的頻率是變化的,頻率變化,CPU的狀態就無法確定,所以,此時用 PLL_LOCKTIME 將CPU頻率鎖定一段時間,直到頻率輸出穩定為止。芯片手冊上顯示APLL最大的鎖定時間為100us(Table 60 -9),如果外部晶振是24MHz,100us換算成tick就是2400個tick,所以
APLL_LOCK(Address:0x1004_4000)寄存器該寫入0x960
MPLL_LOCK(Address:0x1004_0008)寄存器該寫入0x190
EPLL_LOCK(Address:0x1003_C010)寄存器該寫入0xBB8
VPLL_LOCK(Address:0x1003_C020)寄存器該寫入0x190。
1.1 APLL & MPLL的倍頻值:
設定對應寄存器的 P、M、S 三個值,不同的搭配最終頻率不同,無須自己計算,系統推薦的搭配如下:
1.2 EPLL的倍頻值:
設定對應寄存器的 P、M、S、K 四個值,不同的搭配最終頻率不同,無須自己計算,系統推薦的搭配如下:
1.3 VPLL的倍頻值
設定對應寄存器的 P、M、S、K 四個值,不同的搭配最終頻率不同,無須自己計算,系統推薦的搭配如下:
1.4 等待PLL穩定
如果PLL輸出穩定了,那麼PLL_CON0的Bit[29]會由0變1。
查詢用匯編實現,以APLL為例:
/*———————————————————————*/
wait_pll_lock:
ldr r1, [r0, r2]
tst r1, #(1<<29)
beq wait_pll_lock
mov pc, lr
ldr r0, =CMU_BASE /* 0x10030000 */
ldr r2, =APLL_CON0_OFFSET /* 0x14100 */
bl wait_pll_lock
/*———————————————————————*/
二、主要模塊的初始化順序
雖然官方文檔中並沒有強制按下面的順序初始化,但是按照邏輯來講,是應該使用這個順序的。
1、CLK_DIV_CPU0[31:0] = target value0
2、CLK_DIV_DMC0[31:0] = target value1
3、CLK_DIV_TOP[31:0] = target value2
4、CLK_DIV_LEFTBUS[31:0] = target value3
5、CLK_DIV_RIGHTBUS[31:0] = target value4
上個直觀點的圖: