F28335的的定时器中断很简单,其定时器只有三个,而且只能向下计数,同时定时器的初始化函数已经封装好了。
1.定时器介绍
TMS320F28335 的CPU Time 有三个,分别为Timer0,Timer1,Timer2,其中Timer2 是为操作系统DSP/BIOS 保留的,当未移植操作系统时,可用来做普通的定时器。这三个定时器的中断信号分别为TINT0, TINT1, TINT2,分别对应于中断向量INT1,INT13,INT14。
定时器的中断结构如下图所示:
1.1定时器工作原理
当系统时钟(SYSCLKOUT)来一个脉冲,PSCH:PSC 预定标计数器减1,当PSCH:PSC 预定标计数器减到0 的时候,预定标计数器产生下溢后向定时器的32 位计数器TIMH:TIM 借位,即TIMH:TIM 计数器减1,同时PSCH:PSC 可以重载定时器分频寄存器(TDDRH:TDDR)的值;当计数寄存器TIMH:TIM 减到0 产生下溢的时候,计数寄存器会重载周期寄存器(PRDH:PRD)的值,同时定时器会产生一个中断信号给CPU。
简单概括就是:PSC按系统时钟递减,减到下溢时重置为TDDR,同时TIM减1;TIM减到下溢时重置为PRD,同时产生一个定时器中断。
定时器的功能如下图所示:
由图可以看出,TCR为0时定时器才可以开始工作;
TDDR(低位)和TDDRH(高位)组成16位寄存器,对系统时钟进行分频;
PRD(低位)和PRDH(高位)组成32位寄存器,储存每次重装载的值,相当于定时周期;
TIM(低位)和TIMH(高位)组成32位寄存器,用作定时器的当前计时的记录值。
2.定时器实验代码
/*
* time.h
*/
#ifndef TIME_H_
#define TIME_H_
#include "DSP2833x_Device.h" // DSP2833x 头文件
#include "DSP2833x_Examples.h" // DSP2833x 例子相关头文件
void TIM0_Init(float Freq,float Period);
interrupt void TIM0_IRQn(void);
#endif /* TIME_H_ */
/*
time.c
*/
#include "led.h"
#include "time.h"
//定时器0初始化函数
//Freq:CPU时钟频率(150MHz)
//Period:定时周期值,单位us
void TIM0_Init(float Freq, float Period)
{
//第1步 打开TIM0时钟//
EALLOW;
SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1;
EDIS;
//第2步 设置中断入口地址//
EALLOW;
PieVectTable.TINT0 = &TIM0_IRQn;
EDIS;
//第3步 配置定时器基本//
InitCpuTimers();
// Initialize timer period:
ConfigCpuTimer(&CpuTimer0,Freq,Period);
//第4步 打开定时器//
EALLOW;
CpuTimer0.RegsAddr->TCR.bit.TSS = 0;
//第5步 打开PIE组对应于定时器0的中断//
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
EDIS;
//第6步 打开CPU中断及//
IER |= M_INT1;
EINT;
ERTM;
}
interrupt void TIM0_IRQn(void)
{
EALLOW;
LED2_TOGGLE;
PieCtrlRegs.PIEACK.bit.ACK1=1;
EDIS;
}
/*
* main.c
*/
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "led.h"
#include "time.h"
extern void TIM0_Init(float Freq,float Period);
void main()
{
InitSysCtrl();
//需要初始化PIE 相应的寄存器和中断向量,关闭cpu级中断,同时清除其中断标志位
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
LED_Init();
TIM0_Init(150,100000);//TIM0配置 150MHz时钟频率 周期500ms
while(1)
{
LED1_TOGGLE;
DELAY_US(200000);
}
}
PS:如果有疑问可以在评论区交流哦!!