热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RTC实时时钟

在一个嵌入式系统中,通常采用RTC来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电)。它的外围也不需要太多的辅助电路,

作者:宋老师,华清远见嵌入式学院讲师。

1.1 RTC介绍

在 一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电)。它的外围也不需要太多的辅助电 路,典型的就是只需要一个高精度的32.768kHz晶体和电阻电容等,如图10-8所示。

,
图10-8 RTC外接电路

1.2 RTC控制器

实时时钟(RTC)单元可以通过备用电池供电,因此,即使系统电源关闭,它也可以继续工作。RTC 可以通过STRB/LDRB 指令将8 位BCD 码数据送至CPU。这些BCD 数据包括秒、分、时、日期、星期、月和年。RTC 单元通过一个外部的32.768kHz晶振提供时钟。RTC具有定时报警的功能,如图10-9所示。RTC 控制器功能说明:

,
图10-9 RTC控制器

时钟数据采用BCD 编码。
        能够对闰年的年月日进行自动处理。
        具有告警功能,当系统处于关机状态时,能产生告警中断。
        具有独立的电源输入。
        提供毫秒级时钟中断,该中断可用于作为嵌入式操作系统的内核时钟。

1.3 RTC控制器寄存器详解

如表10-9所示为相关寄存器描述。

表10-9 RTC控制寄存器

RTCCON 描述 复位值
保留 [31:9] 保留 0
TICEN [8] 嘀嗒计时器
0 = 禁止
1 = 使能
0
TICCKSEL [7:4] 嘀嗒计时器子时钟源选择
4’b0000 = 32768 Hz  4’b0001 = 16384 Hz
4’b0010 = 8192 Hz   4’b0011 = 4096 Hz
4’b0100 = 2048 Hz   4’b0101 =1024 Hz
4’b0110 =512 Hz     4’b0111 =256 Hz
4’b1000 =128 Hz     4’b1001 =64 Hz
4’b1010 =32 Hz      4’b1011 =16 Hz
4’b1100 =8 Hz       4’b1101 =4 Hz
4’b1110 =2 Hz       4’b1111 =1 Hz
4’b0000
CLKRST [3] RTC时钟计数复位
0 = 不复位
1 = 复位
0
CNTSEL [2] BCD计数选择
0 = 分配 BCD 计数
1 = 保留
0
CLKSEL [1] BCD 时钟选择
0 = XTAL 1/, divided clock
1 = 保留(XTAL 供频)
0
RTCEN [0] RTC控制使能
0 = 禁止
1 = 使能
0

如表10-10所示为BCD值寄存器描述。

表10-10  BCD值寄存器

BCDSEC 描述 复位值
保留 [31:7] 保留 -
SECDATA [6:4] BCD 值
0~5
-
[3:0] 0~9 -

1.4 实验11 实时时钟RTC实验

1.4.1 实验目的

了解 RTC的硬件控制原理及设计方法;
        掌握 S5PV210 处理器的RTC模块程序设计方法(计时功能、闹钟功能、时间片功能);

1.4.2 实验原理

实时时钟(RTC)单元可以在当系统电源关闭后通过备用电池工作。RTC可以通过使用STRB/LDRB ARM操作发送 8 位二-十进制交换码(BCD)值数据给CPU。这些数据包括年、月、日、星期、时、分和秒的时间信息。根据上面阐述RTC的工作原理和RTC的寄存器的介 绍。对相应的寄存器读写就可以实现修改时间和现实时间。

1.4.3 实验内容

1、 RTC设计步骤
        1) 系统复位后在 RTC 控制程序中必须设置为1来使能数据的读/写。
        2) 设置RTC当前时钟时间。
        3) 同样的在掉电前,RTCEN位应该清除为0 来预防误写入RTC寄存器中。
        4) 读取年、月、日等相关寄存器的数据显示到屏幕上。

2、 看门软件程序设计

下面的代码实现了一个设置RTC的年月日、时分秒,并将其读出的功能。

#include "s5pv210.h"

        void rtc_init(void)
        {
                RTC.RTCCON = 0X01; //时钟控制器 使能RTC控制
                RTC.BCDSEC = 0x59; //秒控制器
                RTC.BCDMIN = 0x56; //分控制器
                RTC.BCDHOUR = 0x16; //时控制器
                RTC.BCDDAY = 0x12; //日控制器
                RTC.BCDDAYWEEK = 0X05; //星期控制器
                RTC.BCDMON = 0x10; //月控制器
                RTC.BCDYEAR = 0x14; //年控制器

                RTC.RTCCON = 0; //时钟控制器 使能RTC控制
        }

        /********************main function*************************************/
        int main()
        {
                unsigned int i = 0;

                uart0_init(); //串口初始化
                rtc_init(); //RTC 初始化

                while(1) //循环打印时钟
                {
                        printf("year 20%x : mon %x : date %x :day %d ", RTC.BCDYEAR, RTC.BCDMON, RTC.BCDDAY, RTC.BCDDAYWEEK);
                        printf("hour %x : min %x : sec %x\n", RTC.BCDHOUR, RTC.BCDMIN, RTC.BCDSEC);
                        for(i = 0; i <1500000; i++);
                }
                return 0;
        }

1.4.4 实验步骤

实验操作步骤请参考第5.4.4或7.3.4章节,

光盘实验源码路径:华清远见-CORTEXA8资料2\实验资料\1. ARM体系结构与接口技术部分\14-rtc

1.4.5 实验现象

Debug 调试点击运行按钮, ,在调试助手接收区你可以看到终端打印信息如图所示。RTC时钟的秒数据是在一秒一秒的增加。

,
图 打印实时时钟信息

文章来源:华清远见嵌入式学院,原文地址:http://www.embedu.org/Column/Column867.htm

更多相关嵌入式免费资料查看华清远见讲师博文>>

RTC实时时钟,,

RTC实时时钟


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
author-avatar
dgh
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有