硬汉嵌入式论坛

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

[RTC] STM32H7 RTC软复位或掉电时间不能保存

[复制链接]

41

主题

80

回帖

203

积分

高级会员

积分
203
发表于 2025-9-13 10:56:17 | 显示全部楼层 |阅读模式
大佬们,你们遇到过RTC软复位或者掉电时间不保存的吗?


该设置的都已经设置了,外界纽扣电池也有,电压和连接到VBAT的电压,我量过了,都是3.0V,也都正常,RTC的备份域也设置了,就是不能保存时间。设置时间和读取时间都是没问题的,就是不能保存!

我软复位(没断电)也不能保存,说明应该和硬件没啥关系,估计是配置问题,下面是我的代码,
代码里,一直执行不到else分支,说明设置的标志0XA5A5没有被保存在备份寄存器里,HAL_PWR_EnableBkUpAccess();这些函数没有体现在下面,但是在
用CubeMX配置时,已经在系统时钟函数中void SystemClock_Config(void)被配置了,实在想不出来还有哪里有问题,各位大佬帮助看看


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 */
    unsigned int get_backup_reg; //备份寄存器
    get_backup_reg = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0);
    if(get_backup_reg != 0xA5A5) //首次上电,读备份寄存器,设置一次标志
    {
        /* 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 Check_RTC_BKUP */
        /* 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_WEDNESDAY;
        sDate.Month = RTC_MONTH_JANUARY;
        sDate.Date = 1;
        sDate.Year = 20;

        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_DR0, 0xA5A5);  //写备份域
        printf("Get the flag is: %x",HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0));
    }
    else //后续再上电,就只会执行这里
    {
        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();
        }
    }


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118335
QQ
发表于 2025-9-13 11:34:40 | 显示全部楼层
下载我这个帖子里面H7-TOOL APP V1.49源码工程,使用里面的bsp cpu rtc.c确定没问题的

https://forum.anfulai.cn/forum.php?mod=viewthread&tid=95468
回复

使用道具 举报

41

主题

80

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2025-9-13 13:06:30 | 显示全部楼层
eric2013 发表于 2025-9-13 11:34
下载我这个帖子里面H7-TOOL APP V1.49源码工程,使用里面的bsp cpu rtc.c确定没问题的

https://forum.an ...

我看了一下你的代码,除了时钟初始化你是放在一起的不一样外,其他没有区别,我的时钟初始化是分开的,一部分是在rtc.c里,一部分是在void SystemClock_Config(void)里,时钟部分是cubemx自动生成的,其他部分差不多,奇了怪了。。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118335
QQ
发表于 2025-9-14 09:54:40 | 显示全部楼层
coolaimcu 发表于 2025-9-13 13:06
我看了一下你的代码,除了时钟初始化你是放在一起的不一样外,其他没有区别,我的时钟初始化是分开的,一 ...

软件上没问题,那只能再排查下硬件了。可能没正常给RTC区域供电
回复

使用道具 举报

41

主题

80

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2025-9-14 12:10:19 | 显示全部楼层
eric2013 发表于 2025-9-14 09:54
软件上没问题,那只能再排查下硬件了。可能没正常给RTC区域供电

好的,谢谢硬汉哥,我再看看
回复

使用道具 举报

4

主题

134

回帖

146

积分

初级会员

积分
146
发表于 2025-9-14 18:46:27 | 显示全部楼层
仅仅HAL_RTC_SetTime()  HAL_RTC_SetDate() 需要根据“备份寄存器次标志”确定是否初始化,其它每次上电都需要初始化。
这是我STM32F4、F7、H7都正常工作的代码
回复

使用道具 举报

10

主题

48

回帖

78

积分

初级会员

积分
78
发表于 2025-9-15 08:29:25 | 显示全部楼层
MX_RTC_Init里面有HAL_RTC_SetTime和HAL_RTC_SetDate,重新初始化时会执行,将初始时间(你的函数里面是0时0分0秒)和初始日期(20年1月1日)重新设置了,有效时间就变成这个初始时间了,可以把初始化这里面的设置时间和设置日期给注释掉;另外RTC要有不间断供电,保证RTC时钟一直跑
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 19:23 , Processed in 0.044254 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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