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

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

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

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

編譯成功后,會生成一個test-rtc的可執行程序在Release目錄中。
執行下方命令則可運行測試demo,如下所示。
sudo ./Release/test-rtc
執行效果如下所示。
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"; // 將字符串轉換為tm結構體類型的時間信息 struct tm tm = {0}; strptime(strDateTime, "%Y-%m-%d %H:%M:%S", &tm); // 打開RTC設備 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("---設置參數前日期時間---n"); system("date"); /*** 1.關閉網絡校時服務 ***/ system("systemctl stop ntp.service"); /*** 2.將預設好的時間寫入【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時間設置失敗"); close(rtc_fd); return -1; } /*** 3.將【RTC時鐘】同步回【系統時鐘】 ***/ // 讀出剛才寫入的RTC時鐘參數 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; // 同步時間到系統時鐘 if(0 != settimeofday(&tv, (struct timezone *)0)){ perror("系統時間設置失敗"); } printf("---設置參數后日期時間---n"); system("date"); return 0; } 審核編輯 黃宇
-
開發板
+關注
關注
25文章
5421瀏覽量
101125 -
時鐘芯片
+關注
關注
2文章
259瀏覽量
40467 -
RTC
+關注
關注
2文章
604瀏覽量
68108 -
rk3576
+關注
關注
1文章
121瀏覽量
494
發布評論請先 登錄
【米爾RK3576開發板評測】+項目名稱值得購買的米爾RK3576開發板
基于RK3576開發板的MIPI-DSI使用

評論