28335之定時器原理

單片機的定時器就很簡單,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;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章