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

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

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

休眠的代码:

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,试试

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F5438A进入低功耗模式LPM3 RTC时钟无法唤醒的问题
分享到: 更多 (0)