TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430无法进入低功耗LPM3

本人正在做基于MSP430的低功耗项目,配合CC1101无线模块。CC1101通过IO口模拟跟CPU连接。为了降低功耗,通过无线模块接收到数据,触发CPU的外部中断来唤醒CPU

现在遇到的问题是,通过IAR调试查看寄存器状态看到 CPUOFF=1,SCG0=1,SCG1=1, OscOFF=0,手册上说前三者为1的时候即使LPM3模式,但是实际测得系统在休眠状态的电流15mA,判断并未真正进入低功耗,反而发现当数据发送完毕刹那检测到系统电流是1mA,不知道问题出在哪里。附上程序:

 

main()

{

   INT8U i, Dataleng = 7;       // 8字节

   unsigned char chksum;   //CRC校验和

           

   WDTCTL = WDTPW + WDTHOLD; //禁止看门狗

   InitSys();

   halSpiInit();

   InitTimeA();

   _EINT();                //打开总中断

   P3OUT |=(BIT4+BIT5+BIT6+BIT7);

   ReadClientAddress();     //确定下位机地址编码

   TestBuf[0]=ClientAddress;

   RF1100_IO_set();         //CC1101初始化

   SysTmie = 0;

   while(SysTmie < 10);

   POWER_UP_RESET_CC1100();

   SysTmie = 0;

   while(SysTmie < 50);

   halRfWriteRfSettings();

   halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);

  setRxMode();

   while(1)

   { SysTmie = 0;

     switch(DeviceStep)

     {     

       case 0:    {        //步骤0,数据接收

         if(halRfReceivePacket(RxBuf,&Dataleng)) {      //判断是否接收到数据

           DeviceStep = 1;}

        break; }

       case 1: {      //步骤1,数据校验

         if(RxBuf[2]==ClientAddress){        // 判断指令地址和药框号是否匹配 

             GreenLedTwinkle(2);

             DeviceStep = 2; }                 //指令地址和药框号匹配,顺序进入下个步骤

         else  {

             DeviceStep = 0;}

         break; }

       

       case 2:   {  //步骤2,数据处理,闪灯

           for(i=0;i<7;i++)  {      

           TxBuf[i] = RxBuf[i];  }   //填充数据

         if(RxBuf[5]==0xC0||RxBuf[5]==0xC8)

         {  GreenLedTwinkle(16); }    //需要保留

         if(RxBuf[5]==0x40||RxBuf[5]==0x48)

         {

           RedLedTwinkle(16);  }   //需要保留

         DeviceStep = 3;

         break; }

       case 3:   {  //步骤3,数据回传

         Delay_1ms(5);//延迟

         halRfSendPacket(TxBuf,7);

         DeviceStep = 4;

         setRxMode();

         CC1101_InitWOR(2200);

         break;  }

       case 4:   { //步骤4,进入低功耗模式

         P2SEL &=~ BIT5; //选择P2.5口  // GDO2(P2.5) 配置P2.5口接收中断来唤醒MCU

         P2DIR &=~ BIT5; //配置P2.5口为输入

         P2IES |= BIT5; //下降沿触发

         P2IE |= BIT5;   //P2.5中断使能

         P2IFG &= ~BIT5; //中断标志位清零

         GreenLedTwinkle(16);   //进入低功耗模式前绿灯闪烁提示

         _BIS_SR(LPM3_bits + GIE);   //MCU进入LPM3低功耗模式

         DeviceStep = 0;

         break;   }

     }

     while(SysTmie < 15);

   }

}

//===============================GDO0中断唤醒MCU=============================//

#pragma vector = PORT2_VECTOR

__interrupt void GDO_2()

{

if(P2IFG&BIT5)   {              //如果P2.5口触发中断

_DINT(); // 关闭中断响应

LPM3_EXIT;

DeviceStep = 0;  

}

P2IFG &= ~BIT5; //清除P2.5引脚中断标志位

SysTmie = 0;

_EINT();

}

void InitTimeA(void)   // Timer_A初始化

{

CCR0 = 500; // 需要延时的时间 CCR0为TACCR0

TACTL |= TASSEL_2 + ID_3 + TAIE; // Timer_A的时钟源为SMCLK,8分频(对于定时器的设置还有待考虑 2015-03-22 21:44)

TACTL |= MC_1; // Timer_A定时模式选择UP,定时器从0递增到TACCR0的值后触发中断,然后重新从0递增

}

#pragma vector=TIMERA1_VECTOR   // 定时器A中断处理函数

__interrupt void Intimer_A(void)

{

TACTL &= ~BIT0; // 清除中断标志位

SysTmie++;

}

灰小子:

未使用的io你是如何设置的?

可以参考这个帖子e2echina.ti.com/…/24347

Susan Yang:

建议您将MSP430和CC1101分开来进行测试。单独使用MSP430的时候是否可以正常进入LPM3?

赞(0)
未经允许不得转载:TI中文支持网 » MSP430无法进入低功耗LPM3
分享到: 更多 (0)