DSP28335的定时器介绍
DSP28335的定时器模块包括三个独立的定时器:Timer0、Timer1和Timer2。每个定时器都有多种工作模式和配置选项,以满足不同应用需求。
主要特性和用途:
-
时间延迟生成: 可以使用定时器来生成精确的时间延迟。你可以配置定时器的计数值和时钟源,从而实现特定的延迟时间。
-
PWM生成: 定时器可以用于生成脉冲宽度调制(PWM)信号,用于控制电机、LED亮度调节、电源逆变器等应用。
-
定时中断: 定时器可以配置为在特定的时间间隔内生成中断请求,从而用于实现定时任务,例如周期性数据采集、控制循环等。
-
计时: 定时器可以用于测量特定事件的时间间隔,如脉冲宽度、周期等。
-
捕获模式: 定时器可以在外部事件触发时记录计数器的值,用于精确测量外部事件的发生时间。
-
辅助时钟源: 定时器可以配置为使用内部时钟源或外部时钟源,从而具有较高的灵活性。
设置定时器点亮LED程序
timer0定时器设置
timer0定时器初始化
void timer0_Init(void)
{
EALLOW;
PieVectTable.TINT0 = &timer0_isr; //定时器中断地址
EDIS;
InitCpuTimers();
ConfigCpuTimer(&CpuTimer0, 150, 1000); //定时为 1 ms
CpuTimer0Regs.TCR.all = 0x4001; //设置 TSS bit = 0
IER |= M_INT1; //CPU-Timer0 属于CPU INT1 使能
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //使能 TINT0 在 PIE 中 第七中断
EINT; //使能INTM中断
ERTM; //使能DBGM中断
}
timer0定时器中断服务函数设置,注意这里因为timer0属于PIE管理需要手动复位。
interrupt void timer0_isr(void)
{
//清除中断标志
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
LED1 = ~LED1;
DELAY_US(200000);
LED1 = ~LED1;
DELAY_US(200000);
}
timer1定时器设置
timer1定时器初始化
void timer1_Init(void)
{
EALLOW;
PieVectTable.XINT13 = &timer1_isr; //定时器中断地址
EDIS;
InitCpuTimers();
ConfigCpuTimer(&CpuTimer1, 150, 10000); //定时为 10 ms
CpuTimer1Regs.TCR.all = 0x4001; //设置 TSS bit = 0
IER |= M_INT13; //CPU-Timer0 属于CPU INT1 使能
EINT; //使能INTM中断
ERTM; //使能DBGM中断
}
timer1定时器中断服务函数设置
interrupt void timer1_isr(void)
{
LED2 = ~LED2;
DELAY_US(200000);
LED2 = ~LED2;
DELAY_US(200000);
}
main函数
void main(void)
{
InitSysCtrl();
//initGpio();
InitXintf16Gpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
configtestled();
//timer0_Init();
timer1_Init();
while(1){
LED3 = ~LED3;
DELAY_US(200000);
LED3 = ~LED3;
DELAY_US(200000);
}
}
timer0与其他两个定时器的配置差异
timer0的中断函数在PIE模块中,对于标志位需要手动复位,所以可以看到调用中断函数的时候会编写 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1 以实现复位。而其他两个定时器直接与CPU相联系,不需要手动复位。