打印
[其他ST产品]

STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+RTC(修复...

[复制链接]
850|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
首先说明下开发条件:
1、开发板:秉火霸道,STM32F103ZET
2、软件:Cubemx V4.23(F1 V1.60库)

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

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

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

使用特权

评论回复
沙发
七毛钱|  楼主 | 2022-4-14 10:07 | 只看该作者
本帖最后由 七毛钱 于 2022-4-14 10:09 编辑

1、cubemx设置:



当然你也可以选择二进制设置,然后将生成的代码月份和星期都改成二进制显示,这样就可以从源头上解决问题:

使用特权

评论回复
板凳
七毛钱|  楼主 | 2022-4-14 10:11 | 只看该作者
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);
       
  }
3、联系方式:微信Startingray,本人准备将cubemx的小bug解决的过程记录下来,也是给爱好者一点启示,欢迎微信和我沟通,共同进步!个人觉得Cubemx是未来的发展方向,可以使我们避免很多小错误,但是由于现在软件版本之间的兼容性,加上不同版本库之间存在的bug,还是需要我们在使用时时刻保持警惕!

使用特权

评论回复
地板
laocuo1142| | 2022-4-15 10:00 | 只看该作者
过了零点,就没用了,为啥啊?

使用特权

评论回复
5
hellosdc| | 2022-5-29 08:38 | 只看该作者
有没有完整的教程的?

使用特权

评论回复
6
Pulitzer| | 2022-10-5 07:29 | 只看该作者

这是个再正常不过的coding习惯

使用特权

评论回复
7
Uriah| | 2022-10-5 14:30 | 只看该作者

CPLD解密,DSP解密都习惯称为单片机解密

使用特权

评论回复
8
Bblythe| | 2022-10-5 17:29 | 只看该作者

超过变量128后必须使用compact模式编译

使用特权

评论回复
9
Pulitzer| | 2023-4-1 07:29 | 只看该作者

CPU借助于APB总线访问相关寄存器达到对I2C1工作模块的控制

使用特权

评论回复
10
周半梅| | 2023-4-1 08:32 | 只看该作者

大部分能够读取或者识别Flash上的数据就能够获得Firmware文件

使用特权

评论回复
11
童雨竹| | 2023-4-1 09:25 | 只看该作者

用 Git 来做自己的文档版本管理工具

使用特权

评论回复
12
Wordsworth| | 2023-4-1 10:28 | 只看该作者

做多层板可将做好的两块双面板用特制的粘合剂“压合”起来

使用特权

评论回复
13
Clyde011| | 2023-4-1 11:31 | 只看该作者

访问时采用不同的指令,所以并不会占用 RAM 空间

使用特权

评论回复
14
万图| | 2023-4-1 13:27 | 只看该作者

根据色彩的变化记录每一行的颜色跳变点,由此识别出车牌区域。

使用特权

评论回复
15
Uriah| | 2023-4-1 14:30 | 只看该作者

使用Optional简化if判空

使用特权

评论回复
16
帛灿灿| | 2023-4-1 16:26 | 只看该作者

控制单元:从内存中提取指令并解码执行

使用特权

评论回复
17
Bblythe| | 2023-4-1 17:29 | 只看该作者

结构化模块化的程序设计的思想,使最基本的要求

使用特权

评论回复
18
周半梅| | 2023-4-1 19:25 | 只看该作者

我甚至认为它很好地 辅助了软件设计。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

341

主题

2327

帖子

4

粉丝