/*****************************************************************************//*! * * @brief inital RTC module * * @param[in] pConfig point to configuration * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ void RTC_Init(RTC_ConfigType *pConfig) { uint16_t u16Clocksource, u16Prescler; uint16_t u16ModVal; u16Clocksource =0; u16Prescler =0; u16ModVal =0; SIM->SCGC |= SIM_SCGC_RTC_MASK; u16ModVal = pConfig->u16ModuloValue; RTC_SetModulo(u16ModVal); if (pConfig->bRTCOut) { RTC->SC= RTC_SC_RTCO_MASK; } if (pConfig->bInterruptEn) { NVIC_EnableIRQ(RTC_IRQn); RTC_EnableInt(); } else { NVIC_DisableIRQ(RTC_IRQn); } if (pConfig->bFlag) { RTC_ClrFlags(); } u16Clocksource = pConfig->bClockSource; u16Prescler = pConfig->bClockPresaler; RTC_SetClock(u16Clocksource,u16Prescler ); }
/** * @brief plan next RTC Interrupt time. * @param sCurTime. * @return None. */ void planNextRTCInterrupt(S_RTC_TIME_DATA_T *sCurTime) { // plan next interrupt timing if(sCurTime->u32Minute < 59) sCurTime->u32Minute += 1; else { if(sCurTime->u32Hour < 23) sCurTime->u32Hour += 1; else // next day { sCurTime->u32Hour = 0; // new year first day if(sCurTime->u32Month==12 && sCurTime->u32Day==31) { sCurTime->u32Year += 1; sCurTime->u32Month = 1; sCurTime->u32Day = 1; } else if(sCurTime->u32Month==1 || sCurTime->u32Month==3 || sCurTime->u32Month==5 || sCurTime->u32Month==7 || sCurTime->u32Month==8 || sCurTime->u32Month==10 || sCurTime->u32Month==12) // 1,3,5,7,8,10,12 31-day month { if(sCurTime->u32Day < 31) sCurTime->u32Day += 1; else { sCurTime->u32Day = 1; sCurTime->u32Month += 1; } } else if(sCurTime->u32Month==2) // 2, 28 or 29-day month { if(RTC_IS_LEAP_YEAR()) // leap year { if(sCurTime->u32Day < 29) sCurTime->u32Day += 1; else { sCurTime->u32Day = 1; sCurTime->u32Month += 1; } } else { if(sCurTime->u32Day < 28) sCurTime->u32Day += 1; else { sCurTime->u32Day = 1; sCurTime->u32Month += 1; } } } else if(sCurTime->u32Month==4 || sCurTime->u32Month==6 || sCurTime->u32Month==9 || sCurTime->u32Month==11) // 4,6,9,11 30-day { if(sCurTime->u32Day < 30) sCurTime->u32Day += 1; else { sCurTime->u32Day = 1; sCurTime->u32Month += 1; } } } sCurTime->u32Month = 0; } sCurTime->u32Second = 0; RTC_SetAlarmDateAndTime(sCurTime); RTC_EnableInt(RTC_RIER_AIER_Msk); NVIC_EnableIRQ(RTC_IRQn); }