F28335 定時器0-Timer0中斷配置(完整)原始碼+註釋
阿新 • • 發佈:2019-02-11
本定時器實現的功能就是在實現一個閃爍的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; }