TI中文支持网
TI专业的中文技术问题搜集分享网站

进入T0定时器中断特慢…..

 最近用到2812的定时器中断,但是发现一个问题,就是启动定时器后进入定时中断的时间特别长,不知道是什么问题?

我的代码如下:

主函数:

main()

{

InitSysCtrl(); //初始化系统函数
DINT;
IER = 0x0000; //禁止CPU中断
IFR = 0x0000; //清除CPU中断标志
InitGpio(); //初始化Gpio口
InitPieCtrl();
InitPieVectTable();
InitCpuTimers();
InitSci();

ConfigCpuTimer(&CpuTimer0, 150, 1000000); //CPU定时器T0输入时钟为150MHz,定时周期1s
ConfigCpuTimer(&CpuTimer1, 150, 1000000); //CPU定时器T1输入时钟为150MHz,定时周期1s
ConfigCpuTimer(&CpuTimer2, 150, 1000000); //CPU定时器T2输入时钟为150MHz,定时周期1s

PieCtrl.PIEIER1.bit.INTx7 = 1; //使能PIE模块的CPU定时器T0周期中断
IER |= M_INT1; //开CPU中断1

IER |= M_INT13; //开定时器T1中断,定时器T1中断是INT13
IER |= M_INT14; //开定时器T2中断,定时器T2中断是INT14

EINT;
ERTM;
StartCpuTimer0(); //启动CPU定时器T0
while(1);

}

定时器中断函数:

interrupt void INT13_ISR(void) / / INT13 or CPU-Timer1
{
ScibRegs.SCITXBUF = 'e';       // 通过SCIB向串口调试软件发送一个字符e
CpuTimer1.InterruptCount++;

StopCpuTimer1();
StartCpuTimer2();
}

interrupt void INT14_ISR(void) // CPU-Timer2
{
ScibRegs.SCITXBUF = 'e'; // 通过SCIB向串口调试软件发送一个字符e
CpuTimer2.InterruptCount++;

StopCpuTimer2();
StartCpuTimer0();
}

interrupt void TINT0_ISR(void) // CPU-Timer 0
{
ScibRegs.SCITXBUF = 'L';    //发送数据
CpuTimer0.InterruptCount++;

StopCpuTimer0();
StartCpuTimer1();

CpuTimer0Regs.TCR.bit.TIF = 1; //清除定时器T0中断标志位
PieCtrl.PIEACK.bit.ACK1 = 1; //响应同组中断
EINT; //开全局中断

}

程序的主要功能是每隔一秒向串口调试软件发送一个数据,这里用到2812的3个定时器没有其它的意思,主要是为了验证TI官方文档中“定时器0是留给用户自用的,定时器1、定时器2是留给操作系统使用的,在不使用操作系统的时候才可以使用”这句话是否正确。

从程序的运行结果来看,定时器0、1、2都可被用户使用,串口调试软件确实每个1s都接收到一个数据,但是也有一个问题:在主程序启动定时器T0之后StartCpuTimer0()间隔很长的时间才进入T0中断,而配置T0定时周期是1s,进入T0定时中断之后,启动定时器T1 StartCpuTimer1()也出现同样的问题,进入T2之后也一样…. 等待进入T2中断之后再次开启T0中断后,1s之后进入T0中断,接下来都是每隔1s进入各自的中断,程序正常运行…

为什么第一次进入中断的时间都那么长?????

Victor Zheng:

两点怀疑:

2812的系统时钟是否正确。
你的Timer的时钟是否正确。

 最近用到2812的定时器中断,但是发现一个问题,就是启动定时器后进入定时中断的时间特别长,不知道是什么问题?

我的代码如下:

主函数:

main()

{

InitSysCtrl(); //初始化系统函数
DINT;
IER = 0x0000; //禁止CPU中断
IFR = 0x0000; //清除CPU中断标志
InitGpio(); //初始化Gpio口
InitPieCtrl();
InitPieVectTable();
InitCpuTimers();
InitSci();

ConfigCpuTimer(&CpuTimer0, 150, 1000000); //CPU定时器T0输入时钟为150MHz,定时周期1s
ConfigCpuTimer(&CpuTimer1, 150, 1000000); //CPU定时器T1输入时钟为150MHz,定时周期1s
ConfigCpuTimer(&CpuTimer2, 150, 1000000); //CPU定时器T2输入时钟为150MHz,定时周期1s

PieCtrl.PIEIER1.bit.INTx7 = 1; //使能PIE模块的CPU定时器T0周期中断
IER |= M_INT1; //开CPU中断1

IER |= M_INT13; //开定时器T1中断,定时器T1中断是INT13
IER |= M_INT14; //开定时器T2中断,定时器T2中断是INT14

EINT;
ERTM;
StartCpuTimer0(); //启动CPU定时器T0
while(1);

}

定时器中断函数:

interrupt void INT13_ISR(void) / / INT13 or CPU-Timer1
{
ScibRegs.SCITXBUF = 'e';       // 通过SCIB向串口调试软件发送一个字符e
CpuTimer1.InterruptCount++;

StopCpuTimer1();
StartCpuTimer2();
}

interrupt void INT14_ISR(void) // CPU-Timer2
{
ScibRegs.SCITXBUF = 'e'; // 通过SCIB向串口调试软件发送一个字符e
CpuTimer2.InterruptCount++;

StopCpuTimer2();
StartCpuTimer0();
}

interrupt void TINT0_ISR(void) // CPU-Timer 0
{
ScibRegs.SCITXBUF = 'L';    //发送数据
CpuTimer0.InterruptCount++;

StopCpuTimer0();
StartCpuTimer1();

CpuTimer0Regs.TCR.bit.TIF = 1; //清除定时器T0中断标志位
PieCtrl.PIEACK.bit.ACK1 = 1; //响应同组中断
EINT; //开全局中断

}

程序的主要功能是每隔一秒向串口调试软件发送一个数据,这里用到2812的3个定时器没有其它的意思,主要是为了验证TI官方文档中“定时器0是留给用户自用的,定时器1、定时器2是留给操作系统使用的,在不使用操作系统的时候才可以使用”这句话是否正确。

从程序的运行结果来看,定时器0、1、2都可被用户使用,串口调试软件确实每个1s都接收到一个数据,但是也有一个问题:在主程序启动定时器T0之后StartCpuTimer0()间隔很长的时间才进入T0中断,而配置T0定时周期是1s,进入T0定时中断之后,启动定时器T1 StartCpuTimer1()也出现同样的问题,进入T2之后也一样…. 等待进入T2中断之后再次开启T0中断后,1s之后进入T0中断,接下来都是每隔1s进入各自的中断,程序正常运行…

为什么第一次进入中断的时间都那么长?????

wei li1:

回复 Victor Zheng:

谢谢您的解答…

我仔细检查了,系统时钟没问题,我程序中SYSCLKOUT=150MHz,所以定时器的时钟也是150MHz,程序的BUG是启动定时器到第一次进入定时中断之间的时间太长,后面都是每隔一秒进入定时中断….

赞(0)
未经允许不得转载:TI中文支持网 » 进入T0定时器中断特慢…..
分享到: 更多 (0)