28335之定時器原理
阿新 • • 發佈:2019-02-04
微控制器的定時器就很簡單,28335的定時器也沒難道那裡去。參考文章《https://blog.csdn.net/hmf1235789/article/details/51891997》
涉及經常使用的就一個time0定時器,其他兩個不用。用的話,原理也一樣。
涉及time0的暫存器也就5個:TDDRH:TDDR PSCH:PSC
PRDH :PRD TIMH:TIM
還有一個crl暫存器,主要管理中斷控制類的,在此不細說。看上邊4個暫存器,其實用得就兩個,而且一個還經常是0.
TDDRH:TDDR :作用將系統時鐘分頻(降低頻率),供定時器用。經常設定為0
PRDH :PRD :查數用的
PSCH:PSC 和 TIMH:TIM分別裝載以上連個暫存器的資料;PSCH:PSC 減到0之後發出一個時鐘訊號給TIMH:TIM,然後自動裝載TDDRH:TDDR。
TIMH:TIM 減到0之後,發出一箇中斷訊號,然後自動裝載PRDH :PRD
如何計算:參考《手把手教你學DSP2812》裡邊的解釋很清晰
提醒:
CpuTimer0.RegsAddr = &CpuTimer0Regs;
是什麼?
(cputime.c的程式碼)
cputime.h的程式碼struct CPUTIMER_VARS CpuTimer0; // CpuTimer 1 and CpuTimer2 are used by DSP BIOS & other RTOS. Comment out if using DSP BIOS or other RTOS. struct CPUTIMER_VARS CpuTimer1; struct CPUTIMER_VARS CpuTimer2; //--------------------------------------------------------------------------- // InitCpuTimers: //--------------------------------------------------------------------------- // This function initializes all three CPU timers to a known state. // void InitCpuTimers(void) { // CPU Timer 0 // Initialize address pointers to respective timer registers: CpuTimer0.RegsAddr = &CpuTimer0Regs; // Initialize timer period to maximum: CpuTimer0Regs.PRD.all = 0xFFFFFFFF; // Initialize pre-scale counter to divide by 1 (SYSCLKOUT): CpuTimer0Regs.TPR.all = 0; CpuTimer0Regs.TPRH.all = 0; // Make sure timer is stopped: CpuTimer0Regs.TCR.bit.TSS = 1; // Reload all counter register with period value: CpuTimer0Regs.TCR.bit.TRB = 1; // Reset interrupt counters: CpuTimer0.InterruptCount = 0;
struct CPUTIMER_REGS { union TIM_GROUP TIM; // Timer counter register union PRD_GROUP PRD; // Period register union TCR_REG TCR; // Timer control register Uint16 rsvd1; // reserved union TPR_REG TPR; // Timer pre-scale low union TPRH_REG TPRH; // Timer pre-scale high }; //--------------------------------------------------------------------------- // CPU Timer Support Variables: // struct CPUTIMER_VARS { volatile struct CPUTIMER_REGS *RegsAddr; Uint32 InterruptCount; float CPUFreqInMHz; float PeriodInUSec; }; //--------------------------------------------------------------------------- // Function prototypes and external definitions: // void InitCpuTimers(void); void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period); extern volatile struct CPUTIMER_REGS CpuTimer0Regs; extern struct CPUTIMER_VARS CpuTimer0; // CpuTimer 1 and CpuTimer2 are reserved for DSP BIOS & other RTOS. Comment out CpuTimer1 and CpuTimer2 if using DSP BIOS or other RTOS extern volatile struct CPUTIMER_REGS CpuTimer1Regs; extern volatile struct CPUTIMER_REGS CpuTimer2Regs; extern struct CPUTIMER_VARS CpuTimer1; extern struct CPUTIMER_VARS CpuTimer2;