uint32_t TM_RTC_Init(TM_RTC_ClockSource_t source) { uint32_t status; TM_RTC_t datatime; /* Set instance */ hRTC.Instance = RTC; hRTC.Init.AsynchPrediv = RTC_ASYNC_PREDIV; hRTC.Init.SynchPrediv = RTC_SYNC_PREDIV; hRTC.Init.HourFormat = RTC_HOURFORMAT_24; hRTC.Init.OutPut = RTC_OUTPUT_DISABLE; hRTC.Init.OutPutType = RTC_OUTPUT_TYPE_PUSHPULL; hRTC.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; /* Enable PWR peripheral clock */ __HAL_RCC_PWR_CLK_ENABLE(); /* Allow access to BKP Domain */ HAL_PWR_EnableBkUpAccess(); /* Get RTC status */ status = HAL_RTCEx_BKUPRead(&hRTC, RTC_STATUS_REG); /* Check if RTC already initialized */ if (status == RTC_STATUS_TIME_OK) { /* Start internal clock if we choose internal clock */ if (source == TM_RTC_ClockSource_Internal) { TM_RTC_Config(TM_RTC_ClockSource_Internal); } /* Wait for RTC APB registers synchronisation (needed after start-up from Reset) */ HAL_RTC_WaitForSynchro(&hRTC); /* Get date and time */ TM_RTC_GetDateTime(&datatime, TM_RTC_Format_BIN); /* Clear reset flags */ __HAL_RCC_CLEAR_RESET_FLAGS(); /* Return OK */ return 1; } else { /* Start RTC clock */ TM_RTC_Config(source); /* Set date */ RTC_DateStruct.Year = 0; RTC_DateStruct.Month = 1; RTC_DateStruct.Date = 1; RTC_DateStruct.WeekDay = RTC_WEEKDAY_TUESDAY; /* Set date */ HAL_RTC_SetDate(&hRTC, &RTC_DateStruct, RTC_FORMAT_BIN); /* Set time */ RTC_TimeStruct.Hours = 0x00; RTC_TimeStruct.Minutes = 0x00; RTC_TimeStruct.Seconds = 0x00; RTC_TimeStruct.TimeFormat = RTC_HOURFORMAT_24; RTC_TimeStruct.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; RTC_TimeStruct.StoreOperation = RTC_STOREOPERATION_RESET; /* Set time */ HAL_RTC_SetTime(&hRTC, &RTC_TimeStruct, RTC_FORMAT_BCD); /* Init RTC */ HAL_RTC_Init(&hRTC); /* Save data to backup regiser */ HAL_RTCEx_BKUPWrite(&hRTC, RTC_STATUS_REG, RTC_STATUS_TIME_OK); /* RTC was initialized now */ return 0; } }
uint32_t TM_RTC_Init(TM_RTC_ClockSource_t source) { uint32_t status; uint8_t stat = 1; TM_RTC_Time_t datatime; /* Enable RTC peripheral clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Get RTC status */ status = RTC_ReadBackupRegister(RTC_STATUS_REG); if (status == RTC_STATUS_TIME_OK) { TM_RTC_Status = RTC_STATUS_TIME_OK; /* Start internal clock if we choose internal clock */ if (source == TM_RTC_ClockSource_Internal) { TM_RTC_Config(TM_RTC_ClockSource_Internal); } /* Wait for RTC APB registers synchronisation (needed after start-up from Reset) */ RTC_WaitForSynchro(); /* Clear interrupt flags */ RTC_ClearITPendingBit(RTC_IT_WUT); EXTI_ClearITPendingBit(EXTI_Line22); /* Get date and time */ TM_RTC_GetDateTime(&datatime, TM_RTC_Format_BIN); } else if (status == RTC_STATUS_INIT_OK) { TM_RTC_Status = RTC_STATUS_INIT_OK; /* Start internal clock if we choose internal clock */ if (source == TM_RTC_ClockSource_Internal) { TM_RTC_Config(TM_RTC_ClockSource_Internal); } /* Wait for RTC APB registers synchronisation (needed after start-up from Reset) */ RTC_WaitForSynchro(); /* Clear interrupt flags */ RTC_ClearITPendingBit(RTC_IT_WUT); EXTI_ClearITPendingBit(EXTI_Line22); /* Get date and time */ TM_RTC_GetDateTime(&datatime, TM_RTC_Format_BIN); } else { TM_RTC_Status = RTC_STATUS_ZERO; /* Return status = 0 -> RTC Never initialized before */ stat = RTC_STATUS_ZERO; /* Config RTC */ TM_RTC_Config(source); /* Set date and time */ datatime.date = 1; datatime.day = 1; datatime.month = 1; datatime.year = 0; datatime.hours = 0; datatime.minutes = 0; datatime.seconds = 0; /* Set date and time */ TM_RTC_SetDateTime(&datatime, TM_RTC_Format_BIN); /* Initialized OK */ TM_RTC_Status = RTC_STATUS_INIT_OK; } /* If first time initialized */ if (stat == RTC_STATUS_ZERO) { return 0; } return TM_RTC_Status; }