S3C2440系統(tǒng)時(shí)鐘
l FCLK:400MHz
本文引用地址:http://m.butianyuan.cn/article/201611/319286.html HCLK:100MHz
l PCLK:50MHz
既然如此,那么怎樣讓CPU工作在400MHz,讓牛車速度提高到動(dòng)車的速度呢?
1 系統(tǒng)工作時(shí)鐘頻率
在對(duì)系統(tǒng)時(shí)鐘進(jìn)行提速之前,讓我們先來(lái)了解下S3C2440上的工作時(shí)鐘頻率,F(xiàn)CLK,HCLK,PCLK,其中FCLK主要為ARM920T內(nèi)核提供工作頻率,如圖2-44所示:
圖2-44 ARM920T內(nèi)核結(jié)構(gòu)
HCLK主要為S3C2440 AHB總線(Advanced High performance Bus)上掛接硬件提供工作頻率,AHB總線主要掛接有內(nèi)存,NAND,LCD控制器等硬件,如圖2-45所示:
圖2-45 S3C2440 AHB總線上掛接硬件
PCLK主要為APB總線提供工作頻率,由圖2-46所示,APB總線主要掛接UART串口,Watchdog等硬件控制器。
圖2-46 S3C2440 APB總線掛接硬件
也就是說(shuō),對(duì)于一些需要時(shí)鐘工作的硬件,如果切斷其時(shí)鐘源,就不會(huì)再工作,從而達(dá)到降低功耗的目的,這也是便攜嵌入式設(shè)備里的一個(gè)特點(diǎn)。
時(shí)鐘源:為了減少外界環(huán)境對(duì)開(kāi)發(fā)板電磁干擾,降低制作成本,通常開(kāi)發(fā)板的外部晶振時(shí)鐘頻率都很低,MINI2440開(kāi)發(fā)板由12MHz的晶振來(lái)提供時(shí)鐘源,要想讓CPU運(yùn)行在更高的頻率就要通過(guò)時(shí)鐘控制邏輯單元PLL(鎖相環(huán))來(lái)提高主頻。
S3C2440里有兩個(gè)PLL:MPLL和UPLL,MPLL用來(lái)產(chǎn)生FCLK,HCLK,PCLK的高頻工作時(shí)鐘,UPLL用來(lái)為USB提供工作頻率。
圖2-47系統(tǒng)時(shí)鐘初始化時(shí)序
開(kāi)發(fā)板上電后,晶振OSC開(kāi)始提供晶振時(shí)鐘,由于系統(tǒng)剛剛上電,電壓信號(hào)等都還不穩(wěn)定,這時(shí)復(fù)位信號(hào)(nRESET)拉低,這時(shí)MPLL雖然默認(rèn)啟動(dòng),但是如果不向MPLLCON中寫(xiě)入值,那么外部晶振則直接作為系統(tǒng)時(shí)鐘FCLK,過(guò)幾毫秒后,復(fù)位信號(hào)上拉,CPU開(kāi)始取指運(yùn)行,這時(shí)可以通過(guò)代碼設(shè)置啟動(dòng)MPLL,MPLL啟動(dòng)需要一定鎖定時(shí)間(LockTime),這是因?yàn)镸PLL輸出頻率還沒(méi)有穩(wěn)定,在這期間FCLK都停止輸出,CPU停止工作,過(guò)了LockTime后時(shí)鐘穩(wěn)定輸出,CPU工作在新設(shè)置的頻率下,這時(shí)可以通過(guò)設(shè)置FCLK,HCLK和PCLK三者的頻率比例來(lái)產(chǎn)生不同總線上需要的不同頻率,下面詳細(xì)介紹開(kāi)啟MPLL的過(guò)程:
l 設(shè)置LockTime變頻鎖定時(shí)間
l 設(shè)置FCLK與晶振輸入頻率(Fin)的倍數(shù)
l 設(shè)置FCLK,HCLK,PCLK三者之間的比例
LockTime變頻鎖定時(shí)間由LOCKTIME寄存器(見(jiàn)下表)來(lái)設(shè)置,由于變頻后開(kāi)發(fā)板所有依賴時(shí)鐘工作的硬件都需要一小段調(diào)整時(shí)間,該時(shí)間計(jì)數(shù)通過(guò)設(shè)置LOCKTIME寄存器[31:16]來(lái)設(shè)置UPLL(USB時(shí)鐘鎖相環(huán))調(diào)整時(shí)間,通過(guò)設(shè)置LOCKTIME寄存器[15:0]設(shè)置MPLL調(diào)整時(shí)間,這兩個(gè)調(diào)整時(shí)間數(shù)值一般用其默認(rèn)值即可。
表2-8變頻鎖定時(shí)間寄存器(LOCKTIME)
寄存器名 | 地址 | 是否讀寫(xiě) | 描述 | 復(fù)位默認(rèn)值 |
LOCKTIME | 0x4C000000 | R/W | 變頻鎖定時(shí)間寄存器 | 0xFFFFFFFF |
LOCKTIME | 位 | 描述 | 初始值 |
U_TIME | [31:16] | UPLL對(duì)UCLK的鎖定時(shí)間值 (U_TIME:300us) | 0xFFFF |
M_TIME | [15:0] | MPLL對(duì)于FCLK,HCLK,PCLK的鎖定時(shí)間值(M_TIME:300us) | 0xFFFF |
FCLK與Fin的倍數(shù)通過(guò)MPLLCON寄存器設(shè)置,三者之前有以下關(guān)系:
MPLL(FCLK) = (2*m*Fin)/(p*2^s)
其中:m = MDIV + 8, p = PDIV + 2, s = SDIV
當(dāng)設(shè)置完MPLL之后,就會(huì)自動(dòng)進(jìn)入LockTime變頻鎖定期間,LockTime之后,MPLL輸出穩(wěn)定時(shí)鐘頻率。
表2-9 MPLL配置寄存器(MPLLCON)
寄存器名 | 地址 | 是否讀寫(xiě) | 描述 | 復(fù)位默認(rèn)值 |
MPLLCON | 0x4C000004 | R/W | MPLL配置寄存器 | 0x00096030 |
MPLLCON | 位 | 描述 | 初始值 |
MDIV | [19:12] | 主分頻器控制位 | 0x96 |
PDIV | [9:4] | 預(yù)分頻器控制位 | 0x03 |
SDIV | [1:0] | 后分頻器控制位 | 0x0 |
通過(guò)上述算法比較難以找到合適的PLL值,下表給出了官方推薦的一些MPLL參考設(shè)置:
表2-10官方推薦MPLL
FCLK,HCLK,PCLK三者之間的比例通過(guò)CLKDIVN寄存器進(jìn)行設(shè)置,S3C2440時(shí)鐘設(shè)置時(shí),還要額外設(shè)置CAMDIVN寄存器,如下表,HCLK4_HALF,HCLK3_HALF分別與CAMDIVN[9:8]對(duì)應(yīng),下表列出了各種時(shí)鐘比例:
表2-11 FCLK HCLK PCLK設(shè)置比例
如果HDIV設(shè)置為非0,CPU的總線模式要進(jìn)行改變,默認(rèn)情況下FCLK = HCLK,CPU工作在fast bus mode快速總線模式下,HDIV設(shè)置為非0后,F(xiàn)CLK與HCLK不再相等,要將CPU改為asynchronous bus mod異步總線模式,可以通過(guò)下面的嵌入?yún)R編代碼實(shí)現(xiàn):
__asm{
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
}
關(guān)于mrc與mcr指令,請(qǐng)查看MMU與內(nèi)存保護(hù)的實(shí)現(xiàn)章節(jié)。
表2-12時(shí)鐘分頻器控制寄存器(CLKDIVN)
寄存器名 | 地址 | 是否讀寫(xiě) | 描述 | 復(fù)位默認(rèn)值 |
CLKDIVN | 0x4C000014 | R/W | 時(shí)鐘分頻器控制寄存器 | 0x00000000 |
CLKDIVN | 位 | 描述 | 初始值 |
DIV_UPLL | [3] | UCLK選擇寄存器(UCLK必須對(duì)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,當(dāng)CAMIVN[9]=0 HCLK = FCLK/8,當(dāng)CAMIVN[9]=1 11: HCLK = FCLK/3,當(dāng)CAMIVN[8]=0 HCLK = FCLK/6,當(dāng)CAMIVN[8]=1 | 0 |
PDIVN | [0] | 0:PCLK是和HCLK/1相同時(shí)鐘 1:PCLK是和HCLK/2相同時(shí)鐘 | 0 |
表2-13攝像頭時(shí)鐘分頻控制寄存器(CAMDIVN)
寄存器名 | 地址 | 是否讀寫(xiě) | 描述 | 復(fù)位默認(rèn)值 |
CAMDIVN | 0x4C000018 | R/W | 攝像頭時(shí)鐘分頻控制寄存器 | 0x00000000 |
CAMDIVN | 位 | 描述 | 初始值 |
… | … | … | … |
HCLK4_HALF | [9] | HDIVN分頻因子選擇位(當(dāng)CLKIVN[2:1]位為10b時(shí)有效) 0: HCLK=FCLK/4 1: HCLK=FCLK/8 | 0 |
HCLK3_HALF | [8] | HDIVN分頻因子選擇位(當(dāng)CLKIVN[2:1]位為11b時(shí)有效) 0: HCLK=FCLK/3 1: HCLK=FCLK/6 | 0 |
… | … | … | … |
2 時(shí)鐘驅(qū)動(dòng)實(shí)驗(yàn)
系統(tǒng)時(shí)鐘驅(qū)動(dòng)可以分別用ARM匯編和C語(yǔ)言兩個(gè)版本實(shí)現(xiàn)。
ARM匯編版本:
;以下為時(shí)鐘相關(guān)寄存器地址
LOCKTIME EQU 0x4c000000
MPLLCON EQU 0x4c000004
CLKDIVN EQU 0x4c000014
CAMDIVN EQU 0x4c000018
clock_init ; 時(shí)鐘初始化代碼
; 設(shè)置變頻鎖定時(shí)間
ldr r0, =LOCKTIME
ldr r1, =0x00ffffff
str r1, [r0]
; 設(shè)置分頻比FCLK:HCLK:PCLK=1:4:8
; 由于CAMDIVN[9]位初始值為0,寄存器CAMDIVN未使用,這兒不用再設(shè)置其值
ldr r0, =CLKDIVN
mov r1, #0x05
str r1, [r0]
; 修改CPU總線模式
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
ldr r0, =MPLLCON
ldr r1, =0x5c011 ; MPLL = 400MHz
str r1, [r0]
mov pc, lr ; 函數(shù)調(diào)用返回
該匯編代碼入口處先設(shè)置了變頻鎖定時(shí)間為0x00ffffff,然后設(shè)置FCLK:HCLK:PCLK的分頻比,由于系統(tǒng)時(shí)鐘已經(jīng)改變,需要修改CPU總線模式,最后設(shè)置系統(tǒng)時(shí)鐘工作頻率。
C語(yǔ)言版本:
LOCKTIME = 0x00ffffff;
CLKDIVN = 0x05;
__asm{
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
}
MPLLCON = MPLL_400MHz;
}
C語(yǔ)言版本與匯編版本一樣,只是由于修改CPU總線模式時(shí)要使用mrc指令,因此只能使用C語(yǔ)言嵌入?yún)R編方式來(lái)實(shí)現(xiàn)。
系統(tǒng)時(shí)鐘驅(qū)動(dòng)實(shí)驗(yàn):
;
;系統(tǒng)時(shí)鐘初始化實(shí)驗(yàn)
;
WTCON EQU 0x53000000 ; 看門(mén)狗控制寄存器
WTDAT EQU 0x53000004 ; 看門(mén)狗數(shù)據(jù)寄存器
LOCKTIME EQU 0x4c000000 ; 變頻鎖定時(shí)間寄存器
MPLLCON EQU 0x4c000004 ; MPLL寄存器
CLKDIVN EQU 0x4c000014 ; 分頻比寄存器
GPBCON EQU 0x56000010 ; LED控制寄存器
GPBDAT EQU 0x56000014 ; LED數(shù)據(jù)寄存器
GPBUP EQU 0x56000018 ; 上拉電阻設(shè)置寄存器
DELAYVAL EQU 0x8fff ; 延時(shí)數(shù)值
AREA CLOCK, CODE, READONLY
ENTRY
start
ldr r0, = 0x53000000 ; 看門(mén)狗關(guān)閉代碼
mov r1, #0
str r1, [r0]
bl clock_init ; 調(diào)用時(shí)鐘初始化函數(shù)
bl led_on ; 調(diào)用點(diǎn)亮Led函數(shù)
clock_init ; 時(shí)鐘初始化代碼
; 設(shè)置鎖頻時(shí)間
ldr r0, =LOCKTIME ; 取得LOCKTIME寄存器地址
ldr r1, =0x00ffffff ; LOCKTIME寄存器設(shè)置數(shù)據(jù)
str r1, [r0] ; 將LOCKTIME設(shè)置數(shù)據(jù)寫(xiě)入LOCKTIME寄存器
; 設(shè)置分頻數(shù)
ldr r0, =CLKDIVN ; 取得CLKDIVN寄存器地址
mov r1, #0x05 ; CLKDIVN寄存器設(shè)置數(shù)據(jù)
str r1, [r0] ; 將CLKDIVN設(shè)置數(shù)據(jù)寫(xiě)入CLKDIVN寄存器
; 修改CPU總線模式
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
ldr r0, =MPLLCON
ldr r1, =0x5c011 ; MPLL is 400MHz
str r1, [r0]
mov pc, lr
led_on ; 亮點(diǎn)Led函數(shù)
; Led初始化開(kāi)始
ldr r0,=GPBCON ; 將LED控制寄存器地址放入r0
ldr r1,[r0] ; 將控制寄存器里的值讀出放入r1
bic r1,r1,#0x3fc00 ; 將r1里的值(控制寄存器里的值)
; bit[10]~bit[17]清位,其它位不變
orr r1,r1,#0x15400 ; 設(shè)置控制寄存器
str r1,[r0] ; 將r1里的值寫(xiě)入控制寄存器
; 禁止GPF4-GPF7端口的上拉電阻
ldr r0,=GPBUP
ldr r1,[r0]
orr r1,r1,#0x1e0
str r1,[r0]
; Led初始化結(jié)束
led_loop ; 循環(huán)點(diǎn)亮Led
ldr r2,=GPBDAT ; 將LED數(shù)據(jù)寄存器的地址放入r2
ldr r3,[r2] ; 將數(shù)據(jù)寄存器(r2)里的值放入r3
bic r3,r3,#0x1e0 ; 清除bit[5]~bit[8],bit[n]代表led1~led4
orr r3,r3,#0x1c0 ; 清對(duì)應(yīng)Led位-亮燈,設(shè)置相應(yīng)位-滅燈(點(diǎn)亮led1)
str r3,[r2] ; 將控制亮燈數(shù)據(jù)寫(xiě)入數(shù)據(jù)寄存器r2
ldr r0,=DELAYVAL ; 設(shè)置延遲數(shù)
bl delay ; 調(diào)用延遲子程序
ldr r3,[r2] ; 將數(shù)據(jù)寄存器(r2)里的值放入r3
bic r3,r3,#0x1e0 ; 清除bit[5]~bit[8],bit[n]代表led1~led4
orr r3,r3,#0x1a0 ; 清對(duì)應(yīng)Led位-亮燈,設(shè)置相應(yīng)位-滅燈(點(diǎn)亮led2)
str r3,[r2] ; 將控制亮燈數(shù)據(jù)寫(xiě)入數(shù)據(jù)寄存器r2
ldr r0,=DELAYVAL ; 設(shè)置延遲數(shù)
bl delay ; 調(diào)用延遲子程序
ldr r3,[r2] ; 將數(shù)據(jù)寄存器(r2)里的值放入r3
bic r3,r3,#0x1e0 ; 清除bit[5]~bit[8],bit[n]代表led1~led4
orr r3,r3,#0x160 ; 清對(duì)應(yīng)Led位-亮燈,設(shè)置相應(yīng)位-滅燈(點(diǎn)亮led3)
str r3,[r2] ; 將控制亮燈數(shù)據(jù)寫(xiě)入數(shù)據(jù)寄存器r2
ldr r0,=DELAYVAL ; 設(shè)置延遲數(shù)
bl delay ; 調(diào)用延遲子程序
ldr r3,[r2] ; 將數(shù)據(jù)寄存器(r2)里的值放入r3
bic r3,r3,#0x1e0 ; 清除bit[5]~bit[8],bit[n]代表led1~led4
orr r3,r3,#0xe0 ; 清對(duì)應(yīng)Led位-亮燈,設(shè)置相應(yīng)位-滅燈(點(diǎn)亮led4)
str r3,[r2] ; 將控制亮燈數(shù)據(jù)寫(xiě)入數(shù)據(jù)寄存器r2
ldr r0,=DELAYVAL ; 設(shè)置延遲數(shù)
bl delay ; 調(diào)用延遲子程序
b led_loop
delay
sub r0,r0,#1 ; r0=r0-1
cmp r0,#0x0 ; 將r0的值與0相比較
bne delay ; 比較的結(jié)果不為0,繼續(xù)調(diào)用delay
mov pc,lr ; 返回
END ; 程序結(jié)束符
該實(shí)驗(yàn)首先關(guān)閉了看門(mén)狗定時(shí)器,然后修改系統(tǒng)時(shí)鐘,將默認(rèn)系統(tǒng)工作頻率12MHz提高到400MHz,由于CPU工作在較高頻率下,其執(zhí)行速度明顯比未啟動(dòng)系統(tǒng)時(shí)鐘時(shí)高的多,可以通過(guò)注釋掉系統(tǒng)時(shí)鐘初始化代碼跳轉(zhuǎn)指令bl clock_init,對(duì)比LED的跑馬燈效果可以證明。
++++++++++++++++++++++++++++++++++++++++++
評(píng)論