c-MCU上的时间/日期实现



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

我使用了一个每秒滴答作响的计时器,并将其存储在uint32_t count上,该计时器的大小足以存储136年。我想要2000作为参考,最大值应该是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天,2月是每4年29日。

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

有人能提示我应该在MCU中使用什么样的算法,这样它需要最少的资源吗?

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

如果您有任何代码片段,如果您能分享,我将不胜感激。

你只需要做数学运算,没有其他方法。你正在从基数2转换到基数10(基数60用基数10表示)。

同样,对于月日的事情,你也必须仔细研究,用一张每月天数的表格来处理闰年。

计算的另一种选择是改变你的计数方式,使用更多的内存,但计算量更少。基本上是BCD方法。当秒数从9滚动到10时,增加数十秒并将秒数设置为0。一直重复到日期。或者在59滚到零并增加分钟的情况下,在中途和秒之间相遇。。。然后做10个基本的东西,把十分和几秒、几分钟、几小时分开。如果你没有分歧,你可以用一张桌子。

这不是编程问题,因为仅用微控制器无法可靠地实现这一点。内部RC振荡器太不准确了,即使你使用高精度的外部晶体振荡器,它也会随着时间的推移而漂移,并可能随着温度的变化而变化。

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

最好问这样的问题,这些问题都是关于硬件的https://electronics.stackexchange.com/.

最新更新