leebai_001的STM32年月日计算程序是不是有问题呢?

licaiyanding   2007-12-23 14:52 楼主
以前的帖子找不到了,在这里说一下
计算时分秒:
void Time_GetValue(u32 TimeVar) 
{
  u32 THH = 0, TMM = 0, TSS = 0;
  /* Compute  hours */
  THH = TimeVar/3600;
  /* Compute minutes */
  TMM = (TimeVar % 3600)/60;
  /* Compute seconds */
  TSS = (TimeVar % 3600)% 60;
  RTHour=(uchar)THH;
  RTMinute=(uchar)TMM;
  RTSecond=(uchar)TSS;
}
其中THH = TimeVar/3600;是时的计算吧,
但这样的结果是0到1193046,不是我们想要的结果吧
是不是要模上24呢?
THH = (TimeVar/3600)%24;
可能有我没弄明白的地方,请leebai_001兄见谅

回复评论 (9)

我的理解

                                 TimeVar/3600輸出的結果大於24,這樣也可以做年份.如果你唔用年份處理,可以到24:00:00計算器複位為00:00:00就OK.
点赞  2007-12-23 22:07

俺在这方面很有"烟酒"~~~等几天搞定RTC时一定写个作文~~~

                                  
点赞  2007-12-23 22:17

呵呵,楼上玩的怎么样了,玩的是英蓓特的板子?

                                  
点赞  2007-12-23 22:52

这个问题确实没有讲清楚

正常的程序,在开始设置好年月日时分秒后,就会产生一个RTC的起始值。当该数值累计到跨越23:59:59秒时候,就会出现一楼所提出的时分秒计算溢出问题。
在实际应用中,如果出现了时间跨越后,就要先消除该跨越。那个时间计算算法在应用中,还有个环节就是需要将RTC的值重新设置到00:00:00,这是在算法中忘记写出来的。
关于时分秒溢出问题的解决方法:
方法一:先调用年月日计算程序,计算出年月日的变化,然后将RTC重新设置。也就是二楼提出的将24:00:00改变到00:00:00。这样做就需要向RTC重新写入初始值。这个操作如果不能很好把握写入时间的话,会造成写入的时间值影响到实际的时间记数值(可能会引入写入误差),不算是个好方法。

方法二:只计算累积的时间值。
        当前时间=起始时间+累计时间
        累计时间=RTC当前数值-RTC起始值
        该累计时间如果超过1天,实现年月日的进位,不足一天的用来实现时分秒的计算。也就是说Time_GetValue(TimeVar)的参数实际上给的是不足一天的余量,而不是当前RTC的实际值。
        该算法的缺点是如果要获得当前时间必须要计算出来,而且程序运行所用的时间也会随着日期的累积不断的增加,也存在些问题,可能需要算法来折中。
对于该实时时钟的用法,上面的方法还是比较笨拙,可能还有更加方便的方法。大家可以探讨一下。

        
点赞  2007-12-24 09:16

6楼 huj 

我也提些建議吧.

關於向RTC重新寫入初值的問題,leebai_001所講的是寫入的時機的問題,因寫入會改變時間,控制不好就會時間精度出現問題.
1.在RTC秒中斷裏更變RTC值,先用 RTC_WaitForLastTask();再轉換.
2.不理會年份,也就是RTC不複位.但不理會年份,這樣就沒了時間精度改變的問題.

以上是我的一點點意見.
点赞  2007-12-24 09:32

目前想到的办法也就是5楼的了

                                  
点赞  2007-12-24 09:41

为什么要频繁地写RTC呢?


首先,请看另一个帖子的讨论:STM32F103的RTC有些鸡肋了

根据这个帖子中讨论的方法,你只需要把RTC的计数设置为秒计数,把计数器为全0的值定义为某个特定的日期和时间。这样设置之后,只要RTC的电池不掉电,不必再重复地设置RTC的工作状态,每次只需读出RTC计数器的数值,稍加计算即可得到真实的日期和时间。

例如:假定计数器为全0为2008年1月1日0时0分0秒。
1)如果计数器的读数为0x00001000,则它对应的时间为2008年1月1日 1:08:16,因为  1:08:16相对0:00:00间隔4096(0x1000)秒。

2) 如果计数器的读数为0x00123456,即与2008年1月1日0:00:00间隔1193046秒,计算如下:
每小时3600秒,每天86400秒
1193046 / 86400=13  对应2008年1月14日
1193046 % 86400 = 69846
69846 / 3600 = 19    对应19时
69846 % 3600 = 1446
1446 / 60 = 24   对应24分
1446 % 60 = 6  对应6秒
因此,计数器的读数为0x00123456对应2008年1月14日19:24:06。

根据这个说明,程序应该不难写吧!
 
如果要求更精确的计时,可以把计数器设置为1/10秒计数等,计算原理照旧。
点赞  2007-12-24 10:46

一声叹息

                                  
点赞  2007-12-24 11:01

楼上大侠为何事叹息?

                                 ????
点赞  2007-12-24 11:07
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复