MCU上的时间/日期实施

时间:2016-03-31 11:58:23

标签: c date time microcontroller elapsedtime

我正在研发MCU,我的目标是在MCU上实现时间/日期。

我使用一个每秒滴答的计时器并将其存储在uint32_t count上,该计时器有足够的大小存储136年。我希望2000作为参考,max应该是2099。

这是我的数据结构:

typedef struct
{
uint8_t sec;        // Seconds. [0-60] (1 leap second) 
uint8_t min;        // Minutes. [0-59] 
uint8_t hour;       // Hours.   [0-23] 
uint8_t day;        // Day.     [1-31] 
uint8_t month;      // Month.   [0-11] 
uint8_t year;       // Year - from 2000.  [00-99] 
} osal_time_t;

使用最低资源正确地将秒数(uint32_t count)转换为最小/小时/日/月/年的最佳方法是什么?

时间,小时和年份似乎很简单但是白天变得棘手,28-29-30-31天,而且每4年就有29天。

我看到linux源代码实现,但我认为它是一个操作系统,而不是一个简单的MCU。

任何人都可以暗示我应该在MCU中使用哪种算法,以便它需要min。资源?

例如,使用什么算法来计算此http://www.mathcats.com/explore/elapsedtime.html

如果您有任何代码段,我将不胜感激,如果您可以分享它。

2 个答案:

答案 0 :(得分:1)

你必须做数学,没有其他办法解决它。您正在从基数2转换为基数10(基数为10的基数为60)。

同样对于一个月的日子来说,你也必须研究这个问题,每个月都有几天的表格并处理闰年。

进行数学计算的替代方法是改变计算方式,使用更多内存但计算量更少。基本上是BCD方法。当秒数从9滚动到10然后增加数十秒并将秒数设置为0.重复一直到日期。或者在59个卷到零的中途和秒数达到零并且增加分钟...然后执行基础10的东西以将几十分钟与几分钟小时分开。如果你没有分歧,你可以用一张桌子。

答案 1 :(得分:1)

这不是编程问题,因为只有微控制器才能可靠地完成这项工作。内部RC振荡器太不准确,即使您使用高精度外部晶体振荡器,它也会随时间漂移并随温度变化。

唯一正确的解决方案是在硬件上添加实时时钟电路,最好是与备用电池一起使用。如何与实时时钟电路通信是特定于硬件的。

最好在https://electronics.stackexchange.com/上将问题放在边境地区的硬件上。