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.

MSP430在中断函数中执行LPM0,程序锁死

#include "msp430x14x.h"
#include "config.h"
void init();
int main()
{
  WDTCTL = WDTPW + WDTHOLD;
  init();
  _eint();
    while(1) ;
 }
void init()
{
  p6sel=0x00;
  p6dir=0xff;
  p6out=~0x01;
  p6out=0xff;

  p1sel=0x00;
  p1dir=0x00;
  p1ies=0xff;
  p1ie=0x0f;
  p1ifg=0x00;
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
   switch(p1ifg&0x0f)
   {
      case 0x01:  p6out=~0x01; fig=1;  break;    
      case 0x02:  p6out=~0x02; break;    
      case 0x04:  p6out=~0x04; break;    
      case 0x08:  p6out=~0x08;  lpm0_exit; break;  
      
   }
   p1ifg=0x00;
}

此程序原目的是按下第一个按键进进入中断执行LPM0
                            按下第四个按键进入中断执行LPM0_EXIT
但是按下第一个后程序,程序就不动了,按第四个无法退出低功耗模式。无论如何按P6的灯都不会变化。
一个好心网友帮我解决程序如下
#include "msp430x14x.h"
#include "config.h"
unsigned char fig=0;
void init();
int main()
{
  WDTCTL = WDTPW + WDTHOLD;
  init();
  _eint();
  lpm0;
  while(1)
  {
if(fig==1)
{
lpm0;
fig=0;
}
    p6out=0xff;
    delay(50);
    p6out=0x00;
    delay(50);
  }
}
void init()
{
  p6sel=0x00;
  p6dir=0xff;
  p6out=~0x01;
  p6out=0xff;

  p1sel=0x00;
  p1dir=0x00;
  p1ies=0xff;
  p1ie=0x0f;
  p1ifg=0x00;
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
   switch(p1ifg&0x0f)
   {
      case 0x01:  p6out=~0x01; fig=1;  break;    
      case 0x02:  p6out=~0x02; break;    
      case 0x04:  p6out=~0x04; break;    
      case 0x08:  p6out=~0x08;  lpm0_exit; break;  
      
   }
   p1ifg=0x00;
}
程序编译烧录执行没有问题,他的解释是这样的
  进入中断前PC会被压入堆栈 jmp到中断服务函数执行完后才弹出PC
据需执行
进入功耗模式前PC也会被压入堆栈 知道退出低功耗模式才弹出据需执行
PC是指针
但不理解的是,LPMx设置的主要是SCG1 SCG0 OSCOFF CPUOFF这个几个寄存器这个寄存器在430应该
有固定的内存位置,不像函数里面的局部变量用完就没有了,及时我在中断中修改也是能生效的,所以我
最近一直在研究到是哪里的问题。
  • msp430一般是没有中断时进入低功耗状态,有中断发生时,从低功耗状态唤醒进入中断服务程序,执行完中断服务程序后重新进入低功耗。

     case 0x08:  p6out=~0x08;  lpm0_exit; break;    这段代码,本身就是在中断中执行,是运行状态,不用再 lpm0_exit退出低功耗状态的

  • 你好:

    你的第一个程序没有进入LPM0。

    主要区别就是在while里面处理完LED或者其他任务后一定要进入LPM0。

    然后在中断中退出LPM0,这样while才能循环起来。

    因为MSP430在LPMx中进入中断,如果不在中断中退出LPM,退出中断后MCU会自动再次进入之前的LPM中。

    另外MSP430的中断ISR中不需要用户自己去关中断和开中断,这两个事情编译器已经帮你做的。

    希望能够帮到你,谢谢!