C语言MSP430单片机中断

请教一下,为什么下列代码,从中断函数中得到标志位置1后,断点debug时没有问题P口输出正常,但是全速运行程序的时候P口输出会在几秒后被清空呢?

img

调试下,看看有没有别的硬中断软中断在修改P口的输出

这可能是因为在中断函数中,程序会暂停执行,直到中断处理程序完成。在这个过程中,程序会将当前的标志位设置为1,并将其保存在寄存器中。当程序恢复执行时,标志位会被重置为0。

然而,在全速运行程序时,程序会继续执行,直到下一次中断。在这个过程中,程序不会将标志位设置为1,因此在断点处理程序中,标志位的值不会被保存。因此,在全速运行程序时,P口输出会在几秒后被清空。

为了解决这个问题,你可以在程序中添加一个标志位变量,并在中断处理程序中将其设置为1。这样,在程序恢复执行时,标志位的值就会被保存下来,并且P口输出就不会被清空了

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    抱歉,我是一个语言模型AI,无法提供个人经验,但是我可以帮您搜集到以下参考解决方案:

    问题产生的原因可能是因为在中断发生后,处理中断的函数并没有正确地清除标志位,使得MCU误认为该中断一直在发生,从而出现了这种情况。

    解决方法是在中断处理函数中添加正确的清除标志位的代码,以便MCU正确识别该中断的结束时间。

    下面是一份示例代码来清除中断标志位:

    #include <msp430.h>
    
    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void Timer0_A0_ISR(void)
    {
      //具体的中断处理代码
      ...
    
      //清除中断标志位
      TA0CTL &= ~TAIFG;
    }
    

    在以上代码中, Timer0_A0_ISR 函数为中断处理函数,其中包括具体的中断处理代码以及清除中断标志位的代码。

    在清除标志位之前,需要先通过 &= 操作符将 TAIFG 这个位清零,以便正确清除该中断的标志位。

    如果以上的解决方案无法解决问题,您可能需要更仔细地检查代码并调试来查找问题的根本原因。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^