//说明:利用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端口不能输入了么?
对于低功耗不是很了解,上述程序写法是否有错,希望能人给予解答,万谢!!!!
wszqq:
可以通过外部中断唤醒低功耗
Ling Zhu2:
#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();}
在中断里设置标志位,然后在主程序里进入低功耗
在中断里退出低功耗
需要开启总中断
希望可以帮助到你
Ant Lou:
回复 Ling Zhu2:
我是想实现这样的效果:程序运行后,电机一直运转,当按下一次按键后,进入中断并进入低功耗LPM3模式,电机停止;再次按下按键后,进入中断退出低功耗LPM3模式,电机继续运转 (P4OUT可以认为是电机的开关)我按如上代码编写,可以进入低功耗模式,但按下第二次按键就没任何响应,是系统任然处在低功耗模式而没有进入中断?还是别的原因?
我不想在主程序里进入低功耗,只是用外部中断的方法控制低功耗的开关
Ant Lou:
回复 wszqq:
请问如何通过外部中断唤醒低功耗???我想低功耗的开关都在外部中断里实现,这样可不可以?我贴的上述代码哪里出问题了?还望指点
Ling Zhu2:
回复 Ant Lou:
请问为什么不能在主程序里进入低功耗,有特殊考虑么?
因为你在中断里进低功耗,程序就停在中断了,没有跳出来。所以响应不了你同一个IO口的再次中断。
所以不建议在中断里进入低功耗, 建议试一下我的程序,可以实现你要的功能。
Ant Lou:
回复 Ling Zhu2:
Ling Zhu ,您写的程序我试过了,单从您的程序来说,确实可以达到预期效果。但我的实际程序中while(1){}里面还有别的程序在运行。
我实际想要的效果是,按键一下进入中断并进入低功耗,while(1)中程序暂停,等待下一次按键按下进入中断并退出低功耗,继续运行程序,按键只有一个。
我看有的地方说是从LMP3模式下,唤醒进入中断服务程序后,SCG0仍然置位,DC发生器仍被关闭,MCLK不能正常运行需要清除SCG0控制位才行
这个怎么理解?代码的话如何实现
Ant Lou:
回复 Ling Zhu2:
谢谢回答