我使用的是恩智浦LPC17xx系列微控制器(LPC1759和LPC1768)。
如何确定RTC是否正在运行?
我正在进行测试
LPC_RTC->CCR & RTC_CCR_CLKEN
但似乎不太可靠。 打开我的设备时,我在3197年左右看到了值。
如何判断RTC是否正在运行且其值是否已损坏?
编辑:
我最终在RTC值中添加了一个简单的健全性检查:
bool DateTime::validate( const RTC_TIME_Type &time_info )
{
if ( time_info.YEAR > 2100
|| time_info.DOY > 366
|| time_info.MONTH > 12
|| time_info.DOM > 31
|| time_info.HOUR > 23
|| time_info.MIN > 59
|| time_info.SEC > 59 )
return false;
return true;
}
它在我的POST期间运行,如下所示。
答案 0 :(得分:3)
大约5年前,我在该芯片的祖父(LPC2148)上与RTC作战。如果您查看Yahoo LPC2000 group(它还包括LPC1000芯片),您将看到RTC&它的问题出现了很多。
无论如何,我现在要从记忆中走出来,但我认为我认为阅读状态寄存器不够可靠。也许问题在于,当电源被移除时,如果没有备用电池,事情就会被扰乱......
所以我记得在启动阶段我做了以下事情:
(1)启用RTC外设
(2)读取所有RTC寄存器。在固件中,具有“超出范围”的最小值和最小值。每个字段的最大值(例如年份必须至少为2005年,且不大于2030)
(3)如果任何值超出范围,重置日期&一些硬编码值的时间(例如2005年1月1日)(产品会让用户在启动后调整时间/日期)
(4)拍摄寄存器的快照;等待至少一秒钟(使用定时器外围设备测量时间),然后确保更改了值。在启动过程中,我可能已经走了这么远,以便设置值,以便1秒钟的滴答声/应该导致所有内容翻转(可能在12月31日午夜之前1秒),确保一切都发生变化,然后回写原值+ 1秒。 (你希望在值改变时做到这一点,以避免滑倒秒)
我会尝试挖掘代码并查看是否还有更多内容。我只记得最后得出的结论我不得不经营该死的东西&在我通过P.O.S.T之前看它工作。对于那个外围设备。
(我有点提到它,但只是为了重新迭代...如果你的值在开机时看起来已经损坏,请确保你的电池备用电路坚如磐石 - 即使是一对基本电路也是如此二极管通常就足够了。可能是产品运行时时钟正在运行,但是当断电时,它的大脑会被扰乱。)
答案 1 :(得分:2)
这里还面临着气质rtc ....
我认为不可能进行真正可靠的测试,您可以将最后记录的时间存储在非易失性存储器中,并检查时钟是否已移至过去的日期,您还可以测试该delta两次检查之间的关系不是太大。那会像3000年一样,但你不能减少测试的时间间隔,比如说1个月 - 即使它被搁置了一年,你也希望它能被唤醒。
您是否有可能在启动时咨询时间源?例如,一个ntp服务器或你的控制器说话的其他设备可以被认为与可靠的时间源同步?
答案 2 :(得分:0)
您可以将RTC时钟路由到外部引脚,并在示波器或逻辑分析仪上观看。
IIRC我为LPC1766 / 1768做了这个(我有两个相同的电路板,配有不同的处理器)。