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.

请教MSP430F149在不同时钟下进入LPM3后的功耗问题



测试1: 系统时钟使用XT2(8M),然后使单片机进入LPM3模式,测试功耗

测试2: 系统时钟默认为DCO时钟,然后使单片机进入LPM3模式,测试功耗

两种情况下,除时钟设置部分的代码不同,其它代码完全相同,但测得的功耗却相差很大,在我的板子上测试1是40μA,测试2的功耗是170μA,相差了130μA,请问这是正常的吗?LPM3模式下的功耗与使用的时钟有关?

望指点!

============测试 1 的代码如下:=======================================

void main()
{
    int i;

    WDTCTL = WDTPW + WDTHOLD;

    BCSCTL1&=~XT2OFF;
    do {
            IFG1 &= ~OFIFG;
            for (i = 0xFF; i > 0; i--);
    }
    while ((IFG1 & OFIFG) != 0);

    //MCLK=XT2=8MHz SMCLK=XT2/8=1MHz
    BCSCTL2 |= SELM_2 + SELS + DIVS_3;

    P1DIR = 0xFF;      // All P1.x outputs
    P1OUT = 0;           // All P1.x reset
    P2DIR = 0xFF;      // All P2.x outputs
    P2OUT = BIT1;     // All P2.x reset
    P3DIR = 0xFF;      // All P3.x outputs
    P3OUT = 0;           // All P3.x reset
    P4DIR = 0xFF;      // All P4.x outputs
    P4OUT = 0;           // All P4.x reset
    P5DIR = 0xFF;      // All P5.x outputs
    P5OUT = 0;           // All P5.x reset
    P6DIR = 0xFF;      // All P6.x outputs
    P6OUT = 0;

    while(1)
    {
            _BIS_SR(LPM3_bits + GIE);    // Enter LPM3
           _NOP();
    }
}

============测试 2 的代码如下:=======================================

