1.RTC介紹
RTC的英文全稱是Real-Time Clock,翻譯過來是實(shí)時(shí)時(shí)鐘芯片。實(shí)時(shí)時(shí)鐘芯片通過引腳對外提供時(shí)間讀寫接口,通常使用獨(dú)立電池供電,以保證在外部系統(tǒng)關(guān)電時(shí),芯片電路正常工作,時(shí)間正常運(yùn)行。
不同的時(shí)鐘芯片內(nèi)部機(jī)制不一樣,但在Linux系統(tǒng)中驅(qū)動(dòng)封裝了不同時(shí)鐘芯片的操作細(xì)節(jié),為應(yīng)用程序提供了統(tǒng)一的時(shí)間操作接口。
1.1 開發(fā)板的RTC資源
EASY EAI Nano-TB 【默認(rèn)不帶】RTC電路。若想底板支持RTC功能,可通過使用我司的RTC模塊進(jìn)行【擴(kuò)展】。

擴(kuò)展RTC的具體操作:【首先】要把底板【斷電】,然后再把模塊【正面朝上】地插入到底板的40PIN接口上,如下圖所示。

插穩(wěn)后,再進(jìn)行【上電】操作。

通過ls命令,可查看RTC芯片是否有被系統(tǒng)識別
ls /dev/rtc*

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

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

1.3 系統(tǒng)時(shí)鐘的讀寫
本文著重介紹的是【RTC時(shí)鐘】,關(guān)于【系統(tǒng)時(shí)鐘】的詳細(xì)介紹和操作,可以通過閱讀《EASY-EAI-Toolkit/通用組件/系統(tǒng)操作-時(shí)間參數(shù)》一文進(jìn)行了解。
1.4 時(shí)區(qū)和校時(shí)服務(wù)
時(shí)區(qū):【RTC時(shí)鐘】和【系統(tǒng)時(shí)鐘】用的都是UTC時(shí)間,不同地區(qū)所使用的時(shí)間,還需要考慮上時(shí)區(qū)的影響。
校時(shí)服務(wù):【RTC時(shí)鐘】除了可以被手動(dòng)操作,校時(shí)服務(wù)也會(huì)影響RTC時(shí)鐘。
關(guān)于【時(shí)區(qū)設(shè)置】和【校時(shí)服務(wù)】,EASY-EAI-Nano-TB可以參考《應(yīng)用筆記/自動(dòng)校時(shí)與時(shí)區(qū)設(shè)置》一文進(jìn)行操作。更詳細(xì)的交互作用機(jī)制,可參考《系統(tǒng)時(shí)間管理介紹》。
2. 快速上手
2.1 開發(fā)環(huán)境準(zhǔn)備
如果您初次閱讀此文檔,請閱讀《入門指南/開發(fā)環(huán)境準(zhǔn)備/Easy-Eai編譯環(huán)境準(zhǔn)備與更新》,并按照其相關(guān)的操作,進(jìn)行編譯環(huán)境的部署。
在PC端Ubuntu系統(tǒng)中執(zhí)行run腳本,進(jìn)入EASY-EAI編譯環(huán)境,具體如下所示。
cd ~/develop_environment ./run.sh

2.2 源碼下載以及例程編譯
首先,在虛擬機(jī)后臺(tái)終端,執(zhí)行以下命令,創(chuàng)建外設(shè)單例源碼管理目錄:
cd /opt mkdir -p EASY-EAI-Nano-TB/demo
首先,到【百度網(wǎng)盤】上下載相關(guān)的單例程序:
鏈接:https://pan.baidu.com/s/1Br608Hiff2Xs65PzWO_qWQ?pwd=1234
提取碼:1234
比如把單例程序下載到:此電腦\D:\BaiduNetdisk (無規(guī)定,用戶可自主選擇),如下圖所示。

再將下載好的單例復(fù)制進(jìn)入虛擬機(jī)的文件系統(tǒng),過程如下圖所示。



最后,進(jìn)入到對應(yīng)的例程目錄執(zhí)行編譯操作,具體命令如下所示:
cd EASY-EAI-Nano-TB/demo/12_RTC ./build.sh
注:
* 由于依賴庫部署在板卡上,因此交叉編譯過程中必須保持/mnt掛載。

