在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM學習筆記(三)時鐘分頻器設置

            ARM學習筆記(三)時鐘分頻器設置

            作者: 時間:2016-11-11 來源:網(wǎng)絡 收藏
            主程序里:ChangeClockDivider(key, 12); //key=14

            cal_cpu_bus_clk();

            本文引用地址:http://www.biyoush.com/article/201611/316725.htm

            找到函數(shù):

            //************************[ HCLK, PCLK ]***************************
            voidChangeClockDivider(inthdivn_val,intpdivn_val)
            {
            inthdivn=2, pdivn=0;

            // hdivn_val (FCLK:HCLK)ratio hdivn
            // 11 1:1 (0)
            // 12 1:2 (1)
            // 13 1:3 (3)
            // 14 1:4 (2)
            // pdivn_val (HCLK:PCLK)ratio pdivn
            // 11 1:1 (0)
            // 12 1:2 (1)
            switch(hdivn_val)

            {
            case11: hdivn=0; break;
            case12: hdivn=1; break;
            case13:
            case16: hdivn=3; break;
            case14:
            case18: hdivn=2; break;

            }

            switch(pdivn_val)

            {
            case11: pdivn=0; break;
            case12: pdivn=1; break;
            }

            //Uart_Printf("Clock division change [hdiv:%x, pdiv:%x]n", hdivn, pdivn);
            rCLKDIVN= (hdivn<<1) | pdivn;

            switch(hdivn_val)

            {
            case 16:// when 1, HCLK=FCLK/8.
            rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<8);
            break;
            case 18: // when 1, HCLK=FCLK/6.
            rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<9);
            break;
            }
            //FCLK=MPLL=400MHz.FCLK:HCLK:PCLK=1:4:8HCLK=100M,PCLK=50M
            if(hdivn!=0)
            MMU_SetAsyncBusMode();
            else
            MMU_SetFastBusMode();

            //如果hdivn不為0,CPU總線從FastBusMode變?yōu)锳syncBusMode
            }

            EXPORT MMU_SetFastBusMode
            MMU_SetFastBusMode
            mrc p15,0,r0,c1,c0,0 ;read ctrl register
            bic r0,r0,#R1_iA:OR:R1_nF ;bic r0,r0,#0xc0000000
            mcr p15,0,r0,c1,c0,0 ;write ctrl register
            MOV_PC_LR


            EXPORT MMU_SetAsyncBusMode
            MMU_SetAsyncBusMode
            mrc p15,0,r0,c1,c0,0 ;read ctrl register
            orr r0,r0,#R1_nF:OR:R1_iA;orr r0,r0,#0xc0000000 (Asynchronous)
            mcr p15,0,r0,c1,c0,0 ;wirte ctrl register
            MOV_PC_LR

            S3C2440 CPU默認的工作主頻為12MHz或16.9344MHz,這里使用最多的是12M。使用PLL電路可以產(chǎn)生更高的主頻供CPU及外圍器件使用。

            S3C2440有兩個PLL:MPLL和UPLL,UPLL專用與USB設備。MPLL用于CPU及其他外圍器件。

            通過MPLL會產(chǎn)生三個部分的時鐘頻率:FCLK、HCLK、PLCK。FCLK用于CPU核,HCLK用于AHB總線的設備(比如SDRAM),PCLK用于APB總線的設備(比如UART)。從時鐘結(jié)構(gòu)圖中可以查看到使用不同時鐘頻率的硬件。


            500)this.width=500;" border=0>

            下面介紹MPLL的啟動流程:

            1、上電幾毫秒后,晶振輸出穩(wěn)定,F(xiàn)CLK=晶振頻率,nRESET信號恢復高電平后,CPU開始執(zhí)行指令。

            2、我們可以在程序開頭啟動MPLL,在設置MPLL的幾個寄存器后,需要等待一段時間(Lock Time),MPLL的輸出才穩(wěn)定。在這段時間(Lock Time)內(nèi),F(xiàn)CLK停振,CPU停止工作。Lock Time的長短由寄存器LOCKTIME設定。

            3、Lock Time之后,MPLL輸出正常,CPU工作在新的FCLK下。

            設置S3c2440的時鐘頻率就是設置MPLL的幾個寄存器:

            1、LOCKTIME:設為0x00ffffff

            前面說過,MPLL啟動后需要等待一段時間(Lock Time),使得其輸出穩(wěn)定。位[23:12]用于UPLL,位[11:0]用于MPLL。使用確省值0x00ffffff即可。

            2、CLKDIVN:用來設置FCLK:HCLK:PCLK的比例關系,默認為1:1:1

            這里值設為0x05,即FCLK:HCLK:PCLK=1:4:8

            3、MPLLCON:設為(0x5c<< 12)|(0x01<< 4)|(0x01),即0x5c0011

            對于MPLLCON寄存器,[19:12]為MDIV,[9:4]為PDIV,[1:0]為SDIV。有如下計算公式:

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

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

            Fin 即默認輸入的時鐘頻率12MHz。MPLLCON設為0x5c0011,可以計算出FCLK=400MHz,再由CLKDIVN的設置可知:HCLK=100MHz,PCLK=50MHz。

            到這里我們應該徹底弄清楚了程序中經(jīng)常出現(xiàn)的幾個CLK:

            Fin,MPLL,UPLL,FCLK,HCLK,PCLK.

            Fin指CPU外圍接的晶振本身的頻率,通常為12MHz。

            MPLL和UPLL分別指的是用于供整機系統(tǒng)的PLL和專用于USB的UPLL。

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

            HCLK,PCLK受CLKDIVN寄存器的影響,即當FCLK確定后,CLKDIVN決定了HCLK和PCLK

            下一語句:cal_cpu_bus_clk();
            staticvoidcal_cpu_bus_clk(void)
            {
            U32val;
            U8m, p, s;

            val =rMPLLCON;
            m = (val>>12)&0xff;
            p = (val>>4)&0x3f;
            s = val&3;


            FCLK= ((m+8)*(FIN/100)*2)/((p+2)*(1<
            val =rCLKDIVN;
            m = (val>>1)&3;
            p = val&1;
            val =rCAMDIVN;
            s = val>>8;

            switch(m) {
            case0:
            HCLK=FCLK;
            break;
            case1:
            HCLK = FCLK>>1;
            break;
            case2:
            if(s&2)
            HCLK=FCLK>>3;
            else
            HCLK=FCLK>>2;
            break;
            case3:
            if(s&1)
            HCLK=FCLK/6;
            else
            HCLK=FCLK/3;
            break;
            }

            if(p)
            PCLK=HCLK>>1;
            else
            PCLK=HCLK;

            if(s&0x10)
            cpu_freq =HCLK;
            else
            cpu_freq =FCLK;

            val =rUPLLCON;
            m = (val>>12)&0xff;
            p = (val>>4)&0x3f;
            s = val&3;
            UPLL= ((m+8)*FIN)/((p+2)*(1<UCLK= (rCLKDIVN&8)?(UPLL>>1):UPLL;
            }



            關鍵詞: ARM時鐘分頻

            評論


            技術(shù)專區(qū)

            關閉