/** * @brief Initialize RTC block * * @note * @param None * @retval None */ static void Init_RTC(void) { /* Initialize the HW - 37Khz LSI being used*/ /* Enable the LSI clock */ __HAL_RCC_LSI_ENABLE(); /* Enable power module clock */ __PWR_CLK_ENABLE(); /* Enable acces to the RTC registers */ HAL_PWR_EnableBkUpAccess(); /** * Write twice the value to flush the APB-AHB bridge * This bit shall be written in the register before writing the next one */ HAL_PWR_EnableBkUpAccess(); /* Select LSI as RTC Input */ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI); /* Enable RTC */ __HAL_RCC_RTC_ENABLE(); hrtc.Instance = RTC; /**< Define instance */ hrtc.Lock = HAL_UNLOCKED; /**< Initialize lock */ hrtc.State = HAL_RTC_STATE_READY; /**< Initialize state */ /** * Bypass the shadow register */ HAL_RTCEx_EnableBypassShadow(&hrtc); /** * Set the Asynchronous prescaler */ hrtc.Init.AsynchPrediv = RTC_ASYNCH_PRESCALER; hrtc.Init.SynchPrediv = RTC_SYNCH_PRESCALER; HAL_RTC_Init(&hrtc); /* Disable Write Protection */ __HAL_RTC_WRITEPROTECTION_DISABLE(&hrtc) ; HAL_APP_RTC_Set_Wucksel(&hrtc, WUCKSEL_DIVIDER); /**< Tick timer is 55us */ /* Wait for LSI to be stable */ while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == 0); return; }
void RtcInit( void ) { RtcCalendar_t rtcInit; if( RtcInitialized == false ) { __HAL_RCC_RTC_ENABLE( ); RtcHandle.Instance = RTC; RtcHandle.Init.HourFormat = RTC_HOURFORMAT_24; RtcHandle.Init.AsynchPrediv = PREDIV_A; // RTC_ASYNCH_PREDIV; RtcHandle.Init.SynchPrediv = PREDIV_S; // RTC_SYNCH_PREDIV; RtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE; RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; HAL_RTC_Init( &RtcHandle ); // Set Date: Friday 1st of January 2000 rtcInit.CalendarDate.Year = 0; rtcInit.CalendarDate.Month = RTC_MONTH_JANUARY; rtcInit.CalendarDate.Date = 1; rtcInit.CalendarDate.WeekDay = RTC_WEEKDAY_SATURDAY; HAL_RTC_SetDate( &RtcHandle, &rtcInit.CalendarDate, RTC_FORMAT_BIN ); // Set Time: 00:00:00 rtcInit.CalendarTime.Hours = 0; rtcInit.CalendarTime.Minutes = 0; rtcInit.CalendarTime.Seconds = 0; rtcInit.CalendarTime.SecondFraction = 0; rtcInit.CalendarTime.TimeFormat = RTC_HOURFORMAT12_AM; rtcInit.CalendarTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; rtcInit.CalendarTime.StoreOperation = RTC_STOREOPERATION_RESET; HAL_RTC_SetTime( &RtcHandle, &rtcInit.CalendarTime, RTC_FORMAT_BIN ); // Enable Direct Read of the calendar registers (not through Shadow registers) HAL_RTCEx_EnableBypassShadow( &RtcHandle ); HAL_NVIC_SetPriority( RTC_Alarm_IRQn, 1, 0 ); HAL_NVIC_EnableIRQ( RTC_Alarm_IRQn ); RtcInitialized = true; } }
/*! * @brief Configures the RTC timer * @note The timer is based on the RTC * @param none * @retval none */ static void HW_RTC_SetConfig( void ) { RTC_TimeTypeDef RTC_TimeStruct; RTC_DateTypeDef RTC_DateStruct; RtcHandle.Instance = RTC; RtcHandle.Init.HourFormat = RTC_HOURFORMAT_24; RtcHandle.Init.AsynchPrediv = PREDIV_A; /* RTC_ASYNCH_PREDIV; */ RtcHandle.Init.SynchPrediv = PREDIV_S; /* RTC_SYNCH_PREDIV; */ RtcHandle.Init.OutPut = RTC_OUTPUT; RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; HAL_RTC_Init( &RtcHandle ); /*Monday 1st January 2016*/ RTC_DateStruct.Year = 0; RTC_DateStruct.Month = RTC_MONTH_JANUARY; RTC_DateStruct.Date = 1; RTC_DateStruct.WeekDay = RTC_WEEKDAY_MONDAY; HAL_RTC_SetDate(&RtcHandle , &RTC_DateStruct, RTC_FORMAT_BIN); /*at 0:0:0*/ RTC_TimeStruct.Hours = 0; RTC_TimeStruct.Minutes = 0; RTC_TimeStruct.Seconds = 0; RTC_TimeStruct.TimeFormat = 0; RTC_TimeStruct.SubSeconds = 0; RTC_TimeStruct.StoreOperation = RTC_DAYLIGHTSAVING_NONE; RTC_TimeStruct.DayLightSaving = RTC_STOREOPERATION_RESET; HAL_RTC_SetTime(&RtcHandle , &RTC_TimeStruct, RTC_FORMAT_BIN); /*Enable Direct Read of the calendar registers (not through Shadow) */ HAL_RTCEx_EnableBypassShadow(&RtcHandle); }