RTC

STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+RTC(修复官方例程日期不更新bug)

首先说明下开发条件:

1、开发板:秉火霸道,STM32F103ZET

2、软件:Cubemx V4.23(F1 V1.60库) 


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


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


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


解决办法:

1、cubemx设置:

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

日期和月份二进制.JPG

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,还是需要我们在使用时时刻保持警惕!

已邀请:

admin

赞同来自: 开始现在-s

多谢分享,写的很棒

开始现在-s

赞同来自:

感谢

没用啊,断电过了一天之后,日期就没有更新了(日期保存的是昨日日期)


HaoYou

赞同来自:

断电时间不能过0点,超过0点,日期还是昨天的日期

摩天大楼

赞同来自:

就是有个毛用呀!过0点就木有了

要回复问题请先登录注册