int main(void)
{
    WDTCTL = WDTPW + WDTHOLD;

    P1DIR = 0xFF;     // All P1.x outputs
    P1OUT = 0;          // All P1.x reset
    P2DIR = 0xFF;     // All P2.x outputs
    P2OUT = BIT1;    // All P2.x reset
    P3DIR = 0xFF;     // All P3.x outputs
    P3OUT = 0;          // All P3.x reset
    P4DIR = 0xFF;     // All P4.x outputs
    P4OUT = 0;          // All P4.x reset
    P5DIR = 0xFF;     // All P5.x outputs
    P5OUT = 0;          // All P5.x reset
    P6DIR = 0xFF;     // All P6.x outputs
    P6OUT = 0;

    while(1)
    {
        _BIS_SR(LPM3_bits + GIE);     // Enter LPM3 
       _NOP();
    }
}

  • 帖子沉了,没人回答啊。

    将板子的外围芯片都卸下后,再次测试功耗,在时钟为8M时进入LPM3电流大概130μA左右, 默认DCO时钟时进入LPM3则只有3μA左右,板子上电源芯片耗电约2μA左右,看来8M时钟时LPM3还是比较耗电,只是不知道原因为何,TI的老大们,给解释下原因呗?

  • 在LPM3下,MCLK是不工作的,只有ACLK工作,那么为何在上面两种时钟下进入LPM3功耗还会有差别呢?

  • 您试试在进入LPM3之前用程序将XT2关闭.

    唤醒后再打开XT2,这里最好给点延时让其稳定下来。

  • 你提供的方式我测试过,确实可是可行的,这也是我最后选定的方案。

    只是对于为什么不同的时钟模式下进入LPM3功耗会有所不同而且会差那么多不理解。

    也许是我对LPM3的理解有问题吧,感谢楼上的回答。

  • 因为你没理解LPM3的“定义”。 LPM3在底层点执行语句是  _BIS_SR(LPM3_bits) 

    而#define LPM3_bits           (SCG1+SCG0+CPUOFF)

    你再看下这几个位的作用,这些位只关乎DCO,也就是时钟来自DCO的时候,这个LPM3才有其真正“物理意义”。

    举例:如果你的SMCLK来自XT2(外部高频晶振),进入LPM3根本就不会关掉外部高频晶振,你的电流自然也无法达到数据手册内的“标称”值。

    其实,个人觉得这个和TI的用户指南没讲清楚有关系,所以新手常会因此而误解。

  • 感觉楼上的说的正确。

    有两个问题想请教一下:

    1. 我的程序使用P1端口中断方式实现按键,如果程序已经进入LPM3,那么当有按键按下时,程序会进入P1口的中断程序,在中断程序内,如果我需要10ms延时应该怎么实现呢? 此时由于还没有退出LPM3,所以主时钟依然是关闭的。 只能使用定时器?

    2. 我的程序使用了XT2和DCO两个时钟,切换过程如下:

           while(1)   {

                        Switch_to_XT2();    //切换到XT2, MCLK = XT2 = 8MHz

                         DoWork();                //功能代码

                         Switch_to_DCO();  //切换到DCO, MCLK=DCO, 此处只是为了让程序进入LPM3模式后电量消耗最低

                         LPM3();                     //进入LPM3

           }      

    退出LPM3的方式有两种,一个是当有按键时,在按键的中断处理中退出LPM3,再有就是在TA0定时中断处理中退出LPM3 ,但是我测试发现,从LPM3退出后,时钟有时是不准确的,从LPM3退出后会执行Switch_to_XT2(),在DoWork中系统的时钟就应该是MCLK=8M, 但测试结果是时钟似乎还是DCO, 这个只是猜测,现象是2秒的延时实际延时了十多秒。 我想还是我的代码什么地方有问题,请帮忙分析一下,下面附上 函数Switch_to_XT2及  Switch_to_DCO的代码。

    void Switch_to_XT2(void)
    {
              int i;

              BCSCTL1&=~XT2OFF; /* 打开XT2振荡器 */
              do {
                      IFG1 &= ~OFIFG; /* 清除振荡器失效标志 */
                      for (i = 0xFF; i > 0; i--); /* 延时,等待XT2起振 */
              } while ((IFG1 & OFIFG) != 0);


              BCSCTL2 |= SELM_2 +  SELS + DIVS_3;      /* MCLK=XT2 =8MHz  SMCLK=XT2/8=1MHz*/
    }

    void Switch_to_DCO(void)
    {
              int i;

              BCSCTL1 = XT2OFF + RSEL2;
              DCOCTL  = DCO2;
              do {
                     IFG1&=~OFIFG;
                     for(i=0;i<255;i++);
              } while((IFG1&OFIFG)!=0);

              BCSCTL2 = SELM_0;
    }

  • tian liu,

    关于你的疑问,具体信息如下:

    tian liu 说:
    1. 我的程序使用P1端口中断方式实现按键,如果程序已经进入LPM3,那么当有按键按下时,程序会进入P1口的中断程序,在中断程序内,如果我需要10ms延时应该怎么实现呢? 此时由于还没有退出LPM3,所以主时钟依然是关闭的。 只能使用定时器?

    Lina: 当来中断,进入中断处理函数时,CPU已经被唤醒了,此时的主时钟是Active的。要实现延时的话,可以使用__delay_cycles(x);但是不建议这么做,一般而言,建议中断处理函数越短越好!置个标志位,然后在主程序中查询标志,然后加其他程序。

    tian liu 说:
    从LPM3退出后,时钟有时是不准确的,从LPM3退出后会执行Switch_to_XT2(),在DoWork中系统的时钟就应该是MCLK=8M, 但测试结果是时钟似乎还是DCO, 这个只是猜测,现象是2秒的延时实际延时了十多秒。 我想还是我的代码什么地方有问题,请帮忙分析一下,下面附上 函数Switch_to_XT2及  Switch_to_DCO的代码。

    Lina:我看了你对应的程序,Switch_to_XT2()没有问题,如果执行后,发现结果不对,还是DCO,建议你在线看看对应寄存器,看看对应寄存器值对不对。关于Switch_to_DCO(), 操作顺序不太合适,一般建议:先将主时钟MCLK和SMCLK切换到DCO后,再关闭XT2,负责存在一定的风险关不掉XT2,因为在尝试关时,MCLK,SMCLK还在用。


    BR,

    Lina

  • 非常感谢lina的回答。

    Lina Lian 说:
    Lina: 当来中断,进入中断处理函数时,CPU已经被唤醒了,此时的主时钟是Active的。要实现延时的话,可以使用__delay_cycles(x);但是不建议这么做,一般而言,建议中断处理函数越短越好!置个标志位,然后在主程序中查询标志,然后加其他程序。

    假设进入中断前程序处于LPM3,如果进入中断 CPU被唤醒,那此时的主时钟是进入LPM3前设定的时钟吗?另外,当程序退出中断处理时,由于没有执行LPM3_Exit,程序还将保持LPM3状态,CPU将再次关闭,这样理解正确吗?

    Lina Lian 说:
    Lina:我看了你对应的程序,Switch_to_XT2()没有问题,如果执行后,发现结果不对,还是DCO,建议你在线看看对应寄存器,看看对应寄存器值对不对。关于Switch_to_DCO(), 操作顺序不太合适,一般建议:先将主时钟MCLK和SMCLK切换到DCO后,再关闭XT2,负责存在一定的风险关不掉XT2,因为在尝试关时,MCLK,SMCLK还在用。

    根据你的建议,对Switch_to_DCO的代码进行了修改,如下:

    void Switch_to_DCO( )
    {

             BCSCTL1 |= RSEL2;
             DCOCTL = DCO2;
             BCSCTL2   =  0;  // MCLK = SMCLK = DCO
             BCSCTL1  |=  XT2OFF;    // 关闭XT2
    }

    不知这样修改是否正确,请指教。

  • tian liu,

    tian liu 说:
    假设进入中断前程序处于LPM3,如果进入中断 CPU被唤醒,那此时的主时钟是进入LPM3前设定的时钟吗?另外,当程序退出中断处理时,由于没有执行LPM3_Exit,程序还将保持LPM3状态,CPU将再次关闭,这样理解正确吗?

    你的理解是完全正确的。LPM3下,中断唤醒CPU, MCLK active, 系统时钟均是保持进入LPM3的设置。退出中断前,没有执行LPM3_Exit的话,还保持进入中断前的状态,LPM3.典型用法示意如下:

    while(1)

    {

    LPM3;

    Code_1;

    }

    interrupt_handler()

    {

    ......

    LPM3_EXIT;

    }

    tian liu 说:
    BCSCTL1 |= RSEL2;
             DCOCTL = DCO2;

    关于Switch_to_DCO()的更改,上面两句代码是在设置DCO的频率吗?先设置好DCO频率,后将系统时钟切换过来,再关闭XT2.这个操作是正确的。

    BR,

    Lina


  • 感谢Lina细致的解答。

    对于MSP430我是一个新手,n年前做过一段时间的硬件开发,当时用的是51系列,后来改行做PC上的软件开发至今,只是最近闲暇时间较多,出于兴趣想学一学MSP430,所以算是一个菜鸟了。和n年前相比,现在搞单片机的朋友真的很幸福,因为有网络,不会的问题可以向别人请教,而且也有很多热心的朋友提供无私的帮助,我做单片机那会儿没有这么好。

    很欣赏你对各种问题的回复,很细致,不厌其烦,以后有问题还会来这里请教。

    预祝:春节快乐,阖家幸福!

    Liu Tian

  • tian liu,

    非常感谢您的TI的支持!后续如果在实际项目中使用的话,建议不要选用MSP430F1xx系列,之后F1xx系列由于工艺太老,会不生产,目前货源较少且价格很高。故作为学习可以,但是新项目的话,建议选用其他MSP430G2xx或者其他MSP430系列,会更合适。

    BR,

    Lina

  • Lina Lian 说:
    非常感谢您的TI的支持!后续如果在实际项目中使用的话,建议不要选用MSP430F1xx系列,之后F1xx系列由于工艺太老,会不生产,目前货源较少且价格很高。故作为学习可以,但是新项目的话,建议选用其他MSP430G2xx或者其他MSP430系列,会更合适。

    好的,Lina, 非常感谢!!

  • 功耗的高低是和供电电压,cpu主频由直接关系的。电压越低,频率越低,功耗越小。一般情况下低功耗后,时钟都换到外部低频晶振了,一般用32K。你测试的结果趋向是对的。但是具体数字无法核实。