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.

msp430g2553在低功耗模式3下用外部时钟做呼吸灯。

Other Parts Discussed in Thread: MSP430G2553

问题:

想要做一个呼吸灯,不过在进入低功耗模式3后,呼吸等会无法出来。
时钟都设置了ALCK采用外部低频晶振,为什么程序一运行到 __bis_SR_register(LPM3_bits + GIE);就没有呼吸灯了呢?

芯片:msp430g2553   20P

硬件:LaunchPad开发板

软件:IAR

程序代码:
#include <msp430g2553.h>
// *************************************************************
// 延时函数,对于1M主频,约延时1ms
// *************************************************************
void delay_1ms(void)
{
unsigned int k;
for (k=0;k<195;k++);
}

// *************************************************************
// 延时函数,延时n*ms
// *************************************************************
void delay_nms(unsigned int n)
{
unsigned int j;
for (j=0;j<n;j++)
{
delay_1ms();
}
}


int main(void)
{
unsigned const PWMperiod=1500;
volatile unsigned int i;
WDTCTL = WDTPW + WDTHOLD;                                      // Stop WDT
P1DIR |= 0x40;                                                                         // P1.6 output
P1SEL |= 0x40;                                                                        // P1.6 options  GPIO
CCR0 = PWMperiod;                                                              // PWM Period
CCTL1 = OUTMOD_7;                                                           // CCR1 reset/set
TACTL = TASSEL_1 + MC_1;                                               // ACLK, up mode

/************下面几句其实不加效果也一样,但是为了确定最优ACLK在工作所以全选ACLK了****/
BCSCTL3|=LFXT1S_0;                                                          //外部32768HZ
BCSCTL1&=~BIT6;                                                                 //XTS位清零ACLK选择低频晶振
BCSCTL2|=SELM_3;                                                              //MCLK选择LFXT1CLK
BCSCTL2|=BIT3;                                                                    //SMCLK选择LFXT1CLK
__bis_SR_register(LPM3_bits + GIE);
while(1)
{
CCR1=0;
for(i=0;i<=PWMperiod;i+=1)                                                  //渐亮
{
TACCR1=i;
delay_nms(4-(i/500));
}
for(i=PWMperiod;i>0;i-=1)                                                      //渐暗
{
TACCR1=i;
delay_nms(4-(i/500));
}
CCR1=0;
delay_nms(4-(i/500));
}
}


求救各路专家,在线等待

  • __bis_SR_register(LPM3_bits + GIE)执行之后,msp430就进入了低功耗模式,没有中断等唤醒,就不会再继续执行了。

    建议:

    方法一、去掉该句程序,不使用低功耗,用while(1)一值循环。

    方法二、不使用delay这种延时,使用定时器/比较器的PWM模式,定时把msp430从低功耗模式唤醒进行PWM操作

  • 谢谢你的回复~

    对于方法一:去掉该句是能运行,但实现不了低功耗了。

    对于方法二:由于这个做得是呼吸灯,本身已调用了定时器来做不同占空比输出的PWM,您的意思是再用一个定时去做延时么?

    同时,我不解的是,该段程序的运行不运行,不是只需要看使用了哪个时钟源么?调用了ACLK,在低功耗模式3的状态下不是有正常时钟的么,为什么程序不运行?

    难道低功耗模式3并不意味着调用ACLK就可以让程序跑起来?

    因为是新手,不是很了解这里面的原因,十分渴望得到解答,非常感谢,非常期待~!