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.

MSP430F5438A进入低功耗模式LPM3 RTC时钟无法唤醒的问题

最近在做一个低功耗项目  定时启动处理一些事情 然后休眠  最近发现设备会发生不唤醒的情况(没有规律性)。 经过多次试验以及加入了一些调试代码  现在锁定为休眠后没有唤醒  相关代码如下:

休眠的代码:

void power_consumption(void)    
{
    //************低功耗处理********************************************************
    #if DEBUG2
    Run_log5 = 10;
    #endif
    WDTCTL = WDTPW + WDTHOLD;   // 关闭看门狗
    activate_way = 0;   //休眠时激活方式清零
    //__delay_cycles(500);
    P1SEL = 0x00;
    P2SEL = 0x00;
    P3SEL = 0x00;
    P4SEL = 0x00;
    P5SEL = 0x00;
    P6SEL = 0x00;
    P7SEL = 0x00;
    P8SEL = 0x00;
    P9SEL = 0x00;
    P10SEL = 0x00;
    P11SEL = 0x00;//设置所有IO为普通IO口
    
    P1DIR = 0xFF;
    P2DIR = 0xFF;
    P3DIR = 0xFF;
    P4DIR = 0xFF;
    P5DIR = 0xFF;
    P6DIR = 0xFF;
    P7DIR = 0xFF;
    P8DIR = 0xFF;
    P9DIR = 0xFF;
    P10DIR = 0xFF;
    P11DIR = 0xFF;
    PJDIR = 0xFF;//设置所有IO为输出状态(个别控制IO除外)
    
    P1OUT = 0x08;
    P2OUT = 0x00;
    P3OUT = 0x00;
    P4OUT = 0x00;
    P5OUT = 0x00;
    P6OUT = 0x30;
    P7OUT = 0x00;
    P8OUT = 0x00;
    P9OUT = 0x00;
    P10OUT = 0x00;
    P11OUT = 0x00;
    PJOUT = 0x00;//设置所有IO输出为0(个别控制IO除外)
    EXT_INT_INIT;               // 开外部中断
    if(activate_status == '5' || activate_status == '1' || activate_status == '3')
    {
        ALARM_OFF;                // 关闭光敏中断
    }
    else
    {
        ALARM_ON;                 // 开启光敏中断
    }
    #if DEBUG2
    Run_log5 = 11;
    #endif
    RTCCTL01 &= ~RTCRDYIE; //关时钟读数报警
    #if DEBUG2
    Run_log5 = 12;
    #endif
    ADC12CTL0 &= ~ADC12ENC;
    UCSCTL6 |= XT2OFF;         // 关闭XT2振荡器
    UCSCTL6 |= XT1OFF;         // 关闭XT1振荡器
    __delay_cycles(1000);
    #if DEBUG2
    Run_log5 = 13;
    #endif
    #if DEBUG2
    Run_log11 = 2;
    #endif
    _BIS_SR(LPM3_bits + GIE);// 进入LPM3、开中断
    __no_operation();
    #if DEBUG2
    Run_log5 = 14;
    #endif
    #if DEBUG2
    Run_log11 = 1;
    #endif
//************低功耗处理完毕****************************************************
}

通过调试代码的抓取 确定程序已经执行Run_log11 = 2; 这一步,所以设备应该休眠了

RTC试用的内部32.768k晶振  闹钟模式  做的定时唤醒 

RTC中断函数

//-------------RTC中断----------------------------------------------------------
#pragma vector=RTC_VECTOR
__interrupt void RTC_ISR(void)
{
  switch(__even_in_range(RTCIV,16))
  {
    case 0:                                 // No interrupts
        #if DEBUG2
        Run_log7 = 1;
        #endif
        break;
    case 2:                                 // RTCRDYIFG
        #if DEBUG2
        Run_log7 = 2;
        #endif
        Read_time();
        run_time++;
        if(run_time > 60000)
        {
            run_time = 60000;
        }
        #if DEBUG2
        Run_log9 = run_time;
        #endif
        break;
    case 4:                                 // RTCEVIFG
        #if DEBUG2
        Run_log7 = 3;
        #endif
        break;
    case 6:                                 // RTCAIFG
        #if DEBUG2
        Run_log7 = 4;
        #endif
        RTCCTL01 &= ~RTCAIE;              //禁用RTC闹铃报警
        activate_way = 2;
        _BIC_SR_IRQ(LPM3_bits);					//退出低功耗
        break;
    case 8:                                 // RT0PSIFG
        #if DEBUG2
        Run_log7 = 5;
        #endif
        break;
    case 10:                                // RT1PSIFG
        #if DEBUG2
        Run_log7 = 6;
        #endif
        break;
    case 12:                                // Reserved
        #if DEBUG2
        Run_log7 = 7;
        #endif
        break;
    case 14:                                // Reserved
        #if DEBUG2
        Run_log7 = 8;
        #endif
        break;
    case 16:                                // Reserved
        #if DEBUG2
        Run_log7 = 9;
        #endif
        break;
    default: 
        #if DEBUG2
        Run_log7 = 10;
        #endif
        break;
  }
}

通过调试代码的抓取 证明程序已经执行到Run_log7 = 4;这一步 所以说闹钟中断已经产生且已进入到中断服务函数,奇怪的是设备没有被唤醒

时钟什么的配置应该是没问题的

首先不唤醒不是绝对的 只是有时候会出问题 而且是小部分

其次程序已经进入闹钟中断服务函数,说明休眠后时钟在工作且产生了闹钟中断,只是进入了闹钟中断后 执行退出低功耗模式没有生效

最后用在外部中断写错误看门狗密码可引起单片机复位重启(没有开启中断嵌套)可确定为 程序没有死在 闹钟中断里

  • 你的时钟怎么配置的?

    lpm3时只有ACLK可用可用

  • 时钟用的aclk 内部32.768K 

  • 时钟什么的配置应该是没问题的

    首先不唤醒不是绝对的 只是有时候会出问题 而且是小部分

    其次程序已经进入闹钟中断服务函数,说明休眠后时钟在工作且产生了闹钟中断,只是进入了闹钟中断后 执行退出低功耗模式没有生效

    最后用在外部中断写错误看门狗密码可引起单片机复位重启(没有开启中断嵌套)可确定为 程序没有死在 闹钟中断里

  • 把中断里_BIC_SR_IRQ(LPM3_bits); 换成__bic_SR_register_on_exit(LPM3_bits);  可能不一定这么写,要加on_exit,试试

  • 已经搞定   关闭XT2前没有切换时钟 会导致休眠后响应下时钟失效中断   而430勘误手册内有这样一处BUG 当进入低功耗模式后1us内 如果产生中断 则设备可能无法唤醒