解决STM32F1 系列复位后RTC日期为2000-01-01_stm32f1 复位后rtc日期不对-程序员宅基地

技术标签: 经验  

问题:

STM32F1中RTC 不像 F4中,是一个单独模块。其就是一个计数器,查看HAL库中时间和日期的设置发现,在日期设置的时候,HAL库并没有将日期换算为计数器的值。

库源码如下

日期设置:

HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
{
  uint32_t counter_time = 0U, counter_alarm = 0U;
  
  /* Check input parameters */
  if((hrtc == NULL) || (sTime == NULL))
  {
     return HAL_ERROR;
  }
  
 /* Check the parameters */
  assert_param(IS_RTC_FORMAT(Format));
  
  /* Process Locked */ 
  __HAL_LOCK(hrtc);
  
  hrtc->State = HAL_RTC_STATE_BUSY;
  
  if(Format == RTC_FORMAT_BIN)
  {
    assert_param(IS_RTC_HOUR24(sTime->Hours));
    assert_param(IS_RTC_MINUTES(sTime->Minutes));
    assert_param(IS_RTC_SECONDS(sTime->Seconds));


    counter_time = (uint32_t)(((uint32_t)sTime->Hours * 3600U) + \   //HAL库这里计算的时间,后面写入计数器的
                        ((uint32_t)sTime->Minutes * 60U) + \                         //也就是这个值
                        ((uint32_t)sTime->Seconds));  
  }
  else
  {
    assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(sTime->Hours)));
    assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(sTime->Minutes)));
    assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(sTime->Seconds)));


    counter_time = (((uint32_t)(RTC_Bcd2ToByte(sTime->Hours)) * 3600U) + \
              ((uint32_t)(RTC_Bcd2ToByte(sTime->Minutes)) * 60U) + \
              ((uint32_t)(RTC_Bcd2ToByte(sTime->Seconds))));   
  }


  /* Write time counter in RTC registers */
  if (RTC_WriteTimeCounter(hrtc, counter_time) != HAL_OK)  //更新计数器,并没设计到日期
  {
    /* Set RTC state */
    hrtc->State = HAL_RTC_STATE_ERROR;
    
    /* Process Unlocked */ 
    __HAL_UNLOCK(hrtc);
    
    return HAL_ERROR;
  }
  else
  {
    /* Clear Second and overflow flags */
    CLEAR_BIT(hrtc->Instance->CRL, (RTC_FLAG_SEC | RTC_FLAG_OW));
    
    /* Read current Alarm counter in RTC registers */
    counter_alarm = RTC_ReadAlarmCounter(hrtc);


    /* Set again alarm to match with new time if enabled */
    if (counter_alarm != RTC_ALARM_RESETVALUE)
    {
      if(counter_alarm < counter_time)
      {
        /* Add 1 day to alarm counter*/
        counter_alarm += (uint32_t)(24U * 3600U);
        
        /* Write new Alarm counter in RTC registers */
        if (RTC_WriteAlarmCounter(hrtc, counter_alarm) != HAL_OK)
        {
          /* Set RTC state */
          hrtc->State = HAL_RTC_STATE_ERROR;
          
          /* Process Unlocked */ 
          __HAL_UNLOCK(hrtc);
          
          return HAL_ERROR;
        }
      }
    }
    
    hrtc->State = HAL_RTC_STATE_READY;
  
   __HAL_UNLOCK(hrtc); 
     
   return HAL_OK;
  }

}

HAL日期设置:

HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
{
  uint32_t counter_time = 0U, counter_alarm = 0U, days_elapsed = 0U, hours = 0U;
  
  /* Check input parameters */
  if((hrtc == NULL) || (sTime == NULL))
  {
     return HAL_ERROR;
  }

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/SiSheWuRu_1/article/details/80775651

智能推荐

protobuf之string bytes的区别_protobuf string与bytes比较-程序员宅基地

文章浏览阅读2.1k次。protobuf提供了多种基础数据格式,包括string/bytes。从字面意义上,我们了解bytes适用于任意的二进制字节序列。然而对C++程序员来讲,std::string既能存储ASCII文本字符串,也能存储任意多个\0的二进制序列。那么区别在哪里呢?同时在实际使用中,我们偶尔会看到类似这样的运行错误:1.[libprotobuf ERROR google/protobuf/wir..._protobuf string与bytes比较

流量红利消退,汽车互联网该怎么玩?-程序员宅基地

文章浏览阅读807次。 互联网流量红利消退已是不争的事实,各大互联网巨头也“八仙过海各显神通”,寻找新的出路。前不久,京东与新浪达成涵盖入口、产品层面的战略合作,此前,它还与百度、网易、360..._电商app如何增加新用户

Qt 自定义透明QMenu菜单样式设置图标并添加边距偏移_qt 透明菜单-程序员宅基地

文章浏览阅读3.8k次,点赞8次,收藏30次。效果图添加菜单QMenu* m_pAudioMenu = new QMenu(m_pMeetingWindow);m_pAudioMenu->setProperty("class", "blackMenu");m_pAudioMenu->setWindowFlags(m_pAudioMenu->windowFlags() | Qt::FramelessWindowHint);m_pAudioMenu->setAttribute(Qt::WA_TranslucentBack_qt 透明菜单

Qualcomm QXDM工具简介和log抓取_qxdm log-程序员宅基地

文章浏览阅读1.6w次,点赞3次,收藏54次。原址高通工具简介QXDM 简介QXDM 安装QXDM 激活QXDM 使用AT打开Diagnostic口QXDM 配置1 Message View ConfigurationMessage PacketsLog PacketsLog PacketsOTAEvent ReportsStrings2 Log View Config3 QXDM-保存配置文件4 QXDM-导入配置文件QPST 端口配置QX..._qxdm log

uni-app踩坑之canvas 绘制后不显示不报错_uniapp canvas画不出线-程序员宅基地

文章浏览阅读7k次,点赞7次,收藏6次。先上代码<canvas canvas-id='share' id="share"></canvas>js 部分我在onLoad 里面这么写的// 初始化canvasvar ctx = uni.createCanvasContext('share');// 绘制ctx.drawImage(imgPath, 0, 0, 300, 500)ctx.fillText(tetx, 100, 100)// ......微信小程序端没毛病,正常显示,但是!APP 端没_uniapp canvas画不出线

React中setState不及时生效的解决方法_react setstate 慢一步-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏6次。在你想更新state的地方,加一个setTimeout,setTimeout是同步的,带动state会立即更新,代码如下: setTimeout(() => { this.setState({ phone }) console.log(this.state.phone) }, 100);_react setstate 慢一步

随便推点

switch case java题目_javajava问题,题目要求用switch语句-程序员宅基地

文章浏览阅读79次。展开全部|参考代码:62616964757a686964616fe59b9ee7ad9431333431343639importjava.util.Scanner;publicclassExercise7{publicstaticvoidmain(String[]strings){Scannerinput=newScanner(System.in);intnumber_..._java语言switch编写:男生,超过18岁可以喝酒,没有超过18岁,喝饮料;女生,超过20

CSMA/CD最大/最小帧长 争用期_csma/cd争用期-程序员宅基地

文章浏览阅读9.4k次,点赞7次,收藏42次。CSMA/CD协议1.概念CSMA/CD (Carrier Sense Multiple Access/collision detection)MA(Multiple Access)多址接入CS(Carrier Sense)载波监听CD(collision detection)碰撞检测多址接入:多个主机连接在一条主线上,竞争使用主线。载波监听:边发送帧,边检测信道是否空闲。碰撞检测:各发送站边发送帧边检测碰撞,当发检测到碰撞发生,立即停止发送帧,等待一段时间后,再重新发送。最大帧长。_csma/cd争用期

Python中利用LSTM模型进行时间序列预测分析_lstm雷达信号分类python-程序员宅基地

文章浏览阅读6k次,点赞2次,收藏40次。时间序列模型时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征。这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺序的,同样大小的值改变顺序后输入模型产生的结果是不同的。举个栗子:根据过去两年某股票的每天的股价数据推测之后一周的股价变化;根据过去2年某店铺每周想消费人数预测下周来店消费的人数等等RNN 和 ..._lstm雷达信号分类python

VUEJS文件扩展名esm.js和common.js是什么意思-程序员宅基地

文章浏览阅读1.9w次,点赞5次,收藏15次。转载:https://segmentfault.com/q/1010000011452736vue.js : vue.js则是直接用在&lt;script&gt;标签中的,完整版本,直接就可以通过script引用。vue.common.js :预编译调试时,CommonJS规范的格式,可以使用require("")引用的NODEJS格式。vue.esm.js:预编译调试时, EcmaScr..._esm.js

Unity3D-关于使用了Metal的Graphic闪退问题_unity 关闭metal api-程序员宅基地

文章浏览阅读2.9k次。最近看到CrashReport中经常看到因为GfxDeviceMetal::InvalidateState()这里闪退_unity 关闭metal api

sqlite错误 database disk image is malformed 可解决_runtime error: database disk image is malformed (1-程序员宅基地

文章浏览阅读1.9w次。在网上找了很多资料,很多网友都提到这个问题是不可解决的,面对这个问题,只能作罢。但我不甘心这么丢失数据,最最后找到了一个解决方法。经测试,原来数据,全部保住。以下为原文。http://www.sunnyu.com/?p=201 SQLite有一个很严重的缺点就是不提供Repair命令。导致死亡提示database disk image is malfor_runtime error: database disk image is malformed (11)

推荐文章

热门文章

相关标签