1. 程式人生 > >S3C2440系統時鐘

S3C2440系統時鐘

++++++++++++++++++++++++++++++++++++++++++

本文系本站原創,歡迎轉載! 轉載請註明出處:

系統時鐘

MINI2440開發板在沒有開啟時鐘前,整個開發板全靠一個12MHz的晶振提供頻率來執行,也就是說CPU,記憶體,UART等需要用到時鐘頻率的硬體都工作12MHz下,而S3C2440A可以正常工作在400MHz下,兩者速度相差可想而知,就好比牛車和動車。如果CPU工作在12MHz頻率下,開發板的使用效率非常低,所有依賴系統時鐘工作的硬體,其工作效率也很低,比如,我們電腦裡面經常提到的超頻,超頻就是讓CPU工作在更高的頻率下,讓電腦運算速度更快,雖然頻率是越高越好,但是由於硬體特性決定了任何一個裝置都不可能無止境的超頻,電腦超頻時要考慮到

CPU或主機板發熱過大,燒壞的危險,同樣開發板的主機板上的外設和CPU也有一個頻率限度,ARM920T核心的S3C2440的最高正常工作頻率如下:

lFCLK400MHz

lHCLK100MHz

lPCLK50MHz

既然如此,那麼怎樣讓CPU工作在400MHz,讓牛車速度提高到動車的速度呢?

在對系統時鐘進行提速之前,讓我們先來了解下S3C2440上的工作時鐘頻率,FCLKHCLKPCLK,其中FCLK主要為ARM920T核心提供工作頻率,如圖2-44所示:

2-44ARM920T核心結構

HCLK主要為S3C2440 AHB匯流排(Advanced High performance Bus

)上掛接硬體提供工作頻率,AHB匯流排主要掛接有記憶體,NANDLCD控制器等硬體,如圖2-45所示:

2-45 S3C2440 AHB總線上掛接硬體

PCLK主要為APB匯流排提供工作頻率,由圖2-46所示,APB匯流排主要掛接UART串列埠,Watchdog等硬體控制器。

2-46 S3C2440 APB匯流排掛接硬體

也就是說,對於一些需要時鐘工作的硬體,如果切斷其時鐘源,就不會再工作,從而達到降低功耗的目的,這也是便攜嵌入式裝置裡的一個特點。

時鐘源:為了減少外界環境對開發板電磁干擾,降低製作成本,通常開發板的外部晶振時鐘頻率都很低,MINI2440開發板由

12MHz的晶振來提供時鐘源,要想讓CPU執行在更高的頻率就要通過時鐘控制邏輯單元PLL(鎖相環)來提高主頻。

S3C2440裡有兩個PLLMPLLUPLLMPLL用來產生FCLKHCLKPCLK的高頻工作時鐘,UPLL用來為USB提供工作頻率。

2-47系統時鐘初始化時序

開發板上電後,晶振OSC開始提供晶振時鐘,由於系統剛剛上電,電壓訊號等都還不穩定,這時復位訊號(nRESET)拉低,這時MPLL雖然預設啟動,但是如果不向MPLLCON中寫入值,那麼外部晶振則直接作為系統時鐘FCLK,過幾毫秒後,復位訊號上拉,CPU開始取指執行,這時可以通過程式碼設定啟動MPLLMPLL啟動需要一定鎖定時間(LockTime),這是因為MPLL輸出頻率還沒有穩定,在這期間FCLK都停止輸出,CPU停止工作,過了LockTime後時鐘穩定輸出,CPU工作在新設定的頻率下,這時可以通過設定FCLKHCLKPCLK三者的頻率比例來產生不同總線上需要的不同頻率,下面詳細介紹開啟MPLL的過程:

l設定LockTime變頻鎖定時間

l設定FCLK與晶振輸入頻率(Fin)的倍數

l設定FCLKHCLKPCLK三者之間的比例

LockTime變頻鎖定時間由LOCKTIME暫存器(見下表)來設定,由於變頻後開發板所有依賴時鐘工作的硬體都需要一小段調整時間,該時間計數通過設定LOCKTIME暫存器[31:16]來設定UPLLUSB時鐘鎖相環)調整時間,通過設定LOCKTIME暫存器 [15:0]設定MPLL調整時間,這兩個調整時間數值一般用其預設值即可。

2-8變頻鎖定時間暫存器(LOCKTIME)

暫存器名

地址

是否讀寫

描述

復位預設值

LOCKTIME

0x4C000000

R/W

變頻鎖定時間暫存器

0xFFFFFFFF

LOCKTIME

描述

初始值

U_TIME

[31:16]

UPLLUCLK的鎖定時間值

(U_TIME:300us)

0xFFFF

M_TIME

[15:0]

MPLL對於FCLKHCLKPCLK的鎖定時間值(M_TIME:300us)

0xFFFF

FCLKFin的倍數通過MPLLCON暫存器設定,三者之前有以下關係:

MPLL(FCLK) = (2*m*Fin)/(p*2^s)

其中:m = MDIV + 8, p = PDIV + 2, s = SDIV

當設定完MPLL之後,就會自動進入LockTime變頻鎖定期間,LockTime之後,MPLL輸出穩定時鐘頻率。

2-9 MPLL配置暫存器(MPLLCON)

暫存器名

地址

是否讀寫

描述

復位預設值

MPLLCON

0x4C000004

R/W

MPLL配置暫存器

0x00096030

MPLLCON

描述

初始值

MDIV

[19:12]

主分頻器控制位

0x96

PDIV

[9:4]

預分頻器控制位

0x03

SDIV

[1:0]

後分頻器控制位

0x0

通過上述演算法比較難以找到合適的PLL值,下表給出了官方推薦的一些MPLL參考設定:

2-10 官方推薦MPLL

FCLKHCLKPCLK三者之間的比例通過CLKDIVN暫存器進行設定,S3C2440時鐘設定時,還要額外設定CAMDIVN暫存器,如下表,HCLK4_HALFHCLK3_HALF分別與CAMDIVN[9:8]對應,下表列出了各種時鐘比例:

2-11 FCLK HCLK PCLK設定比例

如果HDIV設定為非0CPU的匯流排模式要進行改變,預設情況下FCLK = HCLKCPU工作在fast bus mode快速匯流排模式下,HDIV設定為非0後, FCLKHCLK不再相等,要將CPU改為asynchronous bus mod非同步匯流排模式,可以通過下面的嵌入彙編程式碼實現:

__asm{ 

mrc p15, 0, r1, c1, c0, 0 /* 讀取CP15 C1暫存器 */ 

orr r1, r1, #0xc0000000 /* 設定CPU匯流排模式 */ 

mcr p15, 0, r1, c1, c0, 0 /* 寫回CP15 C1暫存器 */

關於mrcmcr指令,請檢視MMU與記憶體保護的實現章節。

2-12時鐘分頻器控制暫存器(CLKDIVN

暫存器名

地址

是否讀寫

描述

復位預設值

CLKDIVN

0x4C000014

R/W

時鐘分頻器控制暫存器

0x00000000

CLKDIVN

描述

初始值

DIV_UPLL

[3]

UCLK選擇暫存器(UCLK必須對USB提供48MHz

0:UCLK=UPLL clock

1:UCLK=UPLL clock/2

0

HDIVN

[2:1]

00:HCLK = FCLK/1

01:HCLK = FCLK/2

10:HCLK = FCLK/4,當CAMIVN[9]=0

HCLK = FCLK/8,當CAMIVN[9]=1

11: HCLK = FCLK/3,當CAMIVN[8]=0

HCLK = FCLK/6,當CAMIVN[8]=1

0

PDIVN

[0]