Board logo

标题: [求助]mc9s12xdp512 Period Interrupt Timer [打印本页]

作者: ygs090608    时间: 2007-1-29 12:43     标题: [求助]mc9s12xdp512 Period Interrupt Timer

各位大侠;
我现在用到了mc9s12xdp512的Period Interrupt Timer.
在for循环之前使能了一个5ms的PIT,并打开中断,中断用MCU来处理。用单步运行的时候发现,在执行完EnableInterrupt;这句就进入了中断服务程序,而后才进入for循环.请问这是怎么回事?

void SetupPITimer (void)
{
/* time-out period = (PITMTLD0 + 1) * (PITLD0 + 1) / Fbus */
PITMUX &= 0xfe;
PITCE |= 0x01
PITCFLMT |= 0x80;
}

void Enable5msPITimer (void)
{
PITTF |= 0x01; /* clear PIT interrupt */
PITMTLD0 = 0x01; /* MT0 load value (divides bus clock) */
PITLD0 = 9999; /* T0 load value (5 ms) */
PITCFLMT |= 0x01; /* PFLMT0=1 (reload MT0) */
PITFLT |= 0x01; /* force reload of PIT channel 0 */
PITINTE |= 0x01; /* enable PIT channel 0 interrupt */
}

void main(void)
{
SetupPITimer();

Enable5msPITimer();

EnableInterrupts;

for(;;)
{
Strobbing();
}
}

/* interrupt handler for PIT 0 */

interrupt void ISR_PIT0 ()
{
PITINTE &= 0xfe;
PITTF |= 0x01;

}
作者: strongchen    时间: 2007-1-29 14:40

一般来说,在使能某个中断之前,应该先清一下它的中断标志。
作者: ygs090608    时间: 2007-1-29 15:39

谢谢版主!我也是首先清除了标志(PITTF |= 0x01;)。我在调试中发现:把清标志这一句放到void Enable5msPITimer (void)最后一句,就可以了。挺奇怪的。

作者: strongchen    时间: 2007-1-29 15:46

一般都是这样的,要放在紧挨着使能中断的上面一句。因为在初时化过程中有可能产生中断标志。
作者: ygs090608    时间: 2007-1-30 12:22

我已经找到答案了,和大家分享。
先disable PIT module,寄存器配置完后再enable PIT module(PITCFLMT |= 0x80;).如果一开始就enable PIT module和相应通道,中断标志就会立刻置起而产生中断。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0