打印
[应用相关]

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

[复制链接]
1215|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设置:

使用特权

评论回复
板凳
jcky001|  楼主 | 2022-4-15 10:10 | 只看该作者
当然你也可以选择二进制设置,然后将生成的代码月份和星期都改成二进制显示,这样就可以从源头上解决问题:

使用特权

评论回复
地板
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);
       
  }

使用特权

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

不同的代码逻辑就代表了不同的策略

使用特权

评论回复
6
Bblythe| | 2022-10-7 15:29 | 只看该作者

确定好硬件原理图,硬件布线,最后才是软件的开发

使用特权

评论回复
7
Pulitzer| | 2022-10-7 18:28 | 只看该作者

ART2固定使用PCLK时钟,只有开启和关闭的问题,不存在其它时钟源选择

使用特权

评论回复
8
juliestephen| | 2022-10-23 18:15 | 只看该作者
STM32的RTC 怎么用才能稳定

使用特权

评论回复
9
saservice| | 2022-10-23 18:35 | 只看该作者
stm32 RTC 掉电后数据保存在哪里

使用特权

评论回复
10
sheflynn| | 2022-10-23 19:04 | 只看该作者
STM32 RTC_SetAlarm可设置的最大值为多少

使用特权

评论回复
11
i1mcu| | 2022-10-23 19:29 | 只看该作者
stm32芯片自带的RTC和DS1302的实时时钟区别大不大

使用特权

评论回复
12
houjiakai| | 2022-10-23 20:06 | 只看该作者
STM32如果用不到RTC,备用电源用接吗?  

使用特权

评论回复
13
abotomson| | 2022-10-23 21:03 | 只看该作者
stm32的rtc外接纽扣电池电压多少?

使用特权

评论回复
14
gygp| | 2022-10-24 17:06 | 只看该作者
STM32的RTC能产生毫秒级的中断吗   

使用特权

评论回复
15
sdlls| | 2022-10-24 17:57 | 只看该作者
STM32 我想问下我的RTC程序掉电后时间又变为初始值,但电池电压是3V电路也没问题是怎么回事

使用特权

评论回复
16
uytyu| | 2022-10-24 18:53 | 只看该作者
STM32的RTC为什么不能重新配置时间  

使用特权

评论回复
17
kmzuaz| | 2023-2-4 18:26 | 只看该作者
stm32CubeMX默认填入的分频是使用32.768KHz的

使用特权

评论回复
18
wangdezhi| | 2023-2-6 16:35 | 只看该作者
STM32Cube MX如何设置外部高速时钟频率

使用特权

评论回复
19
pentruman| | 2023-2-14 12:03 | 只看该作者
stm32hal库rtc设置出错

使用特权

评论回复
20
robertesth| | 2023-2-16 20:41 | 只看该作者
通过STM32CubeMX进行简单配置生成HAL库实现内部晶振RTC。

使用特权

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

本版积分规则

1522

主题

4615

帖子

6

粉丝