我尚未使用RTC,因此我不太确定读取实时时钟的“正常”方式。我曾想过几种不同的方法,但希望对此有所建议。
到目前为止,以下是我想到的阅读和使用时间的方法:
- 获取开机时的日期和时间并保存到RAM,然后通过使用计时器中断每秒增加RAM值等。然后,只要需要知道日期/时间,代码就会使用RAM中的值。
- 通过使用计时器中断,每秒查询RTC并将接收到的日期和时间复制到RAM。同样,该代码将在需要知道日期/时间时使用RAM中的值。
- 每当我需要找出时间时,查询RTC并直接使用它的响应。
哪种方法最好?
我尚未使用RTC,因此我不太确定读取实时时钟的“正常”方式。我曾想过几种不同的方法,但希望对此有所建议。
到目前为止,以下是我想到的阅读和使用时间的方法:
哪种方法最好?
Answers:
我将使用第四个选项。
大多数RTC芯片都可以选择输出1秒脉冲。您应该将该脉冲连接到MCU上的允许中断的输入。
这种安排使您可以精确到 RTC的秒数,而无需主动读取RTC的开销。
某些RTC(例如MC68HC68T1 [承认几乎没有人可以再使用])将在读取时暂停其内部计数,以提供一致的响应。必须尽可能少地阅读它们,以最大程度地减少干扰。从它们读取一次,然后使用定时器中断来更新存储在MCU RAM中的时间值。
我将假设RTC是具有自己晶体的独立芯片,或者是与您的微控制器集成的模块,该模块又具有与主时钟不同的时间源(例如32 kHz晶体)。RTC的时间源比微控制器的时间源更准确。
为了确定需要多长时间读取一次RTC,需要弄清楚主时钟可能出现的最大误差。例如,如果将主晶体指定为20 ppm,则等于0.002%。因此,仅基于主时钟源的时钟每天可能会漂移0.00002 * 3600 * 24 = 1.728秒。
因此,如果您每天仅读取RTC两次,并且在两次之间使用计时器中断增加时间,那么您永远不会离开一秒钟以上-与RTC相比,永远不会超过一秒钟。
正如我之前假设的那样,如果您的RTC是具有自己晶体的独立芯片,或者是与您的微控制器集成的模块,那并不意味着它是正确的。RTC也可能有错误。例如,如果使用公差为5 ppm的32 kHz晶体(比10 ppm的晶体稍贵),则每天可能会偏离0.43秒,也可能每月偏离13秒。
为了解决这个问题,您需要调整RTC,在其中将校正因子写回到寄存器中。这样做将使您几乎将错误降至零。但是,当然,在进行调整时,您将必须有第三个外部时钟源作为参考。在美国一个极其精确的参考是60Hz的AC线,这是保证是恰好在连续午夜之间的24小时期间60 * 60 * 60 * 24(5184000)周期。为了使此功能有用,您必须在整个24小时内计时,因为60 Hz可能会在午夜之间漂移一些。
如果一个人的项目中已经装有GPS硬件,那么另一个出色的时间基准将是使用GPS(精度为10 ns)。
如果相反,您的RTC时间来自外部来源,例如蜂窝网络时间(AT + CCLK?呼叫)或使用NTP的网络时间服务器,那么您可以按原样使用RTC值,因为没有任何可“调整”的内容。