硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1127|回复: 7
收起左侧

[RTC] STM32H7 RTC日期后备域不更新

[复制链接]

8

主题

24

回帖

48

积分

新手上路

积分
48
发表于 2024-7-15 20:08:08 | 显示全部楼层 |阅读模式
     最近在H7上遇到一个问题,RTC使用了32.768K的晶振,有电池给RTC供电。 遇到了两个问题,麻烦有经验的大佬回复下,谢谢了。
  1. 先将RTC时间与电脑同步,然后将MCU断电后(电池不拔),RTC时间是会正常走。5秒钟后第一次重新上电,发现RTC时间实际比正常的(电脑)大概慢了3~4秒;后面短时间内(关机到开机不超过10秒)再多次重启,就大概重启3次会慢1秒。

  2. 在一直不断电的情况下,时间达到23:59:59后,日期会自动加1天。但是断电后,日期又会回到最初设置的默认时间,也就是说后备域中不会存储最新的日期

看帖子说F1是会存在需要自己断电后需要重新计算日期的问题,H7也会有这个问题吗?我已经将后备域是使能了


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2024-7-16 08:47:31 | 显示全部楼层
这个现象不正常,有必要看下你的电池RTC供电是不是有问题,正常情况下,你的板子反复上电下电是不会影响的RTC时间计数的。
回复

使用道具 举报

8

主题

24

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2024-7-16 08:56:06 | 显示全部楼层
eric2013 发表于 2024-7-16 08:47
这个现象不正常,有必要看下你的电池RTC供电是不是有问题,正常情况下,你的板子反复上电下电是不会影响的R ...

是的,我昨天上传了一张RTC初始化的代码图片,但不知道为什么没有显示出来。
最后把else里面的代码去掉,日期更新就正常了,我以前带rtthread操作系统的时候,这个else里面的内容是有的,而且日期正常,不太明白为什么这里不能加,即为什么这里的日期备份域没有随着时间的变化而更新。

另外就是每次重新上电,时间都会慢一点点,是不是与电容有关系呢?

void MX_RTC_Init(void)
{

  /* USER CODE BEGIN RTC_Init 0 */
  RTC_TimeTypeDef sTime = {0};
  RTC_DateTypeDef sDate = {0};
  /* USER CODE END RTC_Init 0 */

  /* USER CODE BEGIN RTC_Init 1 */
  HAL_PWR_EnableBkUpAccess();
  /* USER CODE END RTC_Init 1 */
  /** Initialize RTC Only
  */
  hrtc.Instance = RTC;
  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  hrtc.Init.AsynchPrediv = 127;
  hrtc.Init.SynchPrediv = 255;
  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN RTC_Init 2 */
  if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x5051)
  {

          /** Initialize RTC and set the Time and Date
          */
          sTime.Hours = 12;
          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_SATURDAY;
          sDate.Month = RTC_MONTH_MARCH;
          sDate.Date = 0x12;
          sDate.Year = 0x24;

          if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
          {
                Error_Handler();
          }
          /* USER CODE BEGIN RTC_Init 2 */
                HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x5051);
                HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR2, (uint16_t)sDate.Year);
                HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR3, (uint16_t)sDate.Month);
                HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR4, (uint16_t)sDate.Date);
                HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR5, (uint16_t)sDate.WeekDay);
  }
  else
  {
          sDate.Year    = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR2);
          sDate.Month   = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR3);
          sDate.Date    = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR4);
          sDate.WeekDay = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR5);
          if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
          {
                  Error_Handler();
          }
  }
回复

使用道具 举报

4

主题

126

回帖

138

积分

初级会员

积分
138
发表于 2024-7-16 11:58:26 | 显示全部楼层
circlegan 发表于 2024-7-16 08:56
是的,我昨天上传了一张RTC初始化的代码图片,但不知道为什么没有显示出来。
最后把else里面的代码去掉 ...

if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x5051)
{
}
else
{
不需要重设RTC。
}
回复

使用道具 举报

6

主题

68

回帖

86

积分

初级会员

积分
86
发表于 2024-7-16 14:20:21 | 显示全部楼层
else是不需要设置,else里加了代码,那就是画蛇添足了!
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2024-7-16 15:15:52 | 显示全部楼层
circlegan 发表于 2024-7-16 08:56
是的,我昨天上传了一张RTC初始化的代码图片,但不知道为什么没有显示出来。
最后把else里面的代码去掉 ...

这个RTC_BKP_DRx是用来存储用户数据的,不是日期时间,也不会自己自动更新数据的。有点像bk_ram
你这个代码,在初始化RTC时,rtc_bkp里面写个0x5051就好了,为什么要写日期到里面呢?
else里面又把初始化时的日期读出来,覆盖了RTC自己的日期,所以就不对了。
回复

使用道具 举报

7

主题

111

回帖

132

积分

初级会员

积分
132
发表于 2024-7-16 19:35:08 | 显示全部楼层
哈哈  不要反复初始化RTC  把初始化RTC也写在  if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x5051) 括号里面
回复

使用道具 举报

8

主题

24

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2024-7-16 21:21:22 | 显示全部楼层
turnip 发表于 2024-7-16 11:58
if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x5051)
{
}

感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-16 13:50 , Processed in 0.118483 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表