void RtcStopTimer( void ) { RtcClearStatus( ); }
static void RtcStartWakeUpAlarm( uint32_t timeoutValue ) { uint16_t rtcSeconds = 0; uint16_t rtcMinutes = 0; uint16_t rtcHours = 0; uint16_t rtcDays = 0; uint8_t rtcAlarmSeconds = 0; uint8_t rtcAlarmMinutes = 0; uint8_t rtcAlarmHours = 0; uint16_t rtcAlarmDays = 0; RTC_AlarmTypeDef RTC_AlarmStructure; RTC_TimeTypeDef RTC_TimeStruct; RTC_DateTypeDef RTC_DateStruct; RtcClearStatus( ); RtcTimerContext = RtcGetCalendarValue( ); RTC_GetTime( RTC_Format_BIN, &RTC_TimeStruct ); RTC_GetDate( RTC_Format_BIN, &RTC_DateStruct ); timeoutValue = timeoutValue / RTC_ALARM_TIME_BASE; if( timeoutValue > 2160000 ) // 25 "days" in tick { // drastically reduce the computation time rtcAlarmSeconds = RTC_TimeStruct.RTC_Seconds; rtcAlarmMinutes = RTC_TimeStruct.RTC_Minutes; rtcAlarmHours = RTC_TimeStruct.RTC_Hours; rtcAlarmDays = 25 + RTC_DateStruct.RTC_Date; // simply add 25 days to current date and time if( ( RTC_DateStruct.RTC_Year == 0 ) || ( RTC_DateStruct.RTC_Year % 4 == 0 ) ) { if( rtcAlarmDays > DaysInMonthLeapYear[ RTC_DateStruct.RTC_Month - 1 ] ) { rtcAlarmDays = rtcAlarmDays % DaysInMonthLeapYear[ RTC_DateStruct.RTC_Month - 1]; } } else { if( rtcAlarmDays > DaysInMonth[ RTC_DateStruct.RTC_Month - 1 ] ) { rtcAlarmDays = rtcAlarmDays % DaysInMonth[ RTC_DateStruct.RTC_Month - 1]; } } } else { rtcSeconds = ( timeoutValue % SecondsInMinute ) + RTC_TimeStruct.RTC_Seconds; rtcMinutes = ( ( timeoutValue / SecondsInMinute ) % SecondsInMinute ) + RTC_TimeStruct.RTC_Minutes; rtcHours = ( ( timeoutValue / SecondsInHour ) % HoursInDay ) + RTC_TimeStruct.RTC_Hours; rtcDays = ( timeoutValue / SecondsInDay ) + RTC_DateStruct.RTC_Date; rtcAlarmSeconds = ( rtcSeconds ) % 60; rtcAlarmMinutes = ( ( rtcSeconds / 60 ) + rtcMinutes ) % 60; rtcAlarmHours = ( ( ( ( rtcSeconds / 60 ) + rtcMinutes ) / 60 ) + rtcHours ) % 24; rtcAlarmDays = ( ( ( ( ( rtcSeconds / 60 ) + rtcMinutes ) / 60 ) + rtcHours ) / 24 ) + rtcDays; if( ( RTC_DateStruct.RTC_Year == 0 ) || ( RTC_DateStruct.RTC_Year % 4 == 0 ) ) { if( rtcAlarmDays > DaysInMonthLeapYear[ RTC_DateStruct.RTC_Month - 1 ] ) { rtcAlarmDays = rtcAlarmDays % DaysInMonthLeapYear[ RTC_DateStruct.RTC_Month - 1 ]; } } else { if( rtcAlarmDays > DaysInMonth[ RTC_DateStruct.RTC_Month - 1 ] ) { rtcAlarmDays = rtcAlarmDays % DaysInMonth[ RTC_DateStruct.RTC_Month - 1 ]; } } } RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = rtcAlarmSeconds; RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = rtcAlarmMinutes; RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = rtcAlarmHours; RTC_AlarmStructure.RTC_AlarmDateWeekDay = ( uint8_t )rtcAlarmDays; RTC_AlarmStructure.RTC_AlarmTime.RTC_H12 = RTC_TimeStruct.RTC_H12; RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date; RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_None; RTC_SetAlarm( RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure ); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro( ); /* Enable RTC Alarm A Interrupt */ RTC_ITConfig( RTC_IT_ALRA, ENABLE ); /* Enable the Alarm A */ RTC_AlarmCmd( RTC_Alarm_A, ENABLE ); }