STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+RTC(修复官方例程日期不更新bug)
来源:互联网 发布:装安卓平面设计软件 编辑:程序博客网 时间:2024/05/21 10:22
首先说明下开发条件:
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,还是需要我们在使用时时刻保持警惕!
- STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+RTC(修复官方例程日期不更新bug)
- Kindeditor部分bug说明及修复(不定期更新 )
- Bug大全(不定时更新ing)
- TweakBit PCRepairKit(系统修复工具)官方正式版V1.8.3.6下载 | PCRepairKit破解版
- bug修复心得(1)
- 基于mini2440的RTC读写(裸机)
- 前后背景求取(opencv官方例程)
- STM32L152RC+cubeMX+FreeRTOS学习(1)
- 基于STM32 discovery开发板基础例程的学习(1)- IO_Toggle
- 2048(已更新,所有bug均已修复)【更美观的外形】
- Keli5 打开Cypress CY7C68013A(51单片机)官方开发包例程
- TensorFlow官方教程学习记录(更新中,更新日期:2017-07-19)
- android AndFix热补丁框架(不发版本,修复线上bug)
- STM32开发板基础教程(十) - RTC初探(转帖)
- Cordova webapp实战开发:(7)如何通过简单的方法做到,不重新发布APP来修复bug、增加功能、或者躲开苹果的一些严格审核?
- 嵌入式开发第49天(RTC)
- asp.net 开发BUG ,不定时更新
- bug和bug修复--Css学习笔记(九)
- Mysql数据库迁移
- 相机校准和3D重建
- 工作日常--内存和性能
- python基础知识
- linux变量操作
- STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+RTC(修复官方例程日期不更新bug)
- 设计模式学习
- 会话技术-显示用户的上次访问时间(十七)
- 计组第四章-存储系统
- Restful
- sizeof(数组名)和sizeof(指针)
- TensorFlow tf.Variable()与tf.get_variable()的简单介绍
- shell脚本之创建文件,自动复制粘贴文件
- MFC常用函数