以下是我測試Timer的程式碼,使用的是12MHz晶振
第一次填入 TIMER0->TCMPR=12000000; 量測到1s的時間很準確
第二次填入 TIMER0->TCMPR=1200000 ; 量測到0.1s的時間也很準確
套入NUC datasheet 計算公式
Time out period = (Period of timer clock input) * (8-bit PRESCALE + 1) * (24-bit TCMP)
1s = 1/12000000 * 1 * 12000000 驗證正確
0.1s = 1/12000000 * 1 * 1200000 驗證正確
故我想要製造38KHz要填入 TCMPR = 315.789 (小數點已被忽略) ,發現測量到27.17KHz,雖然我知道會有誤差,但誤差也太大了吧!!
後來再填入其他低的值,經過計算所得出來的時間都不正確...
这让我非常的惊讶,因为Timer的时间照理说都要很準,想请问到底是我程式问题,还是NUC120的Bug!!麻烦求解,感谢!!
#include "NUC1xx.h"
#include "Driver\DrvGPIO.h"
void timer();
void timer_aa();
main()
{
timer();
while(1)
{
DrvGPIO_SetBit(E_GPA,1);
timer_aa();
DrvGPIO_ClrBit(E_GPA,1);
timer_aa();
}
}
void timer()
{
UNLOCKREG();
SYSCLK->PWRCON.XTL12M_EN = 1;
SYSCLK->CLKSEL0.HCLK_S = 0;
LOCKREG();
DrvGPIO_Open(E_GPA, 1, E_IO_OUTPUT);
DrvGPIO_Open(E_GPA, 0, E_IO_OUTPUT);
DrvGPIO_ClrBit(E_GPA,1);
SYSCLK->CLKSEL1.TMR0_S = 0;
SYSCLK->APBCLK.TMR0_EN =1;
TIMER0->TCSR.MODE=0;
TIMER0->TCSR.PRESCALE=0;
TIMER0->TCMPR=12000000;
TIMER0->TCSR.IE = 1;
TIMER0->TISR.TIF = 1;
}
void timer_aa()
{
TIMER0->TCSR.CEN = 1;
while( TIMER0->TISR.TIF != 1) ;
TIMER0->TISR.TIF = 1;
}
|