每次进入standby时程序就会卡在RTC_WaitForLastTask函数中
LSI初始化函数:
```c
u8 RTC_Init(void)
{
//检查是不是第一次配置时钟
u8 temp=0;
u8 RCC_FLAG=0;
RTC_Configuration();
if (BKP_ReadBackupRegister(BKP_DR1) != 0X50C0) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
{
BKP_DeInit(); //复位备份区域
RCC_LSICmd(ENABLE);//使能LSI
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
{
temp++;
//delay_ms(10);
user_delay_ms(10);
if(temp>=250)
RCC_FLAG = 0;
return 1;
}//等待LSI稳定
RCC_FLAG = 1;
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//选择LSI做为RTC的时钟源
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_WaitForSynchro(); //等待RTC寄存器同步
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_EnterConfigMode();/// 允许配置
//RTC_SetPrescaler(32767); //设置RTC预分频的值
RTC_SetPrescaler(39999); //设置RTC预分频的值
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
//RTC_Set(2020,4,21,10,0,0); //设置时间 calendar
//rtc_set_ticks_flag = 1;//时间需要重新设定
RTC_ExitConfigMode(); //退出配置模式
if(RCC_FLAG == 0)//内部低速晶振时,不写该区域,保证能恢复到外部低速晶振
{BKP_WriteBackupRegister(BKP_DR1, 0X5050);} //向指定的后备寄存器中写入用户程序数据
else
{BKP_WriteBackupRegister(BKP_DR1, 0X50C0);}
g_appconf.updata_time_flag = NOUPDATA;
}
else//系统继续计时
{
RCC_LSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
{
temp++;
//delay_ms(10);
user_delay_ms(10);
if(temp>=250)
RCC_FLAG = 0;
return 1;
}//等待LSI稳定
RCC_FLAG = 1;
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//选择LSI做为RTC的时钟源
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
RTC_WaitForLastTask();//等待上一次写RTC任务完成
RTC_WaitForSynchro(); //等待RTC寄存器同步
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
}
RTC_NVIC_Config();//RCT中断分组设置
RTC_ITConfig(RTC_IT_ALR, ENABLE); //闹钟
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_Get();//更新时间
return 0; //ok
}
下面是我进入standby模式时的函数,用的是内部晶振LSI
void RTC_Enter_StandbyMode(u32 s)
{
debug_print("\r\nIt will wake up after %d s.\n",standbytime);
RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //复位所有IO口
//OSC_deinit();
GPIO_Close();
USART_Cmd(USART1,DISABLE);
USART_Cmd(UART4,DISABLE);
SPI_Cmd(SPI1, DISABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
RTC_WaitForLastTask();
//user_delay_ms(10);
RTC_SetAlarm(RTC_GetCounter()+s);
RTC_WaitForLastTask(); //卡在这里!!!!
// 进入待机模式, 此时所有1.8V域的时钟都关闭,HIS和HSE的振荡器关闭, 电压调节器关闭.
// 只有WKUP引脚上升沿,RTC警告事件,NRST引脚的外部复位,IWDG复位.
/* Request to enter STANDBY mode (Wake Up flag is cleared in PWR_EnterSTANDBYMode function) */
PWR_EnterSTANDBYMode();
}