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.

MSP430G2433时钟VLO低功耗LPM3时异常复位

Other Parts Discussed in Thread: MSP430G2433

 项目因为是电池供电,所以不可避免的要用到低功耗功能,选用的芯片是MSP430G2433。先声明一下,出于产品空间限制的原因,没有用到外接晶振。

因为要求定时检测电池电量,所以选用LPM3模式,这样就只有ACLK可以作为定时器的时钟源,而我用的ACLK时钟源来自VLO(貌似只有VLO可选)。

写了点简单的代码测试一下:

#include<msp430g2433.h>
#define LED_B BIT6 //BLUE LED (P2.6)
void main()
{
      WDTCTL = WDTPW + WDTHOLD;

      P2SEL &= ~BIT6;      //引脚复用
      P2DIR |= LED_B;
      P2OUT &= ~LED_B;

      BCSCTL3 |= LFXT1S_2;       //设置LFXT1Sx为10,VLO(12KHz)

      TACTL |= TASSEL_1 + MC_1 + ID_3;       //ACLK,UP Mode,1/8 devider(1500Hz)
      TA0CCTL0 |= CCIE;
      TA0CCR0 =1500/4;
      __bis_SR_register(LPM3_bits + GIE);
      while(1);
}
static unsigned int Timer0_A0_Counter =0;
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_A0()
{
      LPM3_EXIT;
      Timer0_A0_Counter ++;
      if(Timer0_A0_Counter ==2)
      {
            Timer0_A0_Counter =0;
            P2OUT ^=LED_B;
      }
      __bis_SR_register(LPM3_bits + GIE);
}

以上代码正常工作现象为:LED灯1S的周期闪烁。

可奇怪的是,闪大约32次后(不变的32次,如果改为4秒的周期,又变成闪16次复位),MCU就自动复位了。

然而如果我把代码改为不进入低功耗模式,就不会有这个问题。

  • Frankie Yang 说:

     项目因为是电池供电,所以不可避免的要用到低功耗功能,选用的芯片是MSP430G2433。先声明一下,出于产品空间限制的原因,没有用到外接晶振。

    因为要求定时检测电池电量,所以选用LPM3模式,这样就只有ACLK可以作为定时器的时钟源,而我用的ACLK时钟源来自VLO(貌似只有VLO可选)。

    写了点简单的代码测试一下:

    #include<msp430g2433.h>
    #define LED_B BIT6 //BLUE LED (P2.6)
    void main()
    {
          WDTCTL = WDTPW + WDTHOLD;

          P2SEL &= ~BIT6;      //引脚复用
          P2DIR |= LED_B;
          P2OUT &= ~LED_B;

          BCSCTL3 |= LFXT1S_2;       //设置LFXT1Sx为10,VLO(12KHz)

          TACTL |= TASSEL_1 + MC_1 + ID_3;       //ACLK,UP Mode,1/8 devider(1500Hz)
          TA0CCTL0 |= CCIE;
          TA0CCR0 =1500/4;
          __bis_SR_register(LPM3_bits + GIE);
          while(1);
    }
    static unsigned int Timer0_A0_Counter =0;
    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void Timer0_A0()
    {
          LPM3_EXIT;
          Timer0_A0_Counter ++;
          if(Timer0_A0_Counter ==2)
          {
                Timer0_A0_Counter =0;
                P2OUT ^=LED_B;
          }
          __bis_SR_register(LPM3_bits + GIE);
    }

    以上代码正常工作现象为:LED灯1S的周期闪烁。

    可奇怪的是,闪大约32次后(不变的32次,如果改为4秒的周期,又变成闪16次复位),MCU就自动复位了。

    然而如果我把代码改为不进入低功耗模式,就不会有这个问题。

    1. 你是如何判定MCU复位的

    2. VLO频率很不准,精确定时不建议用

  • 这段代码可能表现的不明确,下面这段代码相对更好:

    正常初始化时红灯会亮0.5S,之后关掉了,只剩蓝灯不停闪烁。

    但是出现红灯又亮了,就说明MCU复位了,这样就没问题了吧?

    其实我也不是想让它精确定时,我的本意是设置TA0CCR0=15000,让它10S中断一次,计数到4小时的时候就检测一次电池电量

    #include<msp430g2433.h>
    #define LED_R BIT0 //RED LED(P2.0)
    #define LED_B BIT6 //BLUE LED (P2.6)
    void main()
    {
          WDTCTL = WDTPW + WDTHOLD;

          P2SEL &= ~BIT6;       //引脚复用
          P2DIR |= (LED_R + LED_B);
          P2OUT |= (LED_R + LED_B);
          __delay_cycles(500000);
          P2OUT &= ~(LED_R + LED_B);

          BCSCTL3 |= LFXT1S_2; //设置LFXT1S为10,VLO

          TACTL |= TASSEL_1 + MC_1 + ID_3; //ACLK,UP Mode,1/8 devider(1500Hz)
          TA0CCTL0 |= CCIE;
          TA0CCR0 =1500;
          __bis_SR_register(LPM3_bits + GIE);
          while(1);
    }
    static unsigned int Timer0_A0_Counter =0;
    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void Timer0_A0()
    {
          LPM3_EXIT;
          Timer0_A0_Counter ++;
          if(Timer0_A0_Counter ==32)
          {
                Timer0_A0_Counter =0;
                P2OUT ^=LED_B;
          }
          __bis_SR_register(LPM3_bits + GIE);
    }

  • 供电稳定么?

    另外

    中断里不需要手动配置低功耗

    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void Timer0_A0()
    {
          Timer0_A0_Counter ++;
          if(Timer0_A0_Counter ==32)
          {
                Timer0_A0_Counter =0;
                P2OUT ^=LED_B;
          }
    }
  • 现在做实验,供电用的JTAG仿真器。

    中断里面部配置低功耗,原因是我怕它唤醒不稳定。之前做项目就有出现过,睡到LPM3或者LPM4的时候,唤醒要好几秒。但是在LPM2以上或者,在中断里配置低功耗就不会出问题。尴尬了宝宝

  • 我现在又做了个实验,去掉中断里面的低功耗配置代码后,就正常了,再加回去又出问题。

  • Frankie Yang 说:

    我现在又做了个实验,去掉中断里面的低功耗配置代码后,就正常了,再加回去又出问题。

    建议参考范例代码,从范例程序上改。