最近在做一个低功耗项目 定时启动处理一些事情 然后休眠 最近发现设备会发生不唤醒的情况(没有规律性)。 经过多次试验以及加入了一些调试代码 现在锁定为休眠后没有唤醒 相关代码如下:
休眠的代码:
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;这一步 所以说闹钟中断已经产生且已进入到中断服务函数,奇怪的是设备没有被唤醒
时钟什么的配置应该是没问题的
首先不唤醒不是绝对的 只是有时候会出问题 而且是小部分
其次程序已经进入闹钟中断服务函数,说明休眠后时钟在工作且产生了闹钟中断,只是进入了闹钟中断后 执行退出低功耗模式没有生效
最后用在外部中断写错误看门狗密码可引起单片机复位重启(没有开启中断嵌套)可确定为 程序没有死在 闹钟中断里