下面程序中MSP430F149是如何一直保持在低功耗模式的
#include<msp430x14x.h>voidmain(void){WDTCTL=WDTPW+WDTHOLD;//StopWDTP6DIR|=BIT2;P6OUT|...
#include <msp430x14x.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P6DIR |= BIT2;P6OUT |= BIT2; //关电平转换
P3DIR |= BIT4; // P3.4 output
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 50000;
TACTL = TASSEL_2 + MC_2; // SMCLK, contmode
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P3OUT ^= BIT4; // Toggle P3.4
CCR0 += 50000; // Add Offset to CCR0
} 展开
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P6DIR |= BIT2;P6OUT |= BIT2; //关电平转换
P3DIR |= BIT4; // P3.4 output
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 50000;
TACTL = TASSEL_2 + MC_2; // SMCLK, contmode
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P3OUT ^= BIT4; // Toggle P3.4
CCR0 += 50000; // Add Offset to CCR0
} 展开
展开全部
系统开启中断服务,外设都处于关闭状态,只有timer维持看门狗运行,timer溢出触发中断,中断服务中重置了timer,整个系统绝大多数时间只有一个定时器在运行,所以低功耗。
追问
系统执行到这条语句_BIS_SR(LPM0_bits + GIE)后进入低功耗模式,但当 Timer A 中断后不就退出了低功耗模式吗?中断后返回原地址执行,但_BIS_SR(LPM0_bits + GIE)语句后面已经没有指令了,那这个地址是哪里?
追答
中断服务的理念是中断返回后系统恢复原状态,中断退出后当然又回到低功耗模式。中断中的CCR0 += 50000; 相当于重载定时器,用+=而不是直接=赋值,是因为中断服务花了时间,而这时的定时器并没闲着,它也正好从0开始记下了中断服务花费的时间,这样累加就保持时间的同步,避免了中断造成的时间误差。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询