STM32自学笔记-10-RTC2-掉电后时间回到初始值

博客讲述了在STM32单片机中使用RTC时遇到的问题,即掉电后时间能正确恢复,但日期变为00年0月0日。作者发现HAL库的RTC初始化函数中存在检查BKP寄存器的逻辑,通过修改这段代码,避免了时间初始化,但引发了日期清零的问题。解决方案涉及RTC初始化函数的改进,以及HAL库对日期转换和计数的处理。
摘要由CSDN通过智能技术生成

上节的代码运行后,如果中途有掉电,则再次打开串口后显示的时间会回到初始值,就像下图这样
在这里插入图片描述
针对这个问题我花了蛮多时间寻找原因,也有很多意见众说纷纭,最后还是回到正点原子,看到了问题所在HAL库设置了一个BKP寄存器保存标志,每次单片机启动时都读取这个寄存器并判断是不是预先设定的值。如果不是就初始化RTC并设置时间,再设置标志为预期值;如果是预期值就跳过初始化和时间设置,继续执行后面的程序。
解决办法就很简单了,就是在RTC的初始化函数MX_RTC_Init(void)中改写代码,如果BKP寄存器的保存标志是预先设置的值,就跳过这一步,继续读取时间,应该可以解决时间回到初始值的问题。

void MX_RTC_Init(void)
{

  /* USER CODE BEGIN RTC_Init 0 */
  RTC_DateTypeDef datebuff;   //定义一个datebuff的日期结构体
  /* USER CODE END RTC_Init 0 */
...
...
  /* USER CODE BEGIN RTC_Init 1 */
  __HAL_RCC_BKP_CLK_ENABLE();  //开启后备区域时钟
  __HAL_RCC_PWR_CLK_ENABLE();  //开启电源时钟
  /* USER CODE END RTC_Init 1 */
...
...
 /* USER CODE BEGIN Check_RTC_BKUP */
  if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1)!=0xA0A0)     //这里就是在检查寄存器是不是预先设定的值,如果不是,就按照STM32CubeMX默认的设置往下走。这个值是任意定的
  {
    sTime.Hours = 0x19;   //第一次设置时间
    sTime.Minutes = 0x59;
    sTime.Seconds = 0x30;
    if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
    {
      Error_Handler();
    }
   DateToUpdate.WeekDay = RTC_WEEKDAY_SUNDAY;  //第一次设置日期
   DateToUpdate.Month = RTC_MONTH_JUNE;
   DateToUpdate.Date = 0x12;
   DateToUpdate.Year = 0x22;
   if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
   {
     Error_Handler();
   }
   HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xA0A0);  //这里就是将这个寄存器的标志设为刚才的那个值,下次掉电后就不会进入到这里来了
  /* USER CODE END Check_RTC_BKUP */
  else{
           if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN) != HAL_OK)
                {
                        Error_Handler();
                }
                __HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC);         //开启RTC时钟秒中断   
  }

main.c则不需要修改任何代码,再来编译看下效果
在这里插入图片描述
掉电后的时间没有回复到初始值,但是日期却变得很怪异了,变成了00年0月0日,即year,month,date都清0了。所以时间问题解决了,但日期问题又跑出来了。
由于我的串口屏项目里是需要显示日期的,所以必须想办法把这个问题也解决了。查阅了大量资料后,定位问题在于HAL库没有把日期换算为计数器的值,掉电后就不会计数了。针对这个问题的解决,会在后续章节详述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值