我自己的理解;寫的不一定對,還請多指教;
從網上看到的好多都是復制粘貼的一個版本,感覺不太對
圖上的是系統時鍾(SYSCLKOUT)=75MHz;
ConfigCpuTimer(&CpuTimer0, 150, 500000);
這樣不太現實,系統時鍾跑75M次是1s,你cpu定時器跑150M才是1s,怎么可能?TPR里的TDDRH:TDDR沒法設置啊,不可能讓他們等於1/2吧!所以我覺得這說的不對;
下圖是我們在程序中經常見到的對cpu定時器的設置;
從注釋中可以知道,CPU定時器的時鍾頻率是150Mhz時(區別於系統時鍾SYSCLKOUT),(500000是定時器一個周期的時間,應該就是設定的時間T)每50ms會發生一次中斷;怎么實現的呢?
CPUFreqInMHz這個是cpu定時器的頻率,由ConfigCpuTimer()的Freq可知為150,單位為Mhz;(區別於系統時鍾SYSCLKOUT),
CPU的定時器時鍾周期即:TIMCLK=(TDDRH:TDDR+1)x(1/SYSCLKOUT),他的倒數就是cpu定時器的頻率,已知函數中自定義的Freq就是頻率,那么就可以求得(TDDRH:TDDR)的值了;Freq是等於系統時鍾頻率的所以TDDR是1;在這里
這樣設置TPR(即PSC+TDDR)就表示定時器的時鍾等於系統時鍾;
為什么將(Freq*Period)賦給PRD?PRD是定時器周期寄存器,意思應該就是定時器從開始到發出中斷的時間,讓它走(Freq*Period)個定時器周期,停止然后中斷;
ConfigCpuTimer(&CpuTimer0, 150, 500000);由此函數知
T(想要的定時時間/定時器周期)=TIMCLK*(PRDH:PRD)==>(PRDH:PRD)=T/TIMCLK=T*Freq;
(比如說系統時鍾150MHz,即一個周期是6.67ns;由PRD知運行的系統周期是500000x150=75000000個;75000000x6.666667=500000250ns,大約就是0.5s);
ConfigCpuTimer(&CpuTimer0, 75, 500000);
即:cpu定時器的頻率是75MHz,即每兩個系統時鍾周期代表一個CPU定時器周期;那么時間就變位2x6.666667ns(1/75);
我需要的一個定時器周期是500000us,一個周期是(1/75M)s,那么我就需要500000x75個這樣的周期,所以PRDH:PRD就被設置為75*500000=37.5M;
(PRDH:PRD)*2x6.666667ns=0.5s;