【嵌入式开发技巧】

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();
	  }
  } 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值