DSP-定时器原理
CPU_TIMER
Timer0 最常用于普通裸机定时任务;Timer1、Timer2 不经过 PIE。使用 SYS/BIOS 时,Timer1、Timer2 可能被系统占用

一般只设置定CPUTimer寄存器的TCR寄存器

三个定时器的主要区别

1、Timer0中断配置 区别于1、2


Timer0 的完整路径:
Timer0产生TINT0
↓
TIE = 1
↓
PIEIER1.INTx7 = 1
↓
PIE Group1
↓
IER中的M_INT1 = 1
↓
全局中断EINT
↓
CPU执行Timer0 ISR
Timer0经过PIE外设中断层,则 ISR 退出前要应答 PIE:
Timer0产生中断
↓
PIE Group1被占用并暂时锁定
↓
CPU执行cpu_timer0_isr()
↓
写PIEACK_GROUP1
↓
解除Group1锁定
↓
允许Group1下一次中断
中断设置/中段函数
c
EALLOW;
//打开
PieVectTable.TINT0 = &cpu_timer0_isr;
EDIS;
//使能 PIE 第1组的第7个中断通道
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
//IER:CPU 中断使能寄存器
//M_INT1:中断系统的1号中断
IER |= M_INT1;
EINT;
//Timer0 ISR 退出前要应答 PIE:
interrupt void cpu_timer0_isr(void)
{
// 定时任务
/*通知 PIE 控制器:"第1组中断已经处理完成,可以接收该组的下一次中断*/
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
定时器0初始化
c
/* 基础初始化CPU定时器。 */
InitCpuTimers();
/* Timer1每隔0.5秒产生一次中断请求,内部已设置TIE = 1。 */
ConfigCpuTimer(&CpuTimer0, 150.0f, 500000.0f);
/* StartCpuTimer0()是一个宏,展开CpuTimer0Regs.TCR.bit.TSS = 0; 启动计数 。*/
StartCpuTimer0();
2、Timer1中断配置
c
EALLOW;
PieVectTable.XINT13 = &cpu_timer1_isr;
EDIS;
IER |= M_INT13;
EINT;
定时器1初始化
c
/* 基础初始化CPU定时器。 */
InitCpuTimers();
/* Timer1每隔0.5秒产生一次中断请求,内部已设置TIE = 1。 */
ConfigCpuTimer(&CpuTimer1, 150.0f, 500000.0f);
/* StartCpuTimer0()是一个宏,展开CpuTimer0Regs.TCR.bit.TSS = 0; 启动计数 。*/
StartCpuTimer1();
3、Timer2中断配置
c
EALLOW;
PieVectTable.TINT2 = &cpu_timer2_isr;
EDIS;
IER |= M_INT14;
EINT;