瑞芯微RV1126B开发板(EASY-EAI-PI2) RTC

📅 2026/6/27 5:07:46
瑞芯微RV1126B开发板(EASY-EAI-PI2) RTC
1.RTC介绍RTC的英文全称是Real-Time Clock翻译过来是实时时钟芯片。实时时钟芯片通过引脚对外提供时间读写接口通常使用独立电池供电以保证在外部系统关电时芯片电路正常工作时间正常运行。不同的时钟芯片内部机制不一样但在Linux系统中驱动封装了不同时钟芯片的操作细节为应用程序提供了统一的时间操作接口。1.1开发板的RTC资源EASY EAI PI2【默认不带】RTC电路。若想底板支持RTC功能可通过使用我司的RTC模块进行【扩展】。扩展RTC的具体操作【首先】要把底板【断电】然后再把模块【正面朝上】地插入到底板的40PIN接口上如下图所示。插稳后再进行【上电】操作。通过ls命令可查看RTC芯片是否有被系统识别ls /dev/rtc*确认驱动成功加载后可通过下方命令访问驱动读出RTC芯片的所有信息。cat /proc/driver/rtc1.2RTC时间的读写这里涉及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 -r1.3系统时钟的读写本文着重介绍的是【RTC时钟】关于【系统时钟】的详细介绍和操作可以通过阅读《EASY-EAI-Toolkit/通用组件/系统操作-时间参数》一文进行了解。1.4时区和校时服务时区【RTC时钟】和【系统时钟】用的都是UTC时间不同地区所使用的时间还需要考虑上时区的影响。校时服务【RTC时钟】除了可以被手动操作校时服务也会影响RTC时钟。关于【时区设置】和【校时服务】EASY-EAI-Nano-TB可以参考《应用笔记/自动校时与时区设置》一文进行操作。更详细的交互作用机制可参考《系统时间管理介绍》。2.快速上手2.1开发环境准备如果您初次阅读此文档请阅读《入门指南/开发环境准备/Easy-Eai编译环境准备与更新》并按照其相关的操作进行编译环境的部署。在PC端Ubuntu系统中执行run脚本进入EASY-EAI编译环境具体如下所示。cd ~/develop_environment ./run.sh 22042.2源码下载以及例程编译首先在虚拟机后台终端执行以下命令创建外设单例源码管理目录cd /opt mkdir -p EASY-EAI-PI2/demo首先到【百度网盘】上下载相关的单例程序链接https://pan.baidu.com/s/1ORJrMeW-bOJ6g_lPiNG6mw?pwd1234提取码1234比如把单例程序下载到此电脑\D:\BaiduNetdisk (无规定用户可自主选择)如下图所示。再将下载好的单例复制进入虚拟机的文件系统过程如下图所示。最后进入到对应的例程目录执行编译操作具体命令如下所示cd EASY-EAI-PI2/demo/12_RTC ./build.sh注* 由于依赖库部署在板卡上因此交叉编译过程中必须保持/mnt挂载。编译成功后会生成一个test-rtc的可执行程序在Release目录下并会自动部署到开发板的/userdata/目录中。2.3例程运行通过串口调试或ssh调试进入板卡后台定位到例程部署的位置如下所示cd /userdata执行例程命令如下所示。sudo ./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; }