2011-08-14 254 views
2

我正在使用恩智浦LPC17xx系列微控制器(LPC1759和LPC1768)。LPC17xx:檢查RTC是否正在運行

如何確定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過程中運行,如波紋管建議。

回答

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之前運行該死的東西&看它的工作。爲那個外設。如果你的數值在上電時看起來損壞了,請確保你的電池備份電路是堅如磐石的 - 即使是一個帶有一個基本電路的基本電路一對二極管通常就足夠了,可能是產品運行時鐘正在運行,但是當電源斷開時,它的大腦被擾亂。)

2

與氣質RTC的這裏也面臨....

我不認爲一個真正可靠的試驗是可能的,你可以在非易失性存儲器中存儲一些最後記錄時間,並檢查時鐘不是招」 t移至過去的日期,並且您還可以測試兩次檢查之間的增量不是太大。這會得到像3000年那樣的東西,但是你不能將經過測試的時間縮短爲1個月 - 即使它被擱置了一年,你也希望它喚醒。

你有沒有可能在啓動時諮詢一個時間源?例如,ntp服務器或其他控制器所說的其他設備可以視爲與可靠的時間源同步?

+0

我沒有可靠的來源來檢查時間。不幸的是我的設備是獨立的 – j4x

0

您可以將RTC時鐘路由到外部引腳並觀看它示波器或邏輯分析儀。

IIRC我爲LPC1766/1768做了一些工作(我有兩塊相同的電路板,安裝了不同的處理器)。