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