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
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