新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S3C2440系統時鐘

        S3C2440系統時鐘

        作者: 時間:2016-11-21 來源:網絡 收藏
        MINI2440開發板在沒有開啟時鐘前,整個開發板全靠一個12MHz的晶振提供頻率來運行,也就是說CPU,內存,UART等需要用到時鐘頻率的硬件都工作12MHz下,而S3C2440A可以正常工作在400MHz下,兩者速度相差可想而知,就好比牛車和動車。如果CPU工作在12MHz頻率下,開發板的使用效率非常低,所有依賴系統時鐘工作的硬件,其工作效率也很低,比如,我們電腦里面經常提到的超頻,超頻就是讓CPU工作在更高的頻率下,讓電腦運算速度更快,雖然頻率是越高越好,但是由于硬件特性決定了任何一個設備都不可能無止境的超頻,電腦超頻時要考慮到CPU或主板發熱過大,燒壞的危險,同樣開發板的主板上的外設和CPU也有一個頻率限度,ARM920T內核的S3C2440的最高正常工作頻率如下:

        l FCLK:400MHz

        本文引用地址:http://www.104case.com/article/201611/319286.htm

        l HCLK:100MHz

        l PCLK:50MHz

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

        1 系統工作時鐘頻率

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

        圖2-44 ARM920T內核結構

        HCLK主要為S3C2440 AHB總線(Advanced High performance Bus)上掛接硬件提供工作頻率,AHB總線主要掛接有內存,NAND,LCD控制器等硬件,如圖2-45所示:

        圖2-45 S3C2440 AHB總線上掛接硬件

        PCLK主要為APB總線提供工作頻率,由圖2-46所示,APB總線主要掛接UART串口,Watchdog等硬件控制器。

        圖2-46 S3C2440 APB總線掛接硬件

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

        時鐘源:為了減少外界環境對開發板電磁干擾,降低制作成本,通常開發板的外部晶振時鐘頻率都很低,MINI2440開發板由12MHz的晶振來提供時鐘源,要想讓CPU運行在更高的頻率就要通過時鐘控制邏輯單元PLL(鎖相環)來提高主頻。

        S3C2440里有兩個PLL:MPLL和UPLL,MPLL用來產生FCLK,HCLK,PCLK的高頻工作時鐘,UPLL用來為USB提供工作頻率。

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

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

        l 設置LockTime變頻鎖定時間

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

        l 設置FCLK,HCLK,PCLK三者之間的比例

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

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

        寄存器名

        地址

        是否讀寫

        描述

        復位默認值

        LOCKTIME

        0x4C000000

        R/W

        變頻鎖定時間寄存器

        0xFFFFFFFF

        LOCKTIME

        描述

        初始值

        U_TIME

        [31:16]

        UPLL對UCLK的鎖定時間值

        (U_TIME:300us)

        0xFFFF

        M_TIME

        [15:0]

        MPLL對于FCLK,HCLK,PCLK的鎖定時間值(M_TIME:300us)

        0xFFFF

        FCLK與Fin的倍數通過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

        FCLK,HCLK,PCLK三者之間的比例通過CLKDIVN寄存器進行設置,S3C2440時鐘設置時,還要額外設置CAMDIVN寄存器,如下表,HCLK4_HALF,HCLK3_HALF分別與CAMDIVN[9:8]對應,下表列出了各種時鐘比例:

        表2-11 FCLK HCLK PCLK設置比例

        如果HDIV設置為非0,CPU的總線模式要進行改變,默認情況下FCLK = HCLK,CPU工作在fast bus mode快速總線模式下,HDIV設置為非0后,FCLK與HCLK不再相等,要將CPU改為asynchronous bus mod異步總線模式,可以通過下面的嵌入匯編代碼實現:

        __asm{

        mrc p15, 0, r1, c1, c0, 0

        orr r1, r1, #0xc0000000

        mcr p15, 0, r1, c1, c0, 0

        }

        關于mrc與mcr指令,請查看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]

        0:PCLK是和HCLK/1相同時鐘

        1:PCLK是和HCLK/2相同時鐘

        0

        表2-13攝像頭時鐘分頻控制寄存器(CAMDIVN)

        寄存器名

        地址

        是否讀寫

        描述

        復位默認值

        CAMDIVN

        0x4C000018

        R/W

        攝像頭時鐘分頻控制寄存器

        0x00000000

        CAMDIVN

        描述

        初始值

        HCLK4_HALF

        [9]

        HDIVN分頻因子選擇位(當CLKIVN[2:1]位為10b時有效)

        0: HCLK=FCLK/4

        1: HCLK=FCLK/8

        0

        HCLK3_HALF

        [8]

        HDIVN分頻因子選擇位(當CLKIVN[2:1]位為11b時有效)

        0: HCLK=FCLK/3

        1: HCLK=FCLK/6

        0

        2 時鐘驅動實驗

        系統時鐘驅動可以分別用ARM匯編和C語言兩個版本實現。

        ARM匯編版本:

        ;以下為時鐘相關寄存器地址

        LOCKTIME EQU 0x4c000000

        MPLLCON EQU 0x4c000004

        CLKDIVN EQU 0x4c000014

        CAMDIVN EQU 0x4c000018

        clock_init ; 時鐘初始化代碼

        ; 設置變頻鎖定時間

        ldr r0, =LOCKTIME

        ldr r1, =0x00ffffff

        str r1, [r0]

        ; 設置分頻比FCLK:HCLK:PCLK=1:4:8

        ; 由于CAMDIVN[9]位初始值為0,寄存器CAMDIVN未使用,這兒不用再設置其值

        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 ; 函數調用返回

        該匯編代碼入口處先設置了變頻鎖定時間為0x00ffffff,然后設置FCLK:HCLK:PCLK的分頻比,由于系統時鐘已經改變,需要修改CPU總線模式,最后設置系統時鐘工作頻率。

        C語言版本:

        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語言版本與匯編版本一樣,只是由于修改CPU總線模式時要使用mrc指令,因此只能使用C語言嵌入匯編方式來實現。

        系統時鐘驅動實驗:

        ;

        ;系統時鐘初始化實驗

        ;

        WTCON EQU 0x53000000 ; 看門狗控制寄存器

        WTDAT EQU 0x53000004 ; 看門狗數據寄存器

        LOCKTIME EQU 0x4c000000 ; 變頻鎖定時間寄存器

        MPLLCON EQU 0x4c000004 ; MPLL寄存器

        CLKDIVN EQU 0x4c000014 ; 分頻比寄存器

        GPBCON EQU 0x56000010 ; LED控制寄存器

        GPBDAT EQU 0x56000014 ; LED數據寄存器

        GPBUP EQU 0x56000018 ; 上拉電阻設置寄存器

        DELAYVAL EQU 0x8fff ; 延時數值

        AREA CLOCK, CODE, READONLY

        ENTRY
        start

        ldr r0, = 0x53000000 ; 看門狗關閉代碼

        mov r1, #0

        str r1, [r0]

        bl clock_init ; 調用時鐘初始化函數

        bl led_on ; 調用點亮Led函數

        clock_init ; 時鐘初始化代碼

        ; 設置鎖頻時間

        ldr r0, =LOCKTIME ; 取得LOCKTIME寄存器地址

        ldr r1, =0x00ffffff ; LOCKTIME寄存器設置數據

        str r1, [r0] ; 將LOCKTIME設置數據寫入LOCKTIME寄存器

        ; 設置分頻數

        ldr r0, =CLKDIVN ; 取得CLKDIVN寄存器地址

        mov r1, #0x05 ; CLKDIVN寄存器設置數據

        str r1, [r0] ; 將CLKDIVN設置數據寫入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 ; 亮點Led函數

        ; Led初始化開始

        ldr r0,=GPBCON ; 將LED控制寄存器地址放入r0

        ldr r1,[r0] ; 將控制寄存器里的值讀出放入r1

        bic r1,r1,#0x3fc00 ; 將r1里的值(控制寄存器里的值)

        ; bit[10]~bit[17]清位,其它位不變

        orr r1,r1,#0x15400 ; 設置控制寄存器

        str r1,[r0] ; 將r1里的值寫入控制寄存器

        ; 禁止GPF4-GPF7端口的上拉電阻

        ldr r0,=GPBUP

        ldr r1,[r0]

        orr r1,r1,#0x1e0

        str r1,[r0]

        ; Led初始化結束

        led_loop ; 循環點亮Led

        ldr r2,=GPBDAT ; 將LED數據寄存器的地址放入r2

        ldr r3,[r2] ; 將數據寄存器(r2)里的值放入r3

        bic r3,r3,#0x1e0 ; 清除bit[5]~bit[8],bit[n]代表led1~led4

        orr r3,r3,#0x1c0 ; 清對應Led位-亮燈,設置相應位-滅燈(點亮led1)

        str r3,[r2] ; 將控制亮燈數據寫入數據寄存器r2

        ldr r0,=DELAYVAL ; 設置延遲數

        bl delay ; 調用延遲子程序

        ldr r3,[r2] ; 將數據寄存器(r2)里的值放入r3

        bic r3,r3,#0x1e0 ; 清除bit[5]~bit[8],bit[n]代表led1~led4

        orr r3,r3,#0x1a0 ; 清對應Led位-亮燈,設置相應位-滅燈(點亮led2)

        str r3,[r2] ; 將控制亮燈數據寫入數據寄存器r2

        ldr r0,=DELAYVAL ; 設置延遲數

        bl delay ; 調用延遲子程序

        ldr r3,[r2] ; 將數據寄存器(r2)里的值放入r3

        bic r3,r3,#0x1e0 ; 清除bit[5]~bit[8],bit[n]代表led1~led4

        orr r3,r3,#0x160 ; 清對應Led位-亮燈,設置相應位-滅燈(點亮led3)

        str r3,[r2] ; 將控制亮燈數據寫入數據寄存器r2

        ldr r0,=DELAYVAL ; 設置延遲數

        bl delay ; 調用延遲子程序

        ldr r3,[r2] ; 將數據寄存器(r2)里的值放入r3

        bic r3,r3,#0x1e0 ; 清除bit[5]~bit[8],bit[n]代表led1~led4

        orr r3,r3,#0xe0 ; 清對應Led位-亮燈,設置相應位-滅燈(點亮led4)

        str r3,[r2] ; 將控制亮燈數據寫入數據寄存器r2

        ldr r0,=DELAYVAL ; 設置延遲數

        bl delay ; 調用延遲子程序

        b led_loop

        delay

        sub r0,r0,#1 ; r0=r0-1

        cmp r0,#0x0 ; 將r0的值與0相比較

        bne delay ; 比較的結果不為0,繼續調用delay

        mov pc,lr ; 返回

        END ; 程序結束符

        該實驗首先關閉了看門狗定時器,然后修改系統時鐘,將默認系統工作頻率12MHz提高到400MHz,由于CPU工作在較高頻率下,其執行速度明顯比未啟動系統時鐘時高的多,可以通過注釋掉系統時鐘初始化代碼跳轉指令bl clock_init,對比LED的跑馬燈效果可以證明。

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



        關鍵詞: S3C2440系統時

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 北京市| 来凤县| 南木林县| 肇庆市| 集贤县| 屏东县| 龙山县| 密山市| 大悟县| 阿克苏市| 五指山市| 陆丰市| 华蓥市| 石渠县| 云浮市| 昭平县| 全椒县| 镇江市| 铜陵市| 临西县| 金秀| 神农架林区| 托克逊县| 蒙自县| 海安县| 木里| 阜阳市| 桃园县| 龙口市| 贡觉县| 德清县| 中西区| 高邮市| 高安市| 左云县| 尤溪县| 天长市| 平顶山市| 丽江市| 城市| 杭州市|