2

我正在使用 NXP 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 期间运行,如下所示。

4

3 回答 3

3

大约 5 年前,我与该芯片的祖父 (LPC2148) 上的 RTC 进行了斗争。如果您查看Yahoo LPC2000 组(它还涵盖 LPC1000 芯片),您会看到 RTC 及其问题出现了很多。

无论如何,我在这里从记忆中开始,但我认为我得出的结论是读取状态寄存器不够可靠。也许问题是当电源被移除时,如果没有备用电池,事情就会变得混乱......

所以我记得我在启动阶段做了以下事情:

(1) 启用 RTC 外设

(2) 读取所有 RTC 寄存器。在固件中,每个字段都有“超出范围”的最小值和最大值(例如,年份必须至少为 2005,并且不大于 2030)

(3) 如果任何值超出范围,请将日期和时间重置为某个硬编码值(例如 2005 年 1 月 1 日)(产品将让用户在启动后调整时间/日期)

(4) 对寄存器进行快照;等待至少一秒钟(使用定时器外围设备测量时间),然后确保值已更改。我可能在启动过程中设置了这些值,以便 1 秒的滴答声会/应该导致一切都翻转(可能是 12 月 31 日午夜前 1 秒),确保一切都发生变化,然后写回原始值 + 1 秒。(您可能希望正确执行此操作,因为值会发生变化以避免滑动秒数)

我将尝试挖掘代码,看看是否还有更多内容。我只记得最后得出结论,在我通过该外围设备的 POST 之前,我必须运行该死的东西并观察它的工作。

(我顺便提到了它,但只是为了重申......如果您的值在开机时似乎损坏,请确保您的电池备用电路坚如磐石 - 即使是带有一对二极管的基本电路通常够了。可能是产品运行时时钟在运行,但是当电源被移除时,它的大脑就会被打乱。)

于 2011-08-14T20:08:02.223 回答
2

在这里也遇到了脾气暴躁的 rtc....

我认为不可能进行真正可靠的测试,您可以将最后记录的时间存储在非易失性存储器中的某个位置,并检查时钟是否没有移动到过去的日期,您还可以测试两次检查之间的增量不是太大。这会捕捉到 3000 年之类的东西,但你不能将测试的时间间隔减少到 1 个月——即使它被搁置了一年,你也希望它醒来。

您是否可以在启动时咨询时间源?例如,与您的控制器通话的 ntp 服务器或其他一些设备可以被认为与可靠的时间源同步?

于 2011-08-14T18:39:44.040 回答
0

您可以将 RTC 时钟路由到外部引脚并在示波器或逻辑分析仪上观察。

IIRC 我就是为 LPC1766/1768 做的(我有两个相同的板,装有不同的处理器)。

于 2012-09-21T14:43:37.497 回答