|
void rtc_init(void)
{
u16 ddys=0;
RTC_ClearITPendingBit(RTC_IT_WUT);
RTC_ClearITPendingBit(RTC_IT_ALRA);
CLK_PeripheralClockConfig(CLK_Peripheral_RTC,DISABLE); //打開RTC時鐘
/*如果外部晶振有問題,切換內(nèi)部晶振*/
CLK_data=0;//外部晶振0,內(nèi)部晶振為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); //喚醒設(shè)置為16分頻
RTC_SetWakeUpCounter(80); //設(shè)置喚醒寄存器時間為 1s 2048 ,0.5秒 1024
RTC_ITConfig(RTC_IT_WUT, ENABLE); //使能RTC喚醒中斷使能
RTC_ClearITPendingBit(RTC_IT_WUT); //清除RTC喚醒標(biāo)志
RTC_ClearITPendingBit(RTC_IT_ALRA);
RTC_WakeUpCmd(ENABLE);
delayms(5);
}
|
|