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.

请问MSP430F149可不可以利用PORT1的外部中断实现控制低功耗的开关



//说明:利用P1.5端口的中断功能,第一次进入中断,是系统进入低功耗LPM3;第二次进入中断,退出低功耗LPM3

int count = 0;  //记录进入中断次数
void main()
{

       WDTCTL = WDTPW + WDTHOLD;
        P1IFG &= ~BIT5;    //清除P1IFG
        P1IE |= BIT5;       //打开中断允许
        P1IES |= BIT5; //选择下降沿触发

       P4DIR |= BIT0;        //P4。0输出
       P4OUT |= BIT0;        //P4.0灯点亮

        while(1);
}

#pragma vector = PORT1_VECTOR
__interrupt void P1_5_ISR(void)
  {
if( ( P1IFG & BIT5) == BIT5 ) //中断响应
        {
            P1IFG &= ~BIT5; //清除中断标志
            count++;
           
            if(count== 1)        //第一次按下按键,进入低功耗
              {                 
                  LPM3;
                  P4OUT &= ~BIT0;       //流水灯关闭
              }
            else if(count== 2)   //第二次按下按键,退出低功耗
              {
                  LPM3_EXIT;
                  pedal_count = 0;
                  P4OUT |= BIT0;            //流水灯打开
              }
        }
}

问题是:第一次进入中断可以进入低功耗模式,灯灭;第二次时没响应,不知道怎么回事。
是第一次进入低功耗以后一直处在低功耗之中,P1.5端口不能输入了么?
对于低功耗不是很了解,上述程序写法是否有错,希望能人给予解答,万谢!!!!

  • 可以通过外部中断唤醒低功耗

  • #include"msp430.h"

    int count = 0; //记录进入中断次数
    unsigned char enter_lpm3_flag;
    void main()
    {

    WDTCTL = WDTPW + WDTHOLD;

    P1DIR &= ~BIT5;
    P1OUT |= BIT5;
    P1REN |= BIT5;
    P1IFG &= ~BIT5;
    P1IES |= BIT5;
    P1IE |= BIT5;

    P4DIR |= BIT0; //P4。0输出
    P4OUT |= BIT0; //P4.0灯点亮

    _EINT(); //开总中断

    while(1)
    {
    if(enter_lpm3_flag)
    __bis_SR_register(LPM3_bits);
    }
    }

    #pragma vector = PORT1_VECTOR
    __interrupt void P1_5_ISR(void)
    {
    if(P1IFG & BIT5) //中断响应
    {
    P1IFG &= ~BIT5; //清除中断标志
    count++;

    if(count== 1) //第一次按下按键,进入低功耗
    {
    P4OUT &= ~BIT0; //流水灯关闭
    enter_lpm3_flag = 1;

    }
    else if(count== 2) //第二次按下按键,退出低功耗
    {
    enter_lpm3_flag = 0;
    count = 0;
    P4OUT |= BIT0; //流水灯打开
    }
    }
    __low_power_mode_off_on_exit();
    }

    在中断里设置标志位,然后在主程序里进入低功耗

    在中断里退出低功耗

    需要开启总中断

    希望可以帮助到你

  • 我是想实现这样的效果:程序运行后,电机一直运转,当按下一次按键后,进入中断并进入低功耗LPM3模式,电机停止;
    再次按下按键后,进入中断退出低功耗LPM3模式,电机继续运转  (P4OUT可以认为是电机的开关)
    我按如上代码编写,可以进入低功耗模式,但按下第二次按键就没任何响应,是系统任然处在低功耗模式而没有进入中断?还是别的原因?

    我不想在主程序里进入低功耗,只是用外部中断的方法控制低功耗的开关

  • 请问如何通过外部中断唤醒低功耗???我想低功耗的开关都在外部中断里实现,这样可不可以?我贴的上述代码哪里出问题了?还望指点

  • 请问为什么不能在主程序里进入低功耗,有特殊考虑么?

    因为你在中断里进低功耗,程序就停在中断了,没有跳出来。所以响应不了你同一个IO口的再次中断。

    所以不建议在中断里进入低功耗, 建议试一下我的程序,可以实现你要的功能。

  • Ling Zhu ,您写的程序我试过了,单从您的程序来说,确实可以达到预期效果。但我的实际程序中while(1){}里面还有别的程序在运行。

    我实际想要的效果是,按键一下进入中断并进入低功耗,while(1)中程序暂停,等待下一次按键按下进入中断并退出低功耗,继续运行程序,按键只有一个。

    我看有的地方说是从LMP3模式下,唤醒进入中断服务程序后,SCG0仍然置位,DC发生器仍被关闭,MCLK不能正常运行
    需要清除SCG0控制位才行

    这个怎么理解?代码的话如何实现

  • 你好,

    1.MSP430在LPM3模式下是可以响应中断的,可以执行中断里的程序,执行程序的时候,MCU是在active状态,执行完之后退出中断,MCU又自动回到LPM3状态。

    2.我程序中那两句话 不影响你while(1)里面其他程序的运行。