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设置:
当然你也可以选择二进制设置,然后将生成的代码月份和星期都改成二进制显示,这样就可以从源头上解决问题:
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,还是需要我们在使用时时刻保持警惕!