-
以前用过ARM,如果串口在复位过程中一段时间内没有获得回复就会自动进入正常启动的。但是这款片子却不能自动进入正常启动,而是在那里死等PC的回复。真是无语了。
-
这是怎么回事啊?难道F2802X的FLASH还有特别的映射?
-
顶起,别沉了。
-
问题彻底解决了,说一下方法,大家引以为戒吧。
我的中断是ADC中断,而且ADC中断由pwm驱动。在没有修改程序前,经常会发生中断溢出情况,特别是在复位后最容易发生(大概是3~5次复位就会发生一次)。而且有时候发生中断溢出后会没法再次进入中断。
现在重新修改初始化步骤如下:
1.打开中断允许。
2.打开ADC
3.打开PWM
另外,清中断必须在中断服务函数的起始位置。
按照以上方法,我写了一个测试程序,进行了1366次复位,没有一次发生中断溢出情况
为了提高程序健壮性,我在中断程序的结束位置检查中断溢出标志,如果溢出了则再清一次中断。
程序还在测试,迄今为止一切正常。
-
问题已经初步解决了,还是清中断的问题,一进入中断服务程序就清中断就可以了。我的猜测是软件清中断和硬件产生中断在同时产生的时候出现的问题,具体是如何产生的还不知道,有知道的请说一下
[ 本帖最后由 w00d 于 2012-3-5 15:00 编辑 ]
-
今天我发现是没有在ADCINTFLGCLR中进行清中断,但是我确实在服务函数中最后部分有清中断程序,具体为:
void fun(int a,int b)
{
.....
}
interrupt void isr(void)
{
.......
fun(a,b);
........
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE
}
然后我使用全局变量做了一个标志
Uint16 flag;
interrupt void isr(void)
{
flag=0;
.......
fun(a,b);
........
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE
flag=1;
}
这样就可以看看每次进入中断后有没有清中断。实验发现,即使不进入中断了flag也是1,也就是说确实是清了中断的,我再在CCS里面把ADCINTFLGCLR赋1,又可以进入中断了,但是程序跑了一会儿又不进中断了。
郁闷啊,也不知道是怎么回事。。。
-
感谢各位的回复。
CMD文件应该没有问题,我是拿的例子程序中给出的CMD,而且我也对照着datasheet中的RAM地址仔细看了CMD文件,没有问题。 我也认为是堆栈出的问题,但是并不是每次都会跑飞,很难抓到现场。另外,程序跑飞的现象表现为程序不能进入中断,主程序还是能跑的,其他中断也没有问题。 我的程序对实时性要求很高,只能在中断里面跑,不能做标志然后再主循环中跑。