一、RTC
RTC是集成電路,通常稱為時鐘芯片。在一個嵌入式系統中,通常采用RTC來提供可靠的系統時間,包括時分秒和年月日等,而且要求在系統處于關機狀態下它也能正常工作(通常采用后備電池供電)。
它的外圍也不需要太多的輔助電路,典型的就是只需要一個高精度的32.768kHz 晶體和電阻電容等,并且具有鬧鐘的功能。
二、Exynos 4412 RTC
本篇主要以Cortex-A9 soc為例講解RTC的使用方法。
1. 特性
實時時鐘(RTC)單元可以通過備用電池供電,因此,即使系統電源關閉,它也可以繼續工作。RTC可以通過STRB/LDRB 指令將8位BCD碼數據送至CPU。這些BCD數據包括秒、分、時、日期、星期、月和年。
RTC單元通過一個外部的32.768kHz 晶振提供時鐘。
RTC具有定時報警的功能。
其功能說明如下:
1 -- 時鐘數據采用BCD編碼。
2 -- 能夠對閏年的年月日進行自動處理。
3 -- 具有告警功能,當系統處于關機狀態時,能產生警告中斷。
4 -- 具有獨立的電源輸入。
5 -- 提供毫秒級時鐘中斷,該中斷可以用于作為嵌入式操作系統的內核時鐘。
2. RTC Block
RTC Block Diagram
RTC在Linux中主要實現兩種功能,分別是系統掉電后的時間日期維持和時間日期報警(類似定時器)。
「1)時間日期維持功能:」
主要是由RTC實時時鐘控制寄存器RTCCON進行功能的使能控制,由節拍時間計數寄存器TICNT來產生節拍時間中斷來實現實時操作系統功能相關的時間和實時同步。其中對時間日期的操作實際上是對BCD碼操作,而BCD碼則是由一系列的寄存器組成(BCD秒寄存器BCDSEC、BCD分寄存器BCDMIN、BCD小時寄存器BCDHOUR、BCD日期寄存器BCDDATE、BCD日寄存器BCDDAY、BCD月寄存器BCDMON、BCD年寄存器BCDYEAR)。
「2)報警功能:」
主要由RTC報警控制寄存器RTC ALM進行功能使能控制,并產生報警中斷。報警時間日期的設置也是對一系列的寄存器進行操作(報警秒數據寄存器ALMSEC、報警分鐘數據寄存器ALMMIN、報警小時數據寄存器ALMHOUR、報警日期數據寄存器ALMDATE、報警月數據寄存器ALMMON、報警年數據寄存器ALMYEAR)。
「3)閏年發生器」
可以根據BCDDAY、BCDMON和BCDEEAR的值自動計算閏年。
3. 備用電池
備用電池可以驅動RTC邏輯。備用電池通過RTCVDD引腳向RTC塊,即使系統電源關閉。如果系統關閉,您應該阻止CPU和RTC邏輯。為了減少功耗,備用電池單獨驅動振蕩電路和BCD計數器。
4. Alarm【報警】 功能
RTC在斷電模式或正常運行模式都可以在執行的時間產生一個ALARM_INT 和ALARM_WK信號。在正常工作模式下,它會產生ALARM_INT。在斷電模式下,它會ALARM_WK以及ALARM_INT信號。RTC報警寄存器(RTCALM)確定報警啟用/禁用狀態和報警時間設置的條件。
6. 晶振
32.768 kHz X-Tal Connection Example
晶振時鐘頻率 32.768 kHz。
- XT_RTC_I 32.768 kHz RTC振蕩器時鐘輸入
- XT_RTC_O 32.768 kHz RTC振蕩器時鐘輸出
- XRTCCLKO 32.768 kHz RTC振蕩器時鐘輸出,此信號默認關閉。可以通過設置寄存器RTCCON的CLKOUTEN字段為1來啟用它。
引腳連接圖:由電路圖可知,只連接了RTC振蕩器時鐘輸入引腳XT_RTC_I 。
三、寄存器
1. RTC寄存器組:
寄存器組
2. INTP
設置對應的bit為1就可以清除中斷。
3. RTCCON
RTCCON | 位 | 描述 | 復位值 |
---|---|---|---|
保留 | [31:10] | 保留 | 0 |
CLKOUTEN | [9] | 使能RTC通過XRTCCLKO輸出 0 disable 1 enbale | 0 |
TICEN | [8] | 嘀嗒計時器0 = 禁止1 = 使能 | 0 |
TICCKSEL | [7:4] | 嘀嗒計時器子時鐘源選擇**「4'b0000 = 32768 Hz」** 4'b0001 = 16384 Hz4'b0010 = 8192 Hz4'b0011 = 4096 Hz4'b0100 = 2048 Hz4'b0101 =1024 Hz4'b0110 =512 Hz4'b0111 =256 Hz4'b1000 =128 Hz4'b1001 =64 Hz4'b1010 =32 Hz 4'b1011 =16 Hz4'b1100 =8 Hz4'b1101 =4 Hz4'b1110 =2 Hz4'b1111 =1 Hz | 4'b0000 |
CLKRST | [3] | RTC時鐘計數復位0 = 不復位1 = 復位 0 | |
CNTSEL | [2] | BCD計數選擇 0 = 分配 BCD 計數 1 = 保留 | 0 |
CLKSEL | [1] | BCD 時鐘選擇0 = XTAL 1/2 divided clock1 = 保留(XTAL 供頻) | 0 |
RTCEN | [0] | RTC控制使能0 = 禁止1 = 使能 | 0 |
- RTCCON寄存器由10位組成,如控制BCD SEL讀/寫啟用的CTLEN, CNTSEL、CLKRST、TICKSEL、TICEN用于測試,CLKOUTEN用于RTC時鐘輸出控制。
- CTLEN位控制CPU和RTC之間的所有接口。因此,您應該在RTC控件中將其設置為“1”,在系統重置后啟用數據寫入的例程。為了防止無意中寫入BCD計數器寄存器,應該關閉電源前將CTLEN位清除為0。
- CLKRST是2^15^時鐘分頻器的計數器復位。在設置RTC時鐘之前,應重置215時鐘分頻器以獲得精確的RTC操作。
四、RTC的操作
1. 設置時間
「舉例:」 我們要將當前時間設置為 「2020年11月11日, 15:24:50」 。
1) 先將RTC控制使能開啟,即RTCCON[0]置為1;2)然后將時間對應的BCD格式數值,設置到應對的寄存器,BCDYEAR 、BCDMON 、BCDDAY 、BCDHOUR 、BCDMIN 、BCDSEC;3) 將RTCCON[0]置為0,防止誤操作修改了時間;4)如果我們要訪問當前時間,可以直接讀取寄存器BCDYEAR 、BCDMON 、BCDDAY 、BCDHOUR 、BCDMIN 、BCDSEC。
void rtc_init(void)
{
RTCCON = 1;//使能RTC控制寫功能
RTC.BCDYEAR = 0x20;// 2020年11月11日, 15:24:50.以BCD碼格式寫入
RTC.BCDMON = 0x11;
RTC.BCDDAY = 0x11;
RTC.BCDHOUR = 0x15;
RTC.BCDMIN = 0x24;
RTC.BCDSEC = 0x50;
RTCCON = 0;//關閉RTC控制寫功能
}
-
集成電路
+關注
關注
5381文章
11384瀏覽量
360853 -
時鐘芯片
+關注
關注
2文章
244瀏覽量
39847 -
RTC
+關注
關注
2文章
528瀏覽量
66309 -
電阻電容
+關注
關注
1文章
40瀏覽量
9513
發布評論請先 登錄
相關推薦
評論