1. RTC介紹
RTC的英文全稱是Real-Time Clock,翻譯過來是實時時鐘芯片。實時時鐘芯片通過引腳對外提供時間讀寫接口,通常使用獨立電池供電,以保證在外部系統(tǒng)關(guān)電時,芯片電路正常工作,時間正常運行。
不同的時鐘芯片內(nèi)部機制不一樣,但在Linux系統(tǒng)中驅(qū)動封裝了不同時鐘芯片的操作細節(jié),為應(yīng)用程序提供了統(tǒng)一的時間操作接口。
1.1 Orin-Nano的RTC資源
EASY EAI Orin-Nano 【默認不帶】RTC電路。若想底板支持RTC功能,可通過使用我司的RTC模塊進行【擴展】。
擴展RTC的具體操作:【首先】要把底板【斷電】,然后再把模塊【正面朝上】地插入到底板的40PIN接口上,如下圖所示。
插穩(wěn)后,再進行【上電】操作。
通過ls命令,可查看RTC芯片是否有被系統(tǒng)識別
ls /dev/rtc*

確認驅(qū)動成功加載后,可通過下方命令訪問驅(qū)動,讀出RTC芯片的所有信息。
cat /proc/driver/rtc

1.2 RTC時間的讀寫
這里涉及2個時鐘,RTC芯片時鐘以及系統(tǒng)時鐘。手動管理RTC時鐘操作的本質(zhì)就是:同步時鐘(要么把系統(tǒng)時鐘同步到RTC芯片時鐘上,要么把RTC芯片時鐘同步到系統(tǒng)時鐘)。
系統(tǒng)時鐘:系統(tǒng)時鐘本質(zhì)是一個64位的整數(shù),這個整數(shù)代表當(dāng)前與Epoch Time的時間差(以秒為單位),我們稱之為時間戳。這個時鐘由CPU主芯片定時器維護,CPU掉電后,時鐘信息就會丟失。操作系統(tǒng)時鐘的命令為date。
date #查詢系統(tǒng)時間 date -s "2023-09-20 11:18:00" #修改系統(tǒng)時間
注:
* Epoch Time:是指一個特定的時間。1970年1月1日0時0分0秒。假設(shè)現(xiàn)在距離1970年1月1日0時0分0秒走了N秒,在Linux系統(tǒng)里,時間數(shù)值就是N。
RTC芯片時鐘:RTC芯片內(nèi)部所維護的時間。在系統(tǒng)掉電后由電池進行供電。因此系統(tǒng)電源掉電后RTC時間仍然能夠正常運行,RTC芯片時鐘的作用是在Linux不運行時,依然可以保持時間信息。
芯片時鐘同步到系統(tǒng)時鐘。
sudo hwclock --hctosys
系統(tǒng)時鐘同步到芯片時鐘(或者是sudo hwclock -w)。
sudo hwclock --systohc
如果只想查詢RTC芯片時鐘,但不同步到系統(tǒng)時鐘,可以采用以下命令。
sudo hwclock -r

1.3 時區(qū)和校時服務(wù)
RTC時鐘和系統(tǒng)時鐘用的都是UTC時間,不同地區(qū)所使用的時間,還需要考慮上時區(qū)的影響。另外:RTC時鐘除了可以被手動操作,校時服務(wù)也會影響RTC時鐘。EASY-EAI-Orin-Nano采用ntpd作為校時服務(wù),若用戶對其機制不熟悉,可查閱文檔《系統(tǒng)時間管理介紹》。
2. 快速上手
2.1 例程源碼下載
到【百度網(wǎng)盤】上下載相關(guān)的單例程序:
鏈接:https://pan.baidu.com/s/1RXHMGpmGSEfFy0rb1VkXSg?pwd=1234
提取碼: 1234
比如在windows環(huán)境中,就把單例程序下載到:此電腦D:BaiduNetdisk (無規(guī)定,用戶可自主選擇),如下圖所示。
然后把例程【復(fù)制粘貼】到nfs掛載目錄中。(不清楚目錄如何構(gòu)建的,可以參考《入門指南/開發(fā)環(huán)境準備/nfs服務(wù)搭建與掛載》)
2.2 例程編譯&運行
通過adb shell進入開發(fā)板環(huán)境(不清楚如何通過adb進行調(diào)試,可以參考《入門指南/開發(fā)板調(diào)試方式介紹/adb調(diào)試》),執(zhí)行下方命令定位到demo目錄,并且執(zhí)行編譯操作。
cd /home/orin-nano/Desktop/nfs/12_IIC/ ./build.sh

