中断的使用是否一定要进入LPM模式?
使用TI范例TA来做修改
int ta=0;
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= 0x01; // P1.0 output
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 50000;
TACTL = TASSEL_2 + MC_1; // SMCLK, upmode
// _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
if(ta == 10)
{
P1OUT ^= 0x01; // Toggle P1.0
ta = 0;
}
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
ta = ta+1;
}
(1)运行时发现TA动作,但没有进入中断
加入_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
(2)如进入LPM模式,则进入中断 ta 增加
但ta会远大于10,无法进入if回圈
求指教,谢谢
try:
while(1)
{
if(ta == 10)
{
P1OUT ^= 0x01; // Toggle P1.0
ta = 0;
}
}
我在launchpad 上式了下,看上去完全可以.
#include "io430.h"
int ta=0; //add volatile ??
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= 0x01; // P1.0 output
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 50000;
TACTL = TASSEL_2 + MC_1; // SMCLK, upmode
//ta=0;
asm ("EINT;"); /////////// Enter LPM0 w/ interrupt
while(1)
{
if(ta == 10)
{
P1OUT ^= 0x01; // Toggle P1.0
ta = 0;
}
}
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
ta = ta+1;
}
加入LPM0;后
出现Warning : CPU is OFF (Low Power Mode)
此时 ta = 1
现在明白了MSP430低功耗应用的程序模板了吧。
一般的MSP430中断程序范例是这样: 初始化后,进入低功耗,靠外部中断唤醒, 中断处理完后可以唤醒,唤醒后在主程序中处理,处理完继续休眠。
int ta=0;
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= 0x01; // P1.0 output
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 50000;
TACTL = TASSEL_2 + MC_1; // SMCLK, upmode
while(1)
{
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
if(ta == 100)
{
P1OUT ^= 0x01; // Toggle P1.0
ta = 0;
}
}
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
ta = ta+1;
LPM0_EXIT;
}