1)正常运行挺好,就是不能暂停,没法调试。
2)暂停后,老在两个时钟中断函数中运行,不能回到主函数。
3)主函数while的结束,用了LPM3, 就不能暂停了。如果不用LPM3,调试正常,暂停后可以回到主函数。
4)main函数第一句,关看门狗: WDTCTL = WDTPW + WDTHOLD; 应该不是看门狗的问题。
5)程序中有两个时钟中断,TA0 是1ms一次中断,是个毫秒的计数器:tim_num++;TB0是1秒一次中断,退出休眠:LPM3_EXIT
6)芯片: msp430f5310, 自己设计的板子。
IAR 5.40, 软件中的Product Info 是 “IAR Embedded Workbench Common components, version: 6.3.11.2079”
电脑是:Window XP
7)目前是测试阶段,我用这个芯片1年了。
8)怀疑: IAR bug,也可能是进中断后,把返回的地址覆盖了。也可能是暂停后TA0没停,所以老是不停的中断。
Sam Shen:
补充一下:
改变栈和堆的大小,没用。
看了栈的内容,发现暂停的时候:栈的数据错了。正常情况下,栈顶的地址:0x33FC,暂停后PC停止TA0中断末尾时,栈变为:0x3435 — 0x3404
Hardy Hu:
1.进入LPM3后,MCU的MACLK,SMACLK会关闭;
2.如果定时器的时钟源来自SMCLK,则会造成程序进LPM3后,定时器就不能正常计数,当然调试的时候就会出现使用SMCALK的程序运行异常;
Sam Shen:
回复 Hardy Hu:
谢谢回应。
1) Timer 的时钟都是TASSEL_1, 即ACLK,是外接的32K的晶振。LPM3时,ACLK 是不关闭的。另外,一直运行时,只要不暂停,是正确的,TmerA0 的毫秒计数器的计数值一直是对的,表明不是这个问题。
2) 感觉是IAR 的问题。另外,我用IAR 在中断函数中设断点,然后单步,或“跳出函数”,想停在跳出中断后的主函数的那个语句,怎么都不行。
Hardy Hu:
回复 Sam Shen:
IAR的汇编单步是不是跳到reset那里去了,如果是就说明程序不再受IAR控制。
user4248791:
回复 Hardy Hu:
我发现在IAR仿真430时,如果暂停仿真,timer和RTC的计数寄存器会自动增加,等你单步跳出中断执行函数的时候,新的中断标识又产生了,所以你看到的是一直处于中断执行函数里面跳不出来。我的IAR是7.5版本,好像低版本的不会有这个问题。
Hao Mengzhen:
回复 Sam Shen:
有没有尝试使用CCS进行debug呢?这样可以看是不是仿真软件的问题
灰小子:
回复 user4248791:
仿真和实物还是有差距的,有条件建议还是在实物上验证