打印
[STM32F2]

stm32F205的RTC有bug,日期读出来是8月0号,有遇到过的吗

[复制链接]
2352|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sheldon_zhang|  楼主 | 2017-7-31 18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是库自带的stm32f2xx_RTC.c,单步仿真发现 tmpreg =0x00170800  计算出来的日期是17年8月0号,
正确日期是7月31号,其他的时间小时分钟秒都是对的,有谁遇到过类似的吗?


/**
  * @brief  Get the RTC current date.
  * @param  RTC_Format: specifies the format of the returned parameters.
  *          This parameter can be one of the following values:
  *            @arg RTC_Format_BIN: Binary data format
  *            @arg RTC_Format_BCD: BCD data format
  * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure that will
  *                        contain the returned current date configuration.     
  * @retval None
  */
void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct)
{
  uint32_t tmpreg = 0;

  /* Check the parameters */
  assert_param(IS_RTC_FORMAT(RTC_Format));
  
  /* Get the RTC_TR register */
  tmpreg = (uint32_t)(RTC->DR & RTC_DR_RESERVED_MASK);

  /* Fill the structure fields with the read parameters */
  RTC_DateStruct->RTC_Year = (uint8_t)((tmpreg & (RTC_DR_YT | RTC_DR_YU)) >> 16);
  RTC_DateStruct->RTC_Month = (uint8_t)((tmpreg & (RTC_DR_MT | RTC_DR_MU)) >> 8);
  RTC_DateStruct->RTC_Date = (uint8_t)(tmpreg & (RTC_DR_DT | RTC_DR_DU));
  RTC_DateStruct->RTC_WeekDay = (uint8_t)((tmpreg & (RTC_DR_WDU)) >> 13);  

  /* Check the input parameters format */
  if (RTC_Format == RTC_Format_BIN)
  {
    /* Convert the structure parameters to Binary format */
    RTC_DateStruct->RTC_Year = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Year);
    RTC_DateStruct->RTC_Month = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Month);
    RTC_DateStruct->RTC_Date = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Date);
    RTC_DateStruct->RTC_WeekDay = (uint8_t)(RTC_DateStruct->RTC_WeekDay);   
  }
}
沙发
Xflyan| | 2017-7-31 21:31 | 只看该作者
这个日期是你自己写进去的吧?
你把日期时间设成17.07.30.23.59.55,看看10秒后读出来对不对

使用特权

评论回复
板凳
zhuotuzi| | 2017-7-31 23:08 | 只看该作者
楼上方法科学。试试看。

使用特权

评论回复
地板
sheldon_zhang|  楼主 | 2017-8-1 09:11 | 只看该作者
Xflyan 发表于 2017-7-31 21:31
这个日期是你自己写进去的吧?
你把日期时间设成17.07.30.23.59.55,看看10秒后读出来对不对 ...

日期是在第一次上电后,从网络获取的标准时间,写进入的,且只写一次。以后就rtc自己运行了,只进行读,不进行写操作。我是六月份的时候,写好的程序,然后一直运行都没有问题。然后就是在昨天(7月31号)的时候,服务器在解析我传过去的数据包报错,最后才发现是rtc的时间出现了异常。

使用特权

评论回复
5
Xflyan| | 2017-8-1 09:44 | 只看该作者
sheldon_zhang 发表于 2017-8-1 09:11
日期是在第一次上电后,从网络获取的标准时间,写进入的,且只写一次。以后就rtc自己运行了,只进行读, ...

既然程序里有写的过程,那就是有写错的可能,第一次上电怎么判断时间需要重写的?
我前面的方法有没有试过,如果时间没有自己跑错的,那肯定就是程序里你写错了

使用特权

评论回复
6
sheldon_zhang|  楼主 | 2017-8-1 13:47 | 只看该作者
Xflyan 发表于 2017-8-1 09:44
既然程序里有写的过程,那就是有写错的可能,第一次上电怎么判断时间需要重写的?
我前面的方法有没有试 ...

板子上的rtc第一次用的时候,时间肯定是不准的,是需要校准写入正确的时间。这第一次校准写入的时候,我是用的从网络获取的标准时间,在第一次写完成以后,我会在外挂flash里面写入一个标识位0X44。
每次重新上电的时候,我会检测flash上的标志位是否是0x44。假如不是0x44的话,说明,这是一块新的板子,没有校验过rtc,需要写入。假如是0x44,说明,板子上的rtc已经校验过了,无需重新校验。 flash上的标志位,不存在没误操作的过程。 这种方法来判断第一次上电是否需要写入,可行吗?
r

使用特权

评论回复
7
sheldon_zhang|  楼主 | 2017-8-1 13:55 | 只看该作者
Xflyan 发表于 2017-8-1 09:44
既然程序里有写的过程,那就是有写错的可能,第一次上电怎么判断时间需要重写的?
我前面的方法有没有试 ...

板子上的SD的文件系统记录显示,rtc的时间在7月31号之前,时间都是正确的,就是在7月31号的时间,记录的日期变成了8月0号。今天在调试的时候,日期是8月1号。
除了31号这个日期,其他的时间都是正确的。这个其他时间都正常,就单单日期错了,概率太小了吧?
8月0号这个日期也很怪异?怀疑是不是F2自带的RTC的库,存在bug?是否有用过的遇到过这个问题。
F1的RTC和 F2的RTC差别很大,参考价值小。

使用特权

评论回复
8
Xflyan| | 2017-8-2 10:22 | 只看该作者
sheldon_zhang 发表于 2017-8-1 13:55
板子上的SD的文件系统记录显示,rtc的时间在7月31号之前,时间都是正确的,就是在7月31号的时间,记录的 ...

F2/F3/F4/L系列的RTC是一致的,F1是最早的设计,所以区别比较大,用外挂FLASH来判断RTC可能不是那么合理,如果RTC掉电,但是FLASH已经更新过标志位,那你的时间就一直是错的了
RTC域有备份寄存器的,更新标志位一般是放在这里的,如果RTC掉电,标志位也一起丢了
用过F4/L1系列的RTC,没有发现过这样的问题,时间更新不是软件或者库去执行的,而是内部硬件电路做好的,而且7.31那天我的F4的时间也一直是正常的
所以要你做那个实验,如果你找两块或三块板子来测试,看看有没有更新错误,有再来讨论,如果没有错误,那就再仔细检查你的软件吧

使用特权

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

本版积分规则

1

主题

6

帖子

1

粉丝