void rtc_init(void)
{
u16 ddys=0;
RTC_ClearITPendingBit(RTC_IT_WUT);
RTC_ClearITPendingBit(RTC_IT_ALRA);
CLK_PeripheralClockConfig(CLK_Peripheral_RTC,DISABLE); //打开RTC时钟
/*如果外部晶振有问题,切换内部晶振*/
CLK_data=0;//外部晶振0,内部晶振为1
if((rest_clk<20)||(FLASH_ReadByte(CLK_LSE_LSI)!=0x01))//(CLK_data==0)//外部时钟
{
CLK_LSEConfig(CLK_LSE_ON);
while( RESET==CLK_GetFlagStatus(CLK_FLAG_LSERDY))
{
if((++ddys)>8000)
{
CLK_data=1;
break;
}
}
CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_1);//时钟为LSE 2分频
CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE); //打开RTC时钟
}
else
{
CLK_data=1;
RTC_WakeUpCmd(DISABLE);
CLK_LSEConfig(CLK_LSE_OFF);
CLK_LSICmd(ENABLE);
while (CLK_GetFlagStatus(CLK_FLAG_LSIRDY) == RESET);
CLK_RTCClockConfig(CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_1);//时钟为LSE 2分频
CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE); //打开RTC时钟
}
RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16); //唤醒设置为16分频
RTC_SetWakeUpCounter(80); //设置唤醒寄存器时间为 1s 2048 ,0.5秒 1024
RTC_ITConfig(RTC_IT_WUT, ENABLE); //使能RTC唤醒中断使能
RTC_ClearITPendingBit(RTC_IT_WUT); //清除RTC唤醒标志
RTC_ClearITPendingBit(RTC_IT_ALRA);
RTC_WakeUpCmd(ENABLE);
delayms(5);
}
|