This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

IAR Debug暂停后,跳不出中断

Other Parts Discussed in Thread: MSP430F5310

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没停,所以老是不停的中断。

  • 补充一下:

    改变栈和堆的大小,没用。

    看了栈的内容,发现暂停的时候:栈的数据错了。正常情况下,栈顶的地址:0x33FC,暂停后PC停止TA0中断末尾时,栈变为:0x3435 -- 0x3404    

  • 1.进入LPM3后,MCU的MACLK,SMACLK会关闭;

    2.如果定时器的时钟源来自SMCLK,则会造成程序进LPM3后,定时器就不能正常计数,当然调试的时候就会出现使用SMCALK的程序运行异常;

  • 谢谢回应。

    1) Timer 的时钟都是TASSEL_1, 即ACLK,是外接的32K的晶振。LPM3时,ACLK 是不关闭的。另外,一直运行时,只要不暂停,是正确的,TmerA0 的毫秒计数器的计数值一直是对的,表明不是这个问题。

    2) 感觉是IAR 的问题。另外,我用IAR 在中断函数中设断点,然后单步,或“跳出函数”,想停在跳出中断后的主函数的那个语句,怎么都不行。

  • IAR的汇编单步是不是跳到reset那里去了,如果是就说明程序不再受IAR控制。

  • 我发现在IAR仿真430时,如果暂停仿真,timer和RTC的计数寄存器会自动增加,等你单步跳出中断执行函数的时候,新的中断标识又产生了,所以你看到的是一直处于中断执行函数里面跳不出来。我的IAR是7.5版本,好像低版本的不会有这个问题。
  • 有没有尝试使用CCS进行debug呢?这样可以看是不是仿真软件的问题
  • 仿真和实物还是有差距的,有条件建议还是在实物上验证