Mini2440裸机开发之RTC
一、S3C2440上的RTC
1.1 概述
RTC,英文全称Real Time Clock,中文就是实时时钟,是一个可以为系统提供精确的时间基准的元器件,RTC一般采用精度较高的晶振作为时钟源,有些RTC为了在主电源掉电时还可以工作,需要外加电池供电。
RTC可以通过使用STRB/LDRB ARM操作发送8位二-十进制交换码(BCD)值数据给CPU。这些数据包括年、月、日、星期、时、分和秒的时间信息。RTC单元工作在外部32.768kHz晶振并且可以执行闹钟功能。
1.2 特性
- 时钟数据采用BCD编码,时钟数据包括秒、分、时、日、月、年、星期;
- 32.768K 的晶振提供时钟输入;
- 可以提供毫秒级的时钟节拍中断,该中断可用于作为嵌入式操作系统的内核时钟;
- 闹钟功能:闹钟中断或从掉电模式唤醒;
- 独立电源引脚(RTCVDD);
1.3 RTC方框图
1.3.1 中断
从上图可以看到RTC模块提供了2个中断:
- INT_RTC:RTC alarm interrupt,即RTC闹钟中断;
- INT_TICK: RTC Time tick interrupt,即RTC时钟节拍中断;
1.3.2 瑞年发生器
闰年发生器能够基于 BCDDATE、BCDMON 和 BCDYEAR 的数据,从 28、29、30 或 31 中决定哪个是每月的最后日,此模块决定每月最后日时会考虑闰年因素。
1.3.3 读写寄存器
为了写RTC模块中的BCD寄存器,RTCCON寄存器的位[0]必须设置为高。
为了显示,年、月、日、时、分和秒,CPU应该分别读取RTC模块中的 BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDDATE、BCDMON和 BCDYEAR 寄存器中的数据。然而可能存在1秒的偏差,因为读取了多个寄存器。
例如,当用户从 BCDYEAR到BCDMIN读取寄存器,其结果假定为2059(年)、12(月)、31(日)、23(时)和 59(分)。当用户读取 BCDSEC寄存器并且值的范围是从 1 到 59(秒),这没有问题,但是如果该值为 0 秒。则年、月、日、时和分可能要变为 2060(年)、1(月)、1(日)、0(时)和 0(分),因为存在着 1 秒的偏差。在这种情况中,如果 BCDSEC为0则用户应该重新读取 BCDYEAR 到 BCDSEC。
1.3.4 备用电池
RTC逻辑可以由备用电池驱动,即使如果系统电源关闭了,则由 RTCVDD引脚供电给RTC模块。当关闭了电源则应该阻塞掉CPU和RTC逻辑的接口,并且备用电池只驱动振荡电路和BCD计数器来最小化功耗。
1.3.5 闹钟功能
RTC在掉电模式中或正常工作模式中的指定时间产生一个闹钟信号;
- 在正常工作模式中,只激活闹钟中断(INT_RTC)信号;
- 在掉电模式中,除了INT_RTC 之外还激活电源管理唤醒(PMWKUP)信号;
RTC闹钟寄存器(RTCALM)决定了闹钟使能/禁止状态和闹钟时间设置的条件。
1.3.6 时钟节拍中断
RTC时钟节拍是用于中断请求。TICNT寄存器有一个中断使能位和中断的计数值。当时钟节拍中断发生时计数值达到'0'。中断周期如下:$周期=(n+1)/128秒$
其中:n为时钟节拍计数值,1到127。
1.4 BCD码
BCD(Binary Coded Decimal)码,即二进制编码的十进制数,这种方法是用4位二进制码的组合代表十进制数的0,1,2,3,4,5,6 ,7,8,9 十个数符。
4位二进制数码有16种组合,原则上可任选其中的10种作为代码,分别代表十进制中的0,1,2,3,4,5,6,7,8,9这十个数符。最常用的BCD码称为8421BCD码,8.4.2.1 分别是4位二进数的位取值。
下图为十进制数和8421BCD编码的对应关系表:
十进制 | BCD(8421)码 |
0 | 0000 |
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
二、RTC相关寄存器
2.1 RTC控制寄存器RTCCON
RTCCON寄存器由4 位组成,如控制BCD寄存器读/写使能的RTCEN、CLKSEL、CNTSEL和测试用的CLKRST。
RTCEN位可以控制所有CPU与RTC之间的接口,因此在系统复位后在RTC控制程序中必须设置为1来使能数据的读/写。同样的在掉电前,RTCEN位应该清除为0来预防误写入RTC寄存器中。
寄存器 | 地址 | R/W | 描述 | 复位值 |
RTCCON |
0x57000040(L 小端) 0x57000043(B 大端) |
R/W字节 | RTC控制寄存器 | 0x0 |
寄存器位信息:
RTCCON | 位 | 描述 | 初始状态 |
CLKRST | [3] |
RTC时钟计数复位 0:不复位 1:复位 |
0 |
CNTSEL | [2] |
BCD计数选择 0:融入BCD计数器 1:保留(分离BCD计数器) |
0 |
CLKSEL | [1] |
BCD时钟选择 0:XTAL 1/215分频时钟 1:保留(XTAL时钟只用于测试) |
0 |
RTCEN | [0] |
RTC控制使能 0:禁止 1:使能 注意:只能执行BCD时间计数和读操作 |
0 |
注意:所有RTC寄存器必须按自己为单位使用STRB或LDRB指令或char型指针访问;
2.2 时钟节拍计数寄存器TICNT
寄存器 | 地址 | R/W | 描述 | 复位值 |
TICNT |
0x57000044(L 小端) 0x57000047(B 大端) |
R/W字节 | 时钟节拍计数寄存器 | 0x0 |
寄存器位信息:
TICNT | 位 | 描述 | 初始状态 |
TICK INT使能 | [7] |
INT_TICK中断使能 0:禁止 1:使能 |
0 |
TICK时钟计数 | [6:0] |
时钟节拍计数值,1到127 此计数器值内部递减并且用户不能在工作中读取此计数器的值 |
000000 |
2.3 RTC闹钟控制寄存器RTCALM
RTCALM寄存器决定了闹钟使能和闹钟时间。请注意RTCALM寄存器在掉电模式中同时通过INT_RTC和PMWKUP产生闹钟信号,但是在正常工作模式中只产生INT_RTC。
寄存器 | 地址 | R/W | 描述 | 复位值 |
RTCALM |
0x57000050(L 小端) 0x57000053(B 大端) |
R/W字节 | RTC闹钟控制寄存器 | 0x0 |
寄存器位信息:
RTCALM | 位 | 描述 | 初始状态 |
保留 | [7] |
- |
0 |
ALMEN | [6] |
全局闹钟使能 0:禁止 1:使能 |
0 |
YAEREN | [5] |
年闹钟使能 0:禁止 1:使能 |
0 |
MONREN | [4] |
月闹钟使能 0:禁止 1:使能 |
0 |
DATAEN | [3] | 日闹钟使能
0:禁止 1:使能 |
0 |
HOUREN | [2] | 时闹钟使能
0:禁止 1:使能 |
0 |
MINEN | [1] | 分闹钟使能
0:禁止 1:使能 |
0 |
SECEN | [0] | 秒闹钟使能
0:禁止 1:使能 |
0 |
2.3.1 闹钟秒数据寄存器
寄存器 | 地址 | R/W | 描述 | 复位值 |
ALMSEC |
0x57000054(L 小端) 0x57000057(B 大端) |
R/W字节 | 闹钟秒数据寄存器 | 0x0 |
寄存器位信息:
ALMSEC | 位 | 描述 | 初始状态 |
保留 | [7] |
- |
0 |
SECDATA | [6:4] |
闹钟秒BCD值 0至5 |
000 |
[3:0] | 0至9 | 0000 |
2.3.2 闹钟分数据寄存器
寄存器 | 地址 | R/W | 描述 | 复位值 |
ALMMIN |
0x57000058(L 小端) 0x5700005B(B 大端) |
R/W字节 | 闹钟分数据寄存器 | 0x0 |
寄存器位信息:
ALMMIN | 位 | 描述 | 初始状态 |
保留 | [7] |
- |
0 |
MINDATA | [6:4] |
闹钟分BCD值 0至5 |
000 |
[3:0] | 0至9 | 0000 |
2.3.3 闹钟时数据据寄存器
寄存器 | 地址 | R/W | 描述 | 复位值 |
ALMHOUR |
0x5700005C(L 小端) 0x5700005F(B 大端) |
R/W字节 | 闹钟时数据寄存器 | 0x0 |
寄存器位信息:
ALMHOUR | 位 | 描述 | 初始状态 |
保留 | [7:6] |
- |
0 |
HOURDATA | [5:4] |
闹钟时BCD值 0至2 |
00 |
[3:0] | 0至9 | 0000 |
2.3.4 闹钟日数据寄存器
寄存器 | 地址 | R/W | 描述 | 复位值 |
ALMDATE |
0x57000060(L 小端) 0x57000063(B 大端) |
R/W字节 | 闹钟日数据寄存器 | 0x01 |
寄存器位信息:
ALMDATE | 位 | 描述 | 初始状态 |
保留 | [7:6] |
- |
0 |
DATEDATA | [5:4] |
闹钟日BCD值 0至3 |
00 |
[3:0] | 0至9 | 0001 |
2.3.5 闹钟月数据寄存器
寄存器 | 地址 | R/W | 描述 | 复位值 |
ALMMON |
0x57000064(L 小端) 0x57000067(B 大端) |
R/W字节 | 闹钟月数据寄存器 | 0x01 |
寄存器位信息:
ALMMON | 位 | 描述 | 初始状态 |
保留 | [7:5] |
- |
0 |
MONDATA | [4] |
闹钟月BCD值 0至1 |
00 |
[3:0] | 0至9 | 0001 |
2.3.6 闹钟年数据寄存器
寄存器 | 地址 | R/W | 描述 | 复位值 |
ALMYEAR |
0x57000068(L 小端) 0x5700006B(B 大端) |
R/W字节 | 闹钟年数据寄存器 | 0x0 |
寄存器位信息:
ALMYEAR | 位 | 描述 | 初始状态 |
YEARDATA | [7:0] |
闹钟年BCD值 00至99 |
0x0 |
2.4 BCD寄存器
2.4.1 BCD秒寄存器
寄存器 | 地址 | R/W | 描述 | 复位值 |
BCDSEC |
0x57000070(L 小端) 0x57000073(B 大端) |
R/W字节 | BCD秒寄存器 | 未定义 |
寄存器位信息:
BCDSEC | 位 | 描述 | 初始状态 |
保留 | [7] |
- |
- |
SECDATA | [6:4] |
秒BCD值 0至5 |
- |
[3:0] | 0至9 | - |
2.4.2 BCD分寄存器
寄存器 | 地址 | R/W | 描述 | 复位值 |
BCDMIN |
0x57000074(L 小端) 0x57000077(B 大端) |
R/W字节 | BCD分寄存器 | 未定义 |
寄存器位信息:
BCDMIN | 位 | 描述 | 初始状态 |
保留 | [7] |
- |
- |
MINDATA | [6:4] |
分BCD值 0至5 |
- |
[3:0] | 0至9 | - |
2.4.3 BCD时寄存器
寄存器 | 地址 | R/W | 描述 | 复位值 |
BCDHOUR |
0x57000078(L 小端) 0x5700007B(B 大端) |
R/W字节 | BCD时寄存器 | 未定义 |
寄存器位信息:
BCDHOUR | 位 | 描述 | 初始状态 |
保留 | [7:6] |
- |
- |
HOURDATA | [5:4] |
时BCD值 0至2 |
- |
[3:0] | 0至9 | - |
亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。
日期 | 姓名 | 金额 |
---|---|---|
2023-09-06 | *源 | 19 |
2023-09-11 | *朝科 | 88 |
2023-09-21 | *号 | 5 |
2023-09-16 | *真 | 60 |
2023-10-26 | *通 | 9.9 |
2023-11-04 | *慎 | 0.66 |
2023-11-24 | *恩 | 0.01 |
2023-12-30 | I*B | 1 |
2024-01-28 | *兴 | 20 |
2024-02-01 | QYing | 20 |
2024-02-11 | *督 | 6 |
2024-02-18 | 一*x | 1 |
2024-02-20 | c*l | 18.88 |
2024-01-01 | *I | 5 |
2024-04-08 | *程 | 150 |
2024-04-18 | *超 | 20 |
2024-04-26 | .*V | 30 |
2024-05-08 | D*W | 5 |
2024-05-29 | *辉 | 20 |
2024-05-30 | *雄 | 10 |
2024-06-08 | *: | 10 |
2024-06-23 | 小狮子 | 666 |
2024-06-28 | *s | 6.66 |
2024-06-29 | *炼 | 1 |
2024-06-30 | *! | 1 |
2024-07-08 | *方 | 20 |
2024-07-18 | A*1 | 6.66 |
2024-07-31 | *北 | 12 |
2024-08-13 | *基 | 1 |
2024-08-23 | n*s | 2 |
2024-09-02 | *源 | 50 |
2024-09-04 | *J | 2 |
2024-09-06 | *强 | 8.8 |
2024-09-09 | *波 | 1 |
2024-09-10 | *口 | 1 |
2024-09-10 | *波 | 1 |
2024-09-12 | *波 | 10 |
2024-09-18 | *明 | 1.68 |
2024-09-26 | B*h | 10 |
2024-09-30 | 岁 | 10 |
2024-10-02 | M*i | 1 |
2024-10-14 | *朋 | 10 |
2024-10-22 | *海 | 10 |
2024-10-23 | *南 | 10 |
2024-10-26 | *节 | 6.66 |
2024-10-27 | *o | 5 |
2024-10-28 | W*F | 6.66 |
2024-10-29 | R*n | 6.66 |
2024-11-02 | *球 | 6 |
2024-11-021 | *鑫 | 6.66 |
2024-11-25 | *沙 | 5 |
2024-11-29 | C*n | 2.88 |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了