430设置时钟为用XT2,在进入低功耗之前关闭XT2,退出低功耗后再打开XT2,但是最后打开XT2后的时间好像不对,要比进入低功耗之前要慢
HG:
但是最后打开XT2后的时间好像不对,要比进入低功耗之前要慢是啥意思?
一般开启晶振不建议用delay,用Clock_Init中的while,判断标志位,确保晶振打开了。
而且要不要关低速晶振跟进入低功耗的时间有关,如果低功耗里的时间短,就不建议频繁开关晶振了,省不了多少,开关过程本身要delay,也耗费功耗的。
SHUAIPENG HAN:
回复 HG:
如果我在退出低功耗之前再次初始化时钟的话,程序就乱掉了,比如说我按一个按键退出低功耗,在退出之前重新初始化时钟,退出低功耗在会后,就又重新开始了所有内容的初始化,也就是从关闭看门狗开始,重新运行了。不会向下运行
SHUAIPENG HAN:
回复 HG:
比进入低功耗之前要慢也就是说,如果在while里边写上一个LED闪烁的程序,在不进入低功耗之前是1s闪烁一次,退出低功耗后闪烁频率明显减小
SHUAIPENG HAN:
回复 HG:
比进入低功耗之前要慢也就是说,如果在while里边写上一个LED闪烁的程序,在不进入低功耗之前是1s闪烁一次,退出低功耗后闪烁频率明显减小,就好像是XT2没有打开
HG:
回复 SHUAIPENG HAN:
你的程序是在XT2的时基上执行的么?你进低功耗用的什么时钟?退出低功耗调用的什么函数,那段程序怎么写的?
SHUAIPENG HAN:
回复 HG:
是的,进低功耗的时候,关闭了XT2,退出低功耗时又打开了XT2,退出低功耗用__low_power_mode_off_on_exit();
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗Clock_Init(); //时钟初始化Led_Init(); //LED初始化TimerA_Init(); //定时器初始化KeyInit(); //按键初始化UART_Init(); //串口初始化_EINT(); //使能中断A7_Init(10); //A7初始化 GPRS_Init();BCSCTL1|=XT2OFF; //关闭XT2delay_ms(1);__low_power_mode_3(); //进入低功耗
这是初始化,初始化结束进入低功耗
#pragma vector = PORT1_VECTOR__interrupt void P1_IRQ(void){switch(P1IFG&0x0F){case 0x02: P1IFG=0x00;if((P1IN&BIT1)==0){ BCSCTL1&=~XT2OFF; //开启XT2Start_Flag=1;Recall_NUM=0; //重拨次数清空KeyValue=2;__low_power_mode_off_on_exit(); //退出低功耗 }break;
这是进入终端退出低功耗的程序
HG:
回复 SHUAIPENG HAN:
BCSCTL1&=~XT2OFF; //开启XT2
只有这一句话可能XT2没有开启成功你就出了低功耗了。
这个是XT2开启的标准流程。
不过我们不建议在中断里面阻塞While
可以置一个flag,再在主循环的while里面判断这个flag,再开启时钟。
SHUAIPENG HAN:
回复 HG:
我尝试过用Clock_Init();代替BCSCTL1&=~XT2OFF;结果是程序复位了,重新初始化,不知道哪里问题
HG:
回复 SHUAIPENG HAN:
有可能是晶振初始化失败。复位后自动启动内部1M DCO。这个时候时钟应该是变慢了
SHUAIPENG HAN:
回复 HG:
那应该怎么做呢?退出低功耗重新初始化时钟的话,程序整体就复位了