[应用相关] STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+RTC(修复...

[复制链接]
2244|20
 楼主| jcky001 发表于 2022-4-15 10:02 | 显示全部楼层 |阅读模式
首先说明下开发条件:
1、开发板:秉火霸道,STM32F103ZET
2、软件:Cubemx V4.23(F1 V1.60库)

问题描述:Cubemx生成RTC代码会出现时间可以更新,日期复位以后就不能更新,恢复到2000/1/1的问题!

问题原因:断电以后 日期DateToUpdate的相关内容没有备份,而时间会通过RTC_WriteTimeCounter(hrtc, counter_time)进行备份!

解决思路:想办法将日期保存起来!

 楼主| jcky001 发表于 2022-4-15 10:08 | 显示全部楼层
解决办法:
1、cubemx设置:
988016258d3a3b4725.png
915926258d3b579a90.png

 楼主| jcky001 发表于 2022-4-15 10:10 | 显示全部楼层
当然你也可以选择二进制设置,然后将生成的代码月份和星期都改成二进制显示,这样就可以从源头上解决问题:
614416258d3e286f31.png
 楼主| jcky001 发表于 2022-4-15 10:12 | 显示全部楼层
2、解决办法
    初始化函数改为
void MX_RTC_Init(void)
{
//  RTC_TimeTypeDef sTime;//在前面申明
//  RTC_DateTypeDef DateToUpdate;

    /**Initialize RTC Only  */
  hrtc.Instance = RTC;
  hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
  hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initialize RTC and set the Time and Date */
  if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x32F2)
        {
                sTime.Hours = 0x23;
                sTime.Minutes = 0x59;
                sTime.Seconds = 0x50;

                if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
                {
                        _Error_Handler(__FILE__, __LINE__);
                }

                DateToUpdate.WeekDay = RTC_WEEKDAY_SATURDAY;
                DateToUpdate.Month = RTC_MONTH_DECEMBER;
                DateToUpdate.Date = 0x3;
                DateToUpdate.Year = 0x17;

                if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
                {
                        _Error_Handler(__FILE__, __LINE__);
                }

                        /* 写入一个数值:0x32F2到RTC备份数据寄存器1 */               
    HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,0x32F2);//随便写的一个数,目的就是检测是否掉电
  }
else
  {
    /* 检查上电复位标志位是否为:SET */
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET)
    {
      printf("发生上电复位!!!\n");
    }
    /* 检测引脚复位标志位是否为:SET */
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET)
    {
      printf("发生外部引脚复位!!!\n");
      DateToUpdate.Year  = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR3);
      DateToUpdate.Month = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR4);
      DateToUpdate.Date  = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR5);
      DateToUpdate.WeekDay = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR6);
      HAL_RTC_SetDate(&hrtc,&DateToUpdate,RTC_FORMAT_BIN);        //与写入的方式保持一致!main函      数里面写入的是二进制
    }   
    /* 清楚复位源标志位 */
    __HAL_RCC_CLEAR_RESET_FLAGS();
  }
}
main函数改为:
while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
                 HAL_RTC_GetDate (&hrtc,&DateToUpdate,RTC_FORMAT_BIN);               
                //必须立即备份,以后再显示
                HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR3, DateToUpdate.Year);   //使用二进制写入寄存器,应该以二进制存入
                HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR4, DateToUpdate.Month);
                HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR5, DateToUpdate.Date);  
                HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR6, DateToUpdate.Month);
      /* Display date Format : yy/mm/dd */
      printf("%d/%d/%d\r\n",2000+DateToUpdate.Year, DateToUpdate.Month, DateToUpdate.Date);//BCD吗,12月份就是)0X12,显示出来就是18月了!       
        HAL_RTC_GetTime (&hrtc,&sTime,RTC_FORMAT_BIN);
      printf("%d:%d:%d\r\n",sTime.Hours, sTime.Minutes, sTime.Seconds);
      printf("\r\n");
      HAL_Delay(1000);
       
  }

Uriah 发表于 2022-10-7 12:30 | 显示全部楼层

不同的代码逻辑就代表了不同的策略
Bblythe 发表于 2022-10-7 15:29 | 显示全部楼层

确定好硬件原理图,硬件布线,最后才是软件的开发
Pulitzer 发表于 2022-10-7 18:28 | 显示全部楼层

ART2固定使用PCLK时钟,只有开启和关闭的问题,不存在其它时钟源选择
juliestephen 发表于 2022-10-23 18:15 | 显示全部楼层
STM32的RTC 怎么用才能稳定
saservice 发表于 2022-10-23 18:35 | 显示全部楼层
stm32 RTC 掉电后数据保存在哪里
sheflynn 发表于 2022-10-23 19:04 | 显示全部楼层
STM32 RTC_SetAlarm可设置的最大值为多少
i1mcu 发表于 2022-10-23 19:29 | 显示全部楼层
stm32芯片自带的RTC和DS1302的实时时钟区别大不大
houjiakai 发表于 2022-10-23 20:06 | 显示全部楼层
STM32如果用不到RTC,备用电源用接吗?  
abotomson 发表于 2022-10-23 21:03 | 显示全部楼层
stm32的rtc外接纽扣电池电压多少?
gygp 发表于 2022-10-24 17:06 | 显示全部楼层
STM32的RTC能产生毫秒级的中断吗   
sdlls 发表于 2022-10-24 17:57 | 显示全部楼层
STM32 我想问下我的RTC程序掉电后时间又变为初始值,但电池电压是3V电路也没问题是怎么回事
uytyu 发表于 2022-10-24 18:53 | 显示全部楼层
STM32的RTC为什么不能重新配置时间  
kmzuaz 发表于 2023-2-4 18:26 | 显示全部楼层
stm32CubeMX默认填入的分频是使用32.768KHz的
wangdezhi 发表于 2023-2-6 16:35 | 显示全部楼层
STM32Cube MX如何设置外部高速时钟频率
pentruman 发表于 2023-2-14 12:03 | 显示全部楼层
stm32hal库rtc设置出错
robertesth 发表于 2023-2-16 20:41 | 显示全部楼层
通过STM32CubeMX进行简单配置生成HAL库实现内部晶振RTC。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1668

主题

5858

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部