打印

香版主请进。stm32F2的RTC,日期和时间不是同时更新的?

[复制链接]
10488|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
为什么在使用STM32F207的RTC的Date更新和时间更新不是同步的。超过24时后Date不是同时加一,而是在某个时候才加1.那么奇怪的。请高手指教
初始化涵数

u8  RTC_init(void)
{
  /* Enable the PWR clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  /* Allow access to RTC */
  PWR_BackupAccessCmd(ENABLE);

/* LSI used as RTC source clock */
/* The RTC Clock may varies due to LSI frequency dispersion. */   
  /* Enable the LSI OSC */
  RCC_LSICmd(ENABLE);

  /* Wait till LSI is ready */  
  while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);

  /* Select the RTC Clock Source */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

  /* Enable the RTC Clock */
  RCC_RTCCLKCmd(ENABLE);

  /* Wait for RTC APB registers synchronisation */
  RTC_WaitForSynchro();

  /* Calendar Configuration with LSI supposed at 32KHz */
  RTC_InitStructure.RTC_AsynchPrediv = 0x02;
//32KHz/16=2KHz ,下面再分频2分成1ms左右
  RTC_InitStructure.RTC_SynchPrediv
=  0x01; /* (32KHz / 16) - 1 = 0xFF*/
  RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
  RTC_Init(&RTC_InitStructure);  

  /* Enable Wakeup Counter */
  RTC_WakeUpCmd(ENABLE);
}


int main(void)
{
  RTC_TimeTypeDef TI;
  RTC_DateTypeDef DA;
  LCD_PinInit();
  LCD_Init();
  RTC_init();
  while(1)
  
{

RTC_GetDate(RTC_Format_BIN,&DA);

RTC_GetTime(RTC_Format_BIN,&TI);


LCD_3bit(0,0,DA.RTC_Year,YELLOW, BLACK, 0);

LCD_3bit(32,0,DA.RTC_Month,YELLOW, BLACK, 0);

LCD_3bit(64,0,DA.RTC_WeekDay,YELLOW, BLACK, 0);

LCD_3bit(96,0,DA.RTC_Date,YELLOW, BLACK, 0);

LCD_3bit(0,16,TI.RTC_Hours,YELLOW, BLACK, 0);

LCD_3bit(32,16,TI.RTC_Minutes,YELLOW, BLACK, 0);

LCD_3bit(64,16,TI.RTC_Seconds,YELLOW, BLACK, 0);
  
}  

}
沙发
香水城| | 2012-4-11 16:39 | 只看该作者
是否能再说清楚些?

你的意思是说:Date不是在每天的23点59分59秒之后进位到0点0分0秒时改变的?  如果是这样,你看到的是在什么时候改变呢?

使用特权

评论回复
板凳
wendyfox|  楼主 | 2012-4-11 16:46 | 只看该作者
正常的Date在23点59分59秒之后就马上加1,但是现在我这样读取和设置,发现Date加1是在第二天某个时段加,有时是马上更新,有时是1点更新,有时是5点更新,不定时的。时分秒就很正常。

使用特权

评论回复
地板
香水城| | 2012-4-11 16:53 | 只看该作者
正常的Date在23点59分59秒之后就马上加1,但是现在我这样读取和设置,发现Date加1是在第二天某个时段加,有时是马上更新,有时是1点更新,有时是5点更新,不定时的。时分秒就很正常。 ...
wendyfox 发表于 2012-4-11 16:46


按你说的好像很玄乎,你能肯定你的操作正确吗?

使用特权

评论回复
5
wendyfox|  楼主 | 2012-4-11 16:57 | 只看该作者
date每天都会更新一次,但是更新的时间不是在23点59分59秒,而是在第二天某一个时刻,而且确定会补加回去。感觉时分秒是一齐的,年月日是一齐的,但是两个又连不在一起

使用特权

评论回复
6
wendyfox|  楼主 | 2012-4-11 17:01 | 只看该作者
按你说的好像很玄乎,你能肯定你的操作正确吗?
香水城 发表于 2012-4-11 16:53


也没什么操作,就是初始化之后就不断在读TIME和Date所有的参数。初始化和运行代码都发上来了。本来觉得很简单的东西。现在却卡住了。

使用特权

评论回复
7
wendyfox|  楼主 | 2012-4-11 17:05 | 只看该作者
我不需要设Alarm,我只需要正确读回时间当系统时钟就可以了。