編譯成功后,會生成一個test-rtc的可執(zhí)行程序在Release目錄中。
執(zhí)行下方命令則可運行測試demo,如下所示。
sudo ./Release/test-rtc
執(zhí)行效果如下所示。
3. C語言使用案例
RTC的C語言使用案例,代碼地址為12_RTC/test-rtc/main.c,供用戶編碼參考。以下代碼展示了對RTC時鐘的讀寫操作流程:
int main(int argc, char const *argv[]) { const char *strDateTime = "2023-09-21 15:22:37"; // 將字符串轉(zhuǎn)換為tm結(jié)構(gòu)體類型的時間信息 struct tm tm = {0}; strptime(strDateTime, "%Y-%m-%d %H:%M:%S", &tm); // 打開RTC設(shè)備 int rtc_fd = open("/dev/rtc0", O_RDWR); if (rtc_fd < 0) { perror("open RTC device /dev/rtc0 faild."); close(rtc_fd); return -1; } printf("---設(shè)置參數(shù)前日期時間---n"); system("date"); /*** 1.關(guān)閉網(wǎng)絡(luò)校時服務(wù) ***/ system("systemctl stop ntp.service"); /*** 2.將預(yù)設(shè)好的時間寫入【RTC時鐘】 ***/ struct rtc_time rtc_tm; rtc_tm.tm_sec = tm.tm_sec; rtc_tm.tm_min = tm.tm_min; rtc_tm.tm_hour = tm.tm_hour; rtc_tm.tm_mday = tm.tm_mday; rtc_tm.tm_mon = tm.tm_mon; rtc_tm.tm_year = tm.tm_year; if (ioctl(rtc_fd, RTC_SET_TIME, &rtc_tm) < 0) { perror("set data time to rtc0"); perror("RTC時間設(shè)置失敗"); close(rtc_fd); return -1; } /*** 3.將【RTC時鐘】同步回【系統(tǒng)時鐘】 ***/ // 讀出剛才寫入的RTC時鐘參數(shù) if (ioctl(rtc_fd, RTC_RD_TIME, &rtc_tm) < 0) { perror("RTC時間讀取失敗"); close(rtc_fd); return -1; } close(rtc_fd); tm.tm_sec = rtc_tm.tm_sec; tm.tm_min = rtc_tm.tm_min; tm.tm_hour = rtc_tm.tm_hour; tm.tm_mday = rtc_tm.tm_mday; tm.tm_mon = rtc_tm.tm_mon; tm.tm_year = rtc_tm.tm_year; struct timeval tv; tv.tv_sec = mktime(&tm); tv.tv_usec = 0; // 同步時間到系統(tǒng)時鐘 if(0 != settimeofday(&tv, (struct timezone *)0)){ perror("系統(tǒng)時間設(shè)置失敗"); } printf("---設(shè)置參數(shù)后日期時間---n"); system("date"); return 0; } 審核編輯 黃宇
-
開發(fā)板
+關(guān)注
關(guān)注
25文章
5590瀏覽量
103217 -
時鐘芯片
+關(guān)注
關(guān)注
2文章
266瀏覽量
40660 -
RTC
+關(guān)注
關(guān)注
2文章
615瀏覽量
68471 -
rk3576
+關(guān)注
關(guān)注
1文章
159瀏覽量
622
發(fā)布評論請先 登錄
【米爾RK3576開發(fā)板評測】+項目名稱值得購買的米爾RK3576開發(fā)板
米爾RK3576開發(fā)板特惠活動!

基于RK3576開發(fā)板的MIPI-DSI使用

評論