最近在做一个低功耗项目 定时启动处理一些事情 然后休眠 最近发现设备会发生不唤醒的情况(没有规律性)。 经过多次试验以及加入了一些调试代码 现在锁定为休眠后没有唤醒 相关代码如下:
休眠的代码:
void power_consumption(void) {//************低功耗处理********************************************************#if DEBUG2Run_log5 = 10;#endifWDTCTL = 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 DEBUG2Run_log5 = 11;#endifRTCCTL01 &= ~RTCRDYIE; //关时钟读数报警#if DEBUG2Run_log5 = 12;#endifADC12CTL0 &= ~ADC12ENC;UCSCTL6 |= XT2OFF;// 关闭XT2振荡器UCSCTL6 |= XT1OFF;// 关闭XT1振荡器__delay_cycles(1000);#if DEBUG2Run_log5 = 13;#endif#if DEBUG2Run_log11 = 2;#endif_BIS_SR(LPM3_bits + GIE);// 进入LPM3、开中断__no_operation();#if DEBUG2Run_log5 = 14;#endif#if DEBUG2Run_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 DEBUG2Run_log7 = 1;#endifbreak;case 2:// RTCRDYIFG#if DEBUG2Run_log7 = 2;#endifRead_time();run_time++;if(run_time > 60000){run_time = 60000;}#if DEBUG2Run_log9 = run_time;#endifbreak;case 4:// RTCEVIFG#if DEBUG2Run_log7 = 3;#endifbreak;case 6:// RTCAIFG#if DEBUG2Run_log7 = 4;#endifRTCCTL01 &= ~RTCAIE;//禁用RTC闹铃报警activate_way = 2;_BIC_SR_IRQ(LPM3_bits); //退出低功耗break;case 8:// RT0PSIFG#if DEBUG2Run_log7 = 5;#endifbreak;case 10:// RT1PSIFG#if DEBUG2Run_log7 = 6;#endifbreak;case 12:// Reserved#if DEBUG2Run_log7 = 7;#endifbreak;case 14:// Reserved#if DEBUG2Run_log7 = 8;#endifbreak;case 16:// Reserved#if DEBUG2Run_log7 = 9;#endifbreak;default:#if DEBUG2Run_log7 = 10;#endifbreak;} }
通过调试代码的抓取 证明程序已经执行到Run_log7 = 4;这一步 所以说闹钟中断已经产生且已进入到中断服务函数,奇怪的是设备没有被唤醒
时钟什么的配置应该是没问题的
首先不唤醒不是绝对的 只是有时候会出问题 而且是小部分
其次程序已经进入闹钟中断服务函数,说明休眠后时钟在工作且产生了闹钟中断,只是进入了闹钟中断后 执行退出低功耗模式没有生效
最后用在外部中断写错误看门狗密码可引起单片机复位重启(没有开启中断嵌套)可确定为 程序没有死在 闹钟中断里
灰小子:
你的时钟怎么配置的?
lpm3时只有ACLK可用可用
HUI LIU11:
回复 灰小子:
时钟用的aclk 内部32.768K
HUI LIU11:
回复 灰小子:
时钟什么的配置应该是没问题的
首先不唤醒不是绝对的 只是有时候会出问题 而且是小部分
其次程序已经进入闹钟中断服务函数,说明休眠后时钟在工作且产生了闹钟中断,只是进入了闹钟中断后 执行退出低功耗模式没有生效
最后用在外部中断写错误看门狗密码可引起单片机复位重启(没有开启中断嵌套)可确定为 程序没有死在 闹钟中断里
HG:
把中断里_BIC_SR_IRQ(LPM3_bits); 换成__bic_SR_register_on_exit(LPM3_bits); 可能不一定这么写,要加on_exit,试试