初始化函数
注意配置的顺序,其中有个配置不能放在后面,不然进不了中断,具体是哪个忘记了。(好像是ConfigCpuTimer(&CpuTimer0,100,1000);不能放在CpuTimer0Regs.TCR.bit.TSS = 0;后面)
extern void ISR_Timer0(void); extern struct CPUTIMER_VARS CpuTimer0; void CpuTimer0_Init(void) { CpuTimer0.RegsAddr = &CpuTimer0Regs;//指向定时器0地址 CpuTimer0Regs.PRD.all = 0xFFFFFFFF;//初始化定时器周期寄存器值 CpuTimer0Regs.TPR.bit.TDDR = 0; CpuTimer0Regs.TPR.bit.PSC = 0; CpuTimer0Regs.TPRH.all = 0; CpuTimer0Regs.TCR.bit.TSS = 1;//StopCpuTimer0 CpuTimer0Regs.TCR.bit.FREE = 1;//在软件断点时,计时器将继续运行。 CpuTimer0Regs.TCR.bit.TRB = 1;//使能重新装载 CpuTimer0.InterruptCount = 0;//重置定时器计数值 CpuTimer0Regs.TCR.bit.TIE = 1;//CPU-Timer Interrupt Enable CpuTimer0Regs.TCR.bit.TIF = 1;//CPU-Timer Overflow Flag ConfigCpuTimer(&CpuTimer0,100,1000);//<定时器x,系统时钟频率MHZ,时间us, CpuTimer0Regs.TCR.bit.TSS = 0;//StartCpuTimer0 EALLOW; PieVectTable.TIMER0_INT = &ISR_Timer0;//注册中断向量表 PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//使能PIE PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//使能1.7-Timer0 IER |= (1<<0);//使能int1 EDIS; }
在f28002x_cputimers.c文件中已经有这个函数,直接调用即可。
void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period) { Uint32 temp; // // Initialize timer period // Timer->CPUFreqInMHz = Freq; Timer->PeriodInUSec = Period; temp = (long) (Freq * Period); Timer->RegsAddr->PRD.all = temp; // // Set pre-scale counter to divide by 1 (SYSCLKOUT) // Timer->RegsAddr->TPR.all = 0; Timer->RegsAddr->TPRH.all = 0; // // Initialize timer control register // // // 1 = Stop timer, 0 = Start/Restart Timer // Timer->RegsAddr->TCR.bit.TSS = 1; // // 1 = reload timer // Timer->RegsAddr->TCR.bit.TRB = 1; Timer->RegsAddr->TCR.bit.SOFT = 0; // // Timer Free Run Disabled // Timer->RegsAddr->TCR.bit.FREE = 0; // // 0 = Disable 1 = Enable Timer Interrupt // Timer->RegsAddr->TCR.bit.TIE = 1; // // Reset interrupt counter // Timer->InterruptCount = 0; }
中断函数
中断函数内容根据需要填写
#pragma CODE_SECTION(ISR_Timer0, ".TI.ramfunc"); __interrupt void ISR_Timer0(void)// { // // // CpuTimer0Regs.TCR.bit.TIF = 1;//清除中断标志位 PieCtrlRegs.PIEACK.bit.ACK1 = 1;//清除PIE级中断应答 }