編譯成功后,會(huì)生成一個(gè)test-rtc的可執(zhí)行程序在Release目錄下,并會(huì)自動(dòng)部署到開發(fā)板的/userdata/目錄中。
2.3 例程運(yùn)行
通過串口調(diào)試或ssh調(diào)試,進(jìn)入板卡后臺(tái),定位到例程部署的位置,如下所示:
cd /userdata

執(zhí)行例程命令,如下所示。
sudo ./test-rtc
執(zhí)行效果如下所示。

3. C語言使用案例
RTC的C語言使用案例,代碼地址為12_RTC/test-rtc/main.c,供用戶編碼參考。以下代碼展示了對RTC時(shí)鐘的讀寫操作流程:
int main(int argc, char const *argv[]) { const char *strDateTime = "2023-09-21 15:22:37"; // 將字符串轉(zhuǎn)換為tm結(jié)構(gòu)體類型的時(shí)間信息 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ù)前日期時(shí)間---\n"); system("date"); /*** 1.關(guān)閉網(wǎng)絡(luò)校時(shí)服務(wù) ***/ system("systemctl stop ntp.service"); /*** 2.將預(yù)設(shè)好的時(shí)間寫入【RTC時(shí)鐘】 ***/ 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í)間設(shè)置失敗"); close(rtc_fd); return -1; } /*** 3.將【RTC時(shí)鐘】同步回【系統(tǒng)時(shí)鐘】 ***/ // 讀出剛才寫入的RTC時(shí)鐘參數(shù) if (ioctl(rtc_fd, RTC_RD_TIME, &rtc_tm) < 0) { perror("RTC時(shí)間讀取失敗"); 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; // 同步時(shí)間到系統(tǒng)時(shí)鐘 if(0 != settimeofday(&tv, (struct timezone *)0)){ perror("系統(tǒng)時(shí)間設(shè)置失敗"); } printf("---設(shè)置參數(shù)后日期時(shí)間---\n"); system("date"); return 0; }
-
Linux
+關(guān)注
關(guān)注
88文章
11758瀏覽量
219009 -
瑞芯微
+關(guān)注
關(guān)注
27文章
792瀏覽量
54288 -
EASY-EAI靈眸科技
+關(guān)注
關(guān)注
4文章
67瀏覽量
3611 -
RV1126B
+關(guān)注
關(guān)注
0文章
54瀏覽量
178
發(fā)布評論請先 登錄
瑞芯微(EASY EAI)RV1126B 音頻輸入
瑞芯微(EASY EAI)RV1126B PWM使用
如何用瑞芯微RV1126B核心板贏得AI紅利?
【EASY EAI Nano-TB(RV1126B)開發(fā)板試用】+初識篇
【EASY EAI Nano-TB(RV1126B)開發(fā)板試用】命令行功能測試-shell腳本進(jìn)行IO控制-燈閃
【EASY EAI Nano-TB(RV1126B)開發(fā)板試用】命令行功能測試-shell腳本進(jìn)行IO控制-紅綠燈項(xiàng)目
【EASY EAI Nano-TB(RV1126B)開發(fā)板試用】命令行功能測試-shell腳本進(jìn)行IO控制-紅綠燈按鈕項(xiàng)目
請問各位大佬,如何解決,瑞芯微 RV1126B 使用 mpp 自帶工具 調(diào)試時(shí),內(nèi)核直接報(bào)錯(cuò)崩潰!
【EASY EAI Nano-TB(RV1126B)開發(fā)板試用】+1、開箱上電
【EASY EAI Nano-TB(RV1126B)開發(fā)板試用】介紹、系統(tǒng)安裝
RV1126系列選型指南:從RV1126到RV1126B,一文看懂升級差異
【免費(fèi)試用】EASY EAI Nano-TB(RV1126B)開發(fā)套件評測
瑞芯微RV1126B特性概述
替代升級實(shí)錘!實(shí)測RV1126B,CPU性能吊打RV1126
瑞芯微(EASY EAI)RV1126B 人體關(guān)鍵點(diǎn)識別
瑞芯微(EASY EAI)RV1126B RTC使用
評論