/***********************************************************
Function name : RTC_Config
Function type : void
Description : RTCÅäÖÃ
Parameter : None
Return : None
***********************************************************/
void RTC_Config(void)
{
//ʹÄÜPWRʱÖÓ
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_RTCAccessCmd(ENABLE); //ÔÊÐí·ÃÎÊRTC
RCC_RTCResetCmd(ENABLE); //¸´Î»RTCÓò
RCC_RTCResetCmd(DISABLE); //
RCC_LSEConfig(RCC_LSE_ON); //¿ªÆôLSE
//µÈ´ýLSEÆðÕñ²¢Îȶ¨
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
{
}
//Ñ¡ÔñLSEΪRTCʱÖÓÔ´
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE); //ʹÄÜRTCʱÖÓ
RTC_WaitForSynchro(); //µÈ´ýRTC¼Ä´æÆ÷ÓëAPBʱÖÓͬ²½
}
/***********************************************************
Function name : RTC_InitConfig
Function type : void
Description : RTC³õʼ»¯ÅäÖÃ
Parameter : None
Return : None
***********************************************************/
void RTC_InitConfig(void)
{
RTC_InitTypeDef RTC_InitStructure;
if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2)
{
RTC_Config(); //RTCÅäÖÃ
//ÅäÖÃRTCÊý¾Ý¼Ä´æÆ÷ºÍÔ¤·ÖƵÆ÷
RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
RTC_InitStructure.RTC_SynchPrediv = 0xFF;
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
if (RTC_Init(&RTC_InitStructure) == ERROR)
{
//printf("\n\r RTC Prescaler Config failed \n\r");
}
RTC_SetInitTimeDate(); //ÉèÖóõʼʱ¼ä
}
else
{
if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) //¼ì²éÊÇ·ñµçÔ´¸´Î»
{
//printf("\r\n Power On Reset occurred....\n\r");
}
else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) //¼ì²éÊÇ·ñ¹Ü½Å¸´Î»
{
//printf("\r\n External Reset occurred....\n\r");
}
//printf("\n\r No need to configure RTC....\n\r");
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //ʹÄÜPWRʱÖÓ
PWR_RTCAccessCmd(ENABLE); //ÔÊÐí·ÃÎÊRTC
//RCC_RTCCLKCmd(ENABLE); //ʹÄÜRTCʱÖÓ
RTC_WaitForSynchro(); //µÈ´ýRTC¼Ä´æÆ÷ÓëAPBʱÖÓͬ²½
//RTC_ClearFlag(RTC_IT_WUT); //Çå³ýRTC±¨¾¯±êÖ¾
}
RTC_SetWakeUpTime(); //ÉèÖû½ÐÑÖжÏʱ¼ä
}
/***********************************************************
Function name : RTC_SetWakeUpTime
Function type : void
Description : RTCÉèÖóõʼ»¯Ê±¼ä
Parameter : None
Return : None
***********************************************************/
void RTC_SetWakeUpTime(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//RTC WakeUpÖжÏÅäÖÃ
EXTI_ClearITPendingBit(EXTI_Line20);
EXTI_InitStructure.EXTI_Line = EXTI_Line20;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
//ʹÄÜRTC WakeUpÖжÏ
NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//ʹÄÜRTC WakeUpÖжÏ
RTC_ITConfig(RTC_IT_WUT, ENABLE);
//ʹÄÜRTC WakeUp¹¦ÄÜ
RTC_WakeUpCmd(ENABLE);
RTC_WakeUpCmd(DISABLE);
RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits); //WakeUpʱÖÓµÈÓÚ1HzÄÚ²¿Ê±ÖÓ
RTC_SetWakeUpCounter((WAKEUPTIME - 1));
RTC_WakeUpCmd(ENABLE);
}
/***********************************************************
Function name : SetInitTimeDate
Function type : void
Description : RTCÉèÖóõʼ»¯Ê±¼ä
Parameter : None
Return : None
***********************************************************/
void RTC_SetInitTimeDate(void)
{
RTC_TimeTypeDef RTC_TimeStructure1;
RTC_DateTypeDef RTC_DateStructure1;
//ʱ¼ä
RTC_TimeStructure1.RTC_Hours = 1;
RTC_TimeStructure1.RTC_Minutes = 30;
RTC_TimeStructure1.RTC_Seconds = 0;
//ÈÕÆÚ
RTC_DateStructure1.RTC_Year = 13;
RTC_DateStructure1.RTC_Month = 1;
RTC_DateStructure1.RTC_Date = 1;
RTC_DateStructure1.RTC_WeekDay = 2;
if(RTC_SetDate(RTC_Format_BIN, &RTC_DateStructure1)== ERROR)
{
//printf("\n\r>> !! RTC Set Data failed. !! <<\n\r");
}
else
{
if(RTC_SetTime(RTC_Format_BIN, &RTC_TimeStructure1) == ERROR)
{
//printf("\n\r>> !! RTC Set Time failed. !! <<\n\r");
}
else
{
RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure1);
RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure1);
RTC_WriteBackupRegister(RTC_BKP_DR0, 0x32F2);
}
}
}
void IWDG_InitConfig(void)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //ʹÄܼĴæÆ÷¶Áд
IWDG_SetPrescaler(IWDG_Prescaler_256); //LSIʱÖÓ256·ÖƵ
IWDG_SetReload(1445); //ÉèÖüÆÊýÆ÷ÊýÖµ£¬10sÒç³ö¸´Î»
IWDG_ReloadCounter(); //ÖØÆô¼ÆÊýÆ÷
IWDG_Enable(); //ʹÄÜIWDG¿´ÃŹ·
}
|