STM32F4 RTC重新上电的初始化状态判断方法
RTC模块及后备域
STM32系列MCU的RTC及后备域,受Vbat供电而能够保持RTC时钟及日历、BKP寄存器及BKP RAM的值。在模块断电或进入休眠后,重新上电时,为保持RTC日历及BKP寄存器等内容不被再次初始化,需要判断RTC模块的配置状态。
很多网友的方案是,在第一次上电初始化RTC后,在BKP寄存器中写一个标志,在下次上电时读取这个标志,判断是否需要初始化RTC的日历时间。
新思路
如上图,RTC_ISR寄存器中的INITS只读标志,表示RTC是否经过了初始化(根据日历中的“年”数值是否与复位值不同判断,由硬件自动设定。)
代码示例:
RTC_HandleTypeDef hrtc;
/* RTC init function */
void MX_RTC_Init(void)
{
/* USER CODE BEGIN RTC_Init 0 */
/* USER CODE END RTC_Init 0 */
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
/* USER CODE BEGIN RTC_Init 1 */
/* USER CODE END RTC_Init 1 */
/** Initialize RTC Only
*/
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 125;
hrtc.Init.SynchPrediv = 255;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN Check_RTC_BKUP */
if((hrtc.Instance->ISR & 0x10) == 0)
{
/* USER CODE END Check_RTC_BKUP */
/** Initialize RTC and set the Time and Date 没有配置过
*/
sTime.Hours = 0;
sTime.Minutes = 0;
sTime.Seconds = 0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
sDate.WeekDay = RTC_WEEKDAY_FRIDAY;
sDate.Month = RTC_MONTH_DECEMBER;
sDate.Date = 9;
sDate.Year = 22;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
}
}