mini 2440 test 的Delay

1 延遲程序Delay
void Delay(int time)
{
      U32 val = (PCLK>>3)/1000-1;
      rTCFG0 &= ~(0xff<<8);
      rTCFG0 |= 3<<8;            //prescaler = 3+1
      rTCFG1 &= ~(0xf<<12);
      rTCFG1 |= 0<<12;           //mux = 1/2

      rTCNTB3 = val;
      rTCMPB3 = val>>1;        // 50%
      rTCON &= ~(0xf<<16);
      rTCON |= 0xb<<16;        //interval, inv-off, update TCNTB3&TCMPB3, start timer 3
      rTCON &= ~(2<<16);           //clear manual update bit
      while(time--) {
           while(rTCNTO3>=val>>1);
           while(rTCNTO3<val>>1);
      };
}
1)          計數器的輸入時鐘(CCLK)頻率:PCLK/(預分頻+1)/分割值
預分頻值和分割值分別由TCFG0,TCFG1來確定。
rTCFG0 &= ~(0xff<<8);
rTCFG0 |= 3<<8;            //prescaler = 3+1
rTCFG1 &= ~(0xf<<12);
rTCFG1 |= 0<<12;           //mux = 1/2
預分頻爲3,分割值爲2,又已知PCLK=50Mhz
因此可以計算出計數器輸入時鐘頻率6.25Mhz。
2)初始值的設定了是由TCMPB3和TCNTB3來完成了
TCMPB3一定要小於TCNTB3。
TCMPB3在定時的過程中不變,然後TCNTB3開始減計數,直到與TCMPB3相等時觸發中斷,通過設定就可以重新轉載TCNTB3。

      U32 val = (PCLK>>3)/1000-1;
      rTCNTB3 = val;
      rTCMPB3 = val>>1;        // 50%
我們可以比較一下rTCNTB3與計數器的輸入時鐘,可以發現rTCNTB3的頻率是輸入時鐘的1000分之一,(因爲包括0)。因此我們可以這樣等價的認爲rTCNTB3 = 1000CCLK,      rTCMPB3=500CCLK。
然後我們看上面的定時的時序,rTCNTB3開始減計數,直到減到500與rTCMPB3相等,觸發中斷,然後rTCNTB3再減一以後繼續裝載。
2)          rTCON定時控制寄存器
rTCON[16,17,18,19]控制Timer3
rTCON &= ~(0xf<<16);
      rTCON |= 0xb<<16;        //interval, inv-off, update TCNTB3&TCMPB3, start timer 3
      rTCON &= ~(2<<16);           //clear manual update bit


3)          實現延遲
由於Delay程序只是軟件定時,因此設計了一個while循環來完成定時的功能。具體實現如下:
while(time--) {
while(rTCNTO3>=val>>1);
while(rTCNTO3<val>>1);
};
最外層的WHILE只是DELAY的次數,然後看裏面的兩個WHILE,TCNTO3是個BUFFER,用來讀TCNTB3,其實也就等同於TCNTB3,while(rTCNTO3>=val>>1);就是等到rTCNTO3<val時,執行下一個WHILE,
此外前面程序設定rTCNTB3 = val;
並且rTCMPB3 = val>>1;
while(rTCNTO3>=val>>1)也就等同於
while(rTCNTO3>=rTCMPB3 );
所以,rTCNTB3開始減計數,當等於以後,再減1則進入下一個語句的while(rTCNTO3<val>>1);顯然此時要自動轉載TCNTO3爲VAL下一個WHILE 爲假,退出while。
然後開始下一個time--
4)實現的延遲時間的計算
通過以上的分析,可以得到延遲時間的頻率:CCLK/2
時間是0.32ms
發佈了31 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章