<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ARM學(xué)習(xí)筆記(三)時鐘分頻器設(shè)置

          ARM學(xué)習(xí)筆記(三)時鐘分頻器設(shè)置

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

          cal_cpu_bus_clk();

          本文引用地址:http://www.ex-cimer.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默認(rèn)的工作主頻為12MHz或16.9344MHz,這里使用最多的是12M。使用PLL電路可以產(chǎn)生更高的主頻供CPU及外圍器件使用。

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

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


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

          下面介紹MPLL的啟動流程:

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

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

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

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

          1、LOCKTIME:設(shè)為0x00ffffff

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

          2、CLKDIVN:用來設(shè)置FCLK:HCLK:PCLK的比例關(guān)系,默認(rèn)為1:1:1

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

          3、MPLLCON:設(shè)為(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 即默認(rèn)輸入的時鐘頻率12MHz。MPLLCON設(shè)為0x5c0011,可以計算出FCLK=400MHz,再由CLKDIVN的設(shè)置可知:HCLK=100MHz,PCLK=50MHz。

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

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

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

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

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

          HCLK,PCLK受CLKDIVN寄存器的影響,即當(dāng)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;
          }



          關(guān)鍵詞: ARM時鐘分頻

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();