RTC实时时钟之读取时间

1. RTC 基本介绍

RTC(Real Time Clock) 即实时时钟,它是一个可以为系统提供精确的时间基准的元器件,RTC一般采用精度较高的晶振作为时钟源,有些RTC为了在主电源掉电时还可以工作,需要外加电池供电

2. RTC 控制器

2.1 RTC的特点是:

  1. RTC中存储的时间信息,都是以BCD码的形式存储的(用四位二进制表示一位十进制) 支持秒、分、小时、星期、星期、月、年。

  2. 支持闰年生成器

  3. 支持告警功能,即告警中断或下电唤醒。下电模式有:空闲、深度空闲、停止、深度停止和休眠。

  4. 支持计时计数器功能,即从下电模式(空闲、深度空闲、停止、深度停止和睡眠)中进行计时中断或唤醒。

  5. 支持独立电源引脚(RTCVDD)

  6. 支持毫秒滴答时定时器中断,支持RTOS工作。

2.2 RTC内部工作逻辑

2.3 RTC时钟频率

36.728khz

3. 实验:读取RTC 时间

注意我们的4412芯片RTC是没有独立电源的,所以读取RTC之前需要校验时钟

3.1 寄存器

3.2 配置寄存器

RTCCON RTC控制寄存器

0\] 使能RTC控制 =1 使能 =0 不使能 ![](https://file.jishuzhan.net/article/1753801324358537217/e1588a9fb99d6022f4be76a7e3da77c6.webp) #### **BCDYEAR 年** 注意存储是以BCD吗存储的 \[11:8\] 百位 \[7:4\] 十位 \[3:0\] 个位 比如2023年 BCD码表示就是 0000 0010 0011 可以看到千位没有,其实千位几乎不用动,我们默认为 2 就行了 ![](https://file.jishuzhan.net/article/1753801324358537217/7bfded80895f6b05e9a33ff71d1747b7.webp) #### **BCDMON 月** \[4\] 十位 注意这里只用了一bit表示十位的数 因为 01 02 03.....09 10 11 12 可以看到月的十位不是0就是1 所以1 bit足够了 \[3:0\] 个位 ![](https://file.jishuzhan.net/article/1753801324358537217/20ef14c03df4c5c24118ef5f41b320f8.webp) #### **BCDDAY 日** \[5:4\] 十位 注意十位 只用了2bit 因为 十位上的数 不是 0 1 2 3 所以2bit足够了 \[3:0\] 个位 ![](https://file.jishuzhan.net/article/1753801324358537217/6966f982a60978273c771ae48126292c.webp) **红色****警告 三星的这个芯片手册把星期和日的这个地址写反了 注意** #### **BCDDAYWEEK 星期** \[2:0\] 个位 用了3bit 1 2 3 4 5 6 7 3bit足够了 ![](https://file.jishuzhan.net/article/1753801324358537217/0639fe7aafeed2e3d42df5cf8aa1bc3b.webp) #### **BCDHOUR 小时** \[5:4\] 十位 注意 小时取 0 1 2 所以2bit够用了 \[3:0\] 个位 ![](https://file.jishuzhan.net/article/1753801324358537217/3e06c7738e6af59a142dd69d5c4fc7e1.webp) #### **BCDMIN 分钟** \[6:4\] 十位 分钟的十位取值 0 1 2 3 4 5 3bit足够了 \[3:0\] 个位 ![](https://file.jishuzhan.net/article/1753801324358537217/f9acbbc39e751e9f57858fc58640aef3.webp) #### **BCDSEC 秒** \[6:4\] 十位 秒的十位取值 0 1 2 3 4 5 3bit足够了 \[3:0\] 个位 ![](https://file.jishuzhan.net/article/1753801324358537217/e2230aa9ff55f7c0e7f8c6ef5c3b8745.webp) ### **3.3 写代码** rtc_test----main.c ```cpp #include"exynos_4412.h" #include"uart.h" //读取RTC实时时钟 //延时 void delay(unsigned int msec) { unsigned int i,j; while(msec --) { for(i=0;i<5;i++) for(j=0;j<512;j++); } } //初始化RTC void rtc_init(unsigned int bcdyear,unsigned char bcdmon, unsigned char bcdday,unsigned char bcdhour, unsigned char bcdmin,unsigned char bcdsec, unsigned char bcdweek){ //使能RTC控制器 RTCCON |= 0x1; //设置年月日,时分秒 RTC.BCDSEC = bcdsec; RTC.BCDMIN = bcdmin; RTC.BCDHOUR = bcdhour; //注意芯片手册的星期和地址是反的,它写错了,所以我们只好反着写 RTC.BCDWEEK = bcdday; //设置日 RTC.BCDDAY = bcdweek;//设置星期 RTC.BCDMON = bcdmon; RTC.BCDYEAR = bcdyear; RTCCON &= ~(1);// 关闭RTC控制器使能 } typedef struct { //均是用BCD码表示 unsigned int bcdyear; // 3位十进制数有效 unsigned char bcdmon; // 1-12 unsigned char bcdday; // 1-31 unsigned char bcdhour; // 0-23 unsigned char bcdmin; // 0-59 unsigned char bcdsec; // 0-59 unsigned char bcdweek; // 1-7 }bcd_time_struct; //读取RTC 时钟 void rtc_get_time(bcd_time_struct *bcd_struct) { if(bcd_struct != (void *)0) { bcd_struct->bcdyear = RTC.BCDYEAR; bcd_struct->bcdmon = RTC.BCDMON; bcd_struct->bcdday = RTC.BCDWEEK;//这里读出来的是日 bcd_struct->bcdhour = RTC.BCDHOUR; bcd_struct->bcdmin = RTC.BCDMIN; bcd_struct->bcdsec = RTC.BCDSEC; bcd_struct->bcdweek = RTC.BCDDAY; //这里读出来的是星期 } } int main() { int a = 100; uart_init(); printf("hello!a=%d\r\n",a); //初始化RTC时钟 rtc_init(0x0233,0x12,0x13,0x18,0x34,0x12,0x3); bcd_time_struct tm; while(1){ rtc_get_time(&tm); //打印实时时钟 //%03x 保留3位 如果不足三位用0来补充 printf("time:2%03x/%x/%x,%x:%x:%x,week:%x \r\n",tm.bcdyear,tm.bcdmon, tm.bcdday,tm.bcdhour,tm.bcdmin,tm.bcdsec,tm.bcdweek); delay(1000); } return 0; } ``` ![](https://file.jishuzhan.net/article/1753801324358537217/0ce48a3121e5c649e320c57bb4b1145f.webp)

相关推荐
czy87874753 小时前
C语言主要标准版本的演进与核心区别的对比分析
c语言
巨龙之路4 小时前
C语言中的assert
c语言·开发语言
吃个早饭9 小时前
2025年第十六届蓝桥杯大赛软件赛C/C++大学B组题解
c语言·c++·蓝桥杯
qwertyuiop_i10 小时前
pe文件二进制解析(用c/c++解析一个二进制pe文件)
c语言·c++·pe文件
我叫珂蛋儿吖12 小时前
[redis进阶六]详解redis作为缓存&&分布式锁
运维·c语言·数据库·c++·redis·分布式·缓存
szxinmai主板定制专家13 小时前
基于TI AM6442+FPGA解决方案,支持6网口,4路CAN,8个串口
arm开发·人工智能·fpga开发
周Echo周13 小时前
20、map和set、unordered_map、un_ordered_set的复现
c语言·开发语言·数据结构·c++·算法·leetcode·list
安装虚拟机的老师傅13 小时前
【2025最新】Windows系统装VSCode搭建C/C++开发环境(附带所有安装包)
c语言·windows·vscode·其他
7yewh14 小时前
FPGA前瞻篇-计数器设计与实现实例
arm开发·驱动开发·嵌入式硬件·fpga开发·硬件架构·硬件工程·精益工程
真的想上岸啊14 小时前
c语言第一个小游戏:贪吃蛇小游戏06
c语言·算法·链表