使用特权

评论回复
8
wendyfox|  楼主 | 2012-4-11 17:36 | 只看该作者
我知道了。读时间和日期要反过来。不然不准,谢谢香版本的回复

使用特权

评论回复
9
香水城| | 2012-4-11 18:15 | 只看该作者
我知道了。读时间和日期要反过来。不然不准,谢谢香版本的回复
wendyfox 发表于 2012-4-11 17:36


嘿嘿,读RTC也是有很多需要注意的事项哦:

STM32F2_Reading_the_calendar.GIF (69.37 KB )

STM32F2_Reading_the_calendar.GIF

使用特权

评论回复
10
txcy| | 2012-4-11 18:55 | 只看该作者
还是要仔细看看手册

使用特权

评论回复
11
lut1lut| | 2012-4-12 10:39 | 只看该作者
STM32的RTC从F1的简单计数器进化到F2、F4、32L的真正硬件RTC。

由于硬件RTC的“年月日”和“时分秒”信息分别在两个32位寄存器中,因此读取日历信息要读取2个寄存器。那么就有个一致性的问题。

因此STM32设计:用户读取“时分秒”寄存器时,会硬件锁定“年月日”寄存器的值。这样保持时刻的一致性。

那么,如果连续10次读取“时分秒”后,再读“年月日”的值,读出的值是刚才第一次读取“时分秒”的日期,非当前的日期;需要软件复位RST,再等待RSF硬件置位后,读取的“年月日”才正确。主要就是在跨0点的时候才要注意,容易造成日期还是前一天,时刻已经是新一天的了。

使用特权

评论回复
12
zxm19820916| | 2014-6-10 17:35 | 只看该作者
Mark!!!

使用特权

评论回复
13
cocoasuny| | 2015-7-17 17:58 | 只看该作者
不错,在做的时候也遇到了这个问题

使用特权

评论回复
14
Zpc| | 2015-7-20 17:13 | 只看该作者
L152,从STOP唤醒后读取也出现这个问题,加了等待同步的代码也不行,不知道哪里有问题
    __HAL_RTC_WRITEPROTECTION_DISABLE(&hrtc);
    HAL_RTC_WaitForSynchro(&hrtc);
    __HAL_RTC_WRITEPROTECTION_ENABLE(&hrtc);
    HAL_RTC_GetTime(&hrtc, &SysTime, RTC_FORMAT_BIN);
    HAL_RTC_GetDate(&hrtc, &SysDate, RTC_FORMAT_BIN);

使用特权

评论回复
15
wolf19860612| | 2017-1-17 22:25 | 只看该作者
我也遇到这问题了,还是手册没读仔细呀。谢谢了

使用特权

评论回复
16
freeelectron| | 2017-6-16 11:28 | 只看该作者
楼主,我也遇到这个问题了,你是怎么解决的?

使用特权

评论回复
17
moyanming2013| | 2017-6-16 11:54 | 只看该作者
lut1lut 发表于 2012-4-12 10:39
STM32的RTC从F1的简单计数器进化到F2、F4、32L的真正硬件RTC。

由于硬件RTC的“年月日”和“时分秒”信息 ...

恩,学习了。

使用特权

评论回复
18
caojingcaojing| | 2018-5-7 15:29 | 只看该作者
Zpc 发表于 2015-7-20 17:13
L152,从STOP唤醒后读取也出现这个问题,加了等待同步的代码也不行,不知道哪里有问题
    __HAL_RTC_ ...

解决了吗? 我加了 RTC_WaitForSynchro 还是出现一次  读出来不对。

使用特权

评论回复
19
caojingcaojing| | 2018-5-7 23:14 | 只看该作者
Zpc 发表于 2015-7-20 17:13
L152,从STOP唤醒后读取也出现这个问题,加了等待同步的代码也不行,不知道哪里有问题
    __HAL_RTC_ ...

我也加了,最后没有解决 。25057543扣

使用特权

评论回复
20
广东大掌柜| | 2019-12-23 13:49 | 只看该作者
香水城 发表于 2012-4-11 16:53
按你说的好像很玄乎,你能肯定你的操作正确吗?

楼主,我是先读日期,再读时间,发现每天的第一次读,都是昨天的日期,时间倒是对的

使用特权

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

本版积分规则

16

主题

33

帖子

0

粉丝