static void RtcStartWakeUpAlarm( uint32_t timeoutValue ) { RtcCalendar_t now; RtcCalendar_t alarmTimer; RTC_AlarmTypeDef alarmStructure; HAL_RTC_DeactivateAlarm( &RtcHandle, RTC_ALARM_A ); HAL_RTCEx_DeactivateWakeUpTimer( &RtcHandle ); // Load the RTC calendar now = RtcGetCalendar( ); // Save the calendar into RtcCalendarContext to be able to calculate the elapsed time RtcCalendarContext = now; // timeoutValue is in ms alarmTimer = RtcComputeTimerTimeToAlarmTick( timeoutValue, now ); alarmStructure.Alarm = RTC_ALARM_A; alarmStructure.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; alarmStructure.AlarmMask = RTC_ALARMMASK_NONE; alarmStructure.AlarmTime.TimeFormat = RTC_HOURFORMAT12_AM; alarmStructure.AlarmTime.Seconds = alarmTimer.CalendarTime.Seconds; alarmStructure.AlarmTime.Minutes = alarmTimer.CalendarTime.Minutes; alarmStructure.AlarmTime.Hours = alarmTimer.CalendarTime.Hours; alarmStructure.AlarmDateWeekDay = alarmTimer.CalendarDate.Date; if( HAL_RTC_SetAlarm_IT( &RtcHandle, &alarmStructure, RTC_FORMAT_BIN ) != HAL_OK ) { assert_param( FAIL ); } }
static TimerTime_t RtcConvertCalendarTickToTimerTime( RtcCalendar_t *calendar ) { TimerTime_t timeCounter = 0; RtcCalendar_t now; double timeCounterTemp = 0.0; // Passing a NULL pointer will compute from "now" else, // compute from the given calendar value if( calendar == NULL ) { now = RtcGetCalendar( ); } else { now = *calendar; } // Years (calculation valid up to year 2099) for( int16_t i = 0; i < ( now.CalendarDate.Year + now.CalendarCentury ); i++ ) { if( ( i == 0 ) || ( i % 4 ) == 0 ) { timeCounterTemp += ( double )SecondsInLeapYear; } else { timeCounterTemp += ( double )SecondsInYear; } } // Months (calculation valid up to year 2099)*/ if( ( now.CalendarDate.Year == 0 ) || ( ( now.CalendarDate.Year + now.CalendarCentury ) % 4 ) == 0 ) { for( uint8_t i = 0; i < ( now.CalendarDate.Month - 1 ); i++ ) { timeCounterTemp += ( double )( DaysInMonthLeapYear[i] * SecondsInDay ); } } else { for( uint8_t i = 0; i < ( now.CalendarDate.Month - 1 ); i++ ) { timeCounterTemp += ( double )( DaysInMonth[i] * SecondsInDay ); } } timeCounterTemp += ( double )( ( uint32_t )now.CalendarTime.Seconds + ( ( uint32_t )now.CalendarTime.Minutes * SecondsInMinute ) + ( ( uint32_t )now.CalendarTime.Hours * SecondsInHour ) + ( ( uint32_t )( now.CalendarDate.Date * SecondsInDay ) ) ); timeCounterTemp = ( double )timeCounterTemp * RTC_ALARM_TICK_DURATION; timeCounter = round( timeCounterTemp ); return ( timeCounter ); }
static TimerTime_t RtcConvertCalendarTickToTimerTime( RtcCalendar_t *calendar ) { TimerTime_t timeCounter = 0; RtcCalendar_t now; uint32_t timeCounterTemp = 0; // Passing a NULL pointer will compute from "now" else, // compute from the given calendar value if( calendar == NULL ) { now = RtcGetCalendar( ); } else { now = *calendar; } // Years (calculation valid up to year 2099) for( int16_t i = 0; i < now.CalendarDate.Year ; i++ ) { if( ( i == 0 ) || ( i % 4 ) == 0 ) { timeCounterTemp += ( uint32_t )SecondsInLeapYear; } else { timeCounterTemp += ( uint32_t )SecondsInYear; } } // Months (calculation valid up to year 2099)*/ if( ( now.CalendarDate.Year == 0 ) || ( now.CalendarDate.Year % 4 ) == 0 ) { for( uint8_t i = 0; i < ( now.CalendarDate.Month - 1 ); i++ ) { timeCounterTemp += ( uint32_t )( DaysInMonthLeapYear[i] * SecondsInDay ); } } else { for( uint8_t i = 0; i < ( now.CalendarDate.Month - 1 ); i++ ) { timeCounterTemp += ( uint32_t )( DaysInMonth[i] * SecondsInDay ); } } timeCounterTemp += ( uint32_t )( ( uint32_t )now.CalendarTime.Seconds + ( ( uint32_t )now.CalendarTime.Minutes * SecondsInMinute ) + ( ( uint32_t )now.CalendarTime.Hours * SecondsInHour ) + ( ( uint32_t )( now.CalendarDate.Date * SecondsInDay ) ) ); timeCounter = ( timeCounterTemp << N_PREDIV_S ) + ( PREDIV_S - now.CalendarTime.SubSeconds); return ( timeCounter ); }
static void RtcComputeWakeUpTime( void ) { uint32_t start = 0; uint32_t stop = 0; RTC_AlarmTypeDef alarmRtc; RtcCalendar_t now; if( WakeUpTimeInitialized == false ) { now = RtcGetCalendar( ); HAL_RTC_GetAlarm( &RtcHandle, &alarmRtc, RTC_ALARM_A, RTC_FORMAT_BIN ); start = PREDIV_S - alarmRtc.AlarmTime.SubSeconds; stop = PREDIV_S - now.CalendarTime.SubSeconds; McuWakeUpTime = RtcConvertTickToMs( stop - start ); WakeUpTimeInitialized = true; } }
static void RtcComputeWakeUpTime( void ) { uint32_t start = 0; uint32_t stop = 0; RTC_AlarmTypeDef alarmRtc; RtcCalendar_t now; if( WakeUpTimeInitialized == false ) { now = RtcGetCalendar( ); HAL_RTC_GetAlarm( &RtcHandle, &alarmRtc, RTC_ALARM_A, RTC_FORMAT_BIN ); start = alarmRtc.AlarmTime.Seconds + ( SecondsInMinute * alarmRtc.AlarmTime.Minutes ) + ( SecondsInHour * alarmRtc.AlarmTime.Hours ); stop = now.CalendarTime.Seconds + ( SecondsInMinute * now.CalendarTime.Minutes ) + ( SecondsInHour * now.CalendarTime.Hours ); McuWakeUpTime = ceil ( ( stop - start ) * RTC_ALARM_TICK_DURATION ); WakeUpTimeInitialized = true; } }