單片機的定時器就很簡單,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的代碼)
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;
cputime.h的代碼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;