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

S3C2440之提高系統時鐘

一、S3C2440時鐘體系:

1、S3C2440可以使用外接晶振,然後通過內部產生時鐘源;也可以直接使用外部時鐘源。時鐘控制邏輯提供FCLK、HCLK、PCLK三種時鐘,FCLK用於CPU核、HCLK用於AHB匯流排(主要用於高效能模組之間連線)、PCLK用於APB匯流排(主要用於低頻寬周邊外設之間連線)。

2、當S3C2440 CPU核工作電壓為1.2V時,主頻可達到300MHz;工作電壓為1.3V時,主頻可達400MHz。


3、上電時,PLL並沒有啟動,此時FCLK等於外部輸入的時鐘(Fin)。若提高時鐘,則需要軟體配置啟動PLL。上電後。晶體振盪器開始振盪,在幾毫秒後,當nRESET在穩定OSC (XTIpll)時鐘後才會被釋放。


二、程式設計提高執行時鐘:

1、設定LOCKTIME暫存器(LOCK TIME COUNT REGISTER),此暫存器用於設定Lock time的長度。MPLL啟動後需要等待一段時間(Lock time),使其輸出穩定。一般來說,使用預設值0xFFFFFFFF即可;

2、設定CLKDIVN暫存器(CLOCK DIVIDER CONTROL (CLKDIVN) REGISTER),此暫存器用於設定FCLK、HCLK、PCLK之間比例;


3、設定CPU工作與非同步模式;


4、設定MPLLCON暫存器(MPLL CONTROL REGISTER),此暫存器用於設定FCLK與Fin的倍數。公式為:

                Mpll = (2 * m * Fin) / (p * 2S)
                m = (MDIV + 8), p = (PDIV + 2), s = SDIV


三、程式碼:

/* LOCKTIME(0x4C000000) = 0xFFFFFFFF */
ldr r0, =0x4C000000
ldr r1, =0xFFFFFFFF
str r1, [r0]

/* 設定MPLL, FCLK : HCLK : PCLK = 400m : 100m : 50m */
/* CLKDIVN(0x4C000014) = 0X5, tFCLK:tHCLK:tPCLK = 1:4:8  */
ldr r0, =0x4C000014
ldr r1, =0x5
str r1, [r0]

/* 設定CPU工作於非同步模式 */
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000   //R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0

/* 設定MPLLCON(0x4C000004) = (92<<12)|(1<<4)|(1<<0) 
 *  m = MDIV+8 = 92+8=100
 *  p = PDIV+2 = 1+2 = 3
 *  s = SDIV = 1
 *  FCLK = 2*m*Fin/(p*2^s) = 2*100*12/(3*2^1)=400M
 */
ldr r0, =0x4C000004
ldr r1, =(92<<12)|(1<<4)|(1<<0)
str r1, [r0]

 注:1、一旦設定PLL, 就會鎖定lock time直到PLL輸出穩定然後CPU工作於新的頻率FCLK

       2、orr r0,r0,#0xc0000000   //R1_nF:OR:R1_iA 是對協處理器的操作,nF和iA是控制CPU匯流排模式的,意思是讓CPU的匯流排模式從“fast bus mode”變為“asynchronous bus mode”