1. 程式人生 > >F28335 定時器0-Timer0中斷配置(完整)原始碼+註釋

F28335 定時器0-Timer0中斷配置(完整)原始碼+註釋

本定時器實現的功能就是在實現一個閃爍的LED燈和PWM波,LED亮滅週期和PWM週期均為200ms。

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

#define LED11 GpioDataRegs.GPADAT.bit.GPIO11
interrupt void ISRTimer0(void);


Uint16  i,led=0;


void main(void)
{

   InitSysCtrl();

   InitXintf16Gpio();	
 
   DINT;

   InitPieCtrl();

   IER = 0x0000;
   IFR = 0x0000;

   InitPieVectTable();                        //基本初始化

   EALLOW;
   PieVectTable.TINT0=&ISRTimer0;             //將中斷地址賦給你要寫的中斷
   EDIS;

   InitCpuTimers();                           //初始化系統時鐘,這個TI的DSP2833X_CpuTimes.c檔案自帶

#if (CPU_FRQ_150MHZ)                          //這個也是TI的DSP2833X_CpuTimes.c檔案自帶
// Configure CPU-Timer 0 to interrupt every 500 milliseconds:
// 150MHz CPU Freq, 50 millisecond Period (in uSeconds)
   ConfigCpuTimer(&CpuTimer0, 150, 100000);
#endif
#if (CPU_FRQ_100MHZ)
// Configure CPU-Timer 0 to interrupt every 500 milliseconds:
// 100MHz CPU Freq, 50 millisecond Period (in uSeconds)
   ConfigCpuTimer(&CpuTimer0, 100, 500000);
#endif

 CpuTimer0Regs.TCR.bit.TSS=0;                //寫0開啟定時器    寫1就是停止定時器了
                                             //在設定完時鐘之後,一定要記得開啟定時器

		EALLOW;
		GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 0;   //IO口的初始化
		GpioCtrlRegs.GPADIR.bit.GPIO26=1;
		EDIS;
		GpioDataRegs.GPADAT.bit.GPIO26=0;

        EALLOW;
        GpioCtrlRegs.GPAMUX1.bit.GPIO11= 0;
        GpioCtrlRegs.GPADIR.bit.GPIO11=1;
        EDIS;

        EALLOW;
        GpioCtrlRegs.GPAMUX1.bit.GPIO0= 0;
        GpioCtrlRegs.GPADIR.bit.GPIO0=1;
        EDIS;


        IER|=M_INT1;                         //全域性使能INT1
        PieCtrlRegs.PIEIER1.bit.INTx7=1;     //使能INT1.7即定時器0中斷   

        EINT;
        ERTM;

   for(; ;)
   {};

}


interrupt void ISRTimer0(void)
{
	led++;
CpuTimer0.InterruptCount++;

PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;          //使能CPU接受第一組中斷

GpioDataRegs.GPATOGGLE.bit.GPIO11=1;           //I/O口翻轉
GpioDataRegs.GPATOGGLE.bit.GPIO0=1;

CpuTimer0Regs.TCR.bit.TIF=1;                   //清除中斷標誌位
CpuTimer0Regs.TCR.bit.TRB=1;                   //使能過載


}
//===========================================================================
// No more.
//===========================================================================

這下面具體介紹一下,TI的DSP2833X_CpuTimes.c檔案自帶的兩個函式

第一個:就是中斷時間設定函式,這個函式有3個引數

  • 哪個定時器
  • 定時器頻率
  • 定時器週期
void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
{
	Uint32 	temp;

	// 初始化時鐘,其中Freq是定時器頻率,Period是定時器中斷週期
	//這裡說一下他的計算過程,在150M的情況下,temp=150*500000=75M,而一個時鐘週期是Tbclk=1/150M s ,
	// temp*Tbclk=0.5s
	//所以這個是一個0.5秒閃爍的燈。
	Timer->CPUFreqInMHz = Freq;
	Timer->PeriodInUSec = Period;
	temp = (long) (Freq * Period);
	Timer->RegsAddr->PRD.all = temp;


	Timer->RegsAddr->TPR.all  = 0;    //預定標暫存器給0
	Timer->RegsAddr->TPRH.all  = 0;

	// Initialize timer control register:
	Timer->RegsAddr->TCR.bit.TSS = 1;      // 停止定時器
	Timer->RegsAddr->TCR.bit.TRB = 1;      // 重新裝載定時器
	Timer->RegsAddr->TCR.bit.SOFT = 0;
	Timer->RegsAddr->TCR.bit.FREE = 0;     // 模擬模式關閉
	Timer->RegsAddr->TCR.bit.TIE = 1;      // 使能定時器中斷

	// Reset interrupt counter:
	Timer->InterruptCount = 0;
}

第二個:CPU初始化函式

void InitCpuTimers(void)
{
 
	// 指向定時器0地址
	CpuTimer0.RegsAddr = &CpuTimer0Regs;
	// 初始化定時器週期暫存器值
	CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;
	// 設定預定標數
	CpuTimer0Regs.TPR.all  = 0;
	CpuTimer0Regs.TPRH.all = 0;
	// 確保定時器在停止狀態
	CpuTimer0Regs.TCR.bit.TSS = 1;
	// 使能重新裝載
	CpuTimer0Regs.TCR.bit.TRB = 1;
	// 重置定時器計數值
	CpuTimer0.InterruptCount = 0;


// 定時器1和2和定時器0類似

   // 指向定時器1和2地址
	CpuTimer1.RegsAddr = &CpuTimer1Regs;
	CpuTimer2.RegsAddr = &CpuTimer2Regs;
	// 初始化定時器週期暫存器值
	CpuTimer1Regs.PRD.all  = 0xFFFFFFFF;
	CpuTimer2Regs.PRD.all  = 0xFFFFFFFF;
	// 設定預定標數
	CpuTimer1Regs.TPR.all  = 0;
	CpuTimer1Regs.TPRH.all = 0;
	CpuTimer2Regs.TPR.all  = 0;
	CpuTimer2Regs.TPRH.all = 0;
	// 確保定時器在停止狀態:
	CpuTimer1Regs.TCR.bit.TSS = 1;
	CpuTimer2Regs.TCR.bit.TSS = 1;
	// 使能重新裝載
	CpuTimer1Regs.TCR.bit.TRB = 1;
	CpuTimer2Regs.TCR.bit.TRB = 1;
	// 重置定時器計數值
	CpuTimer1.InterruptCount = 0;
	CpuTimer2.InterruptCount = 0;

}