S3C2440的RTC解析
S3C2440拥有一个实时时钟模块, 可以在当系统电源关闭后通过备用电池工作。RTC可以通过使用STRB/LDRB ARM操作发送8位二-十进制交换码(BCD)值数据给CPU。这些数据包括年、月、日、星期、时、分和秒的时间信息。RTC单元工作在外部32.768kHz晶振并且可以执行闹钟功能
实时时钟模块保存的数据是DCD码形式.
框图如下
可以看到,要使用实时时钟依靠以下几个寄存器
包含时钟使能和时钟复位(还有两个寄存器是测试模式,我们用不到)
关联着时钟节拍中断,也就是每增加1S发生一次中断
时钟中断,时钟的时分秒年月日都是可以进行使能的
接下来是时分秒年月日闹钟点设置
有六个就不一一列举了,意思是当到达这个时间点时发生中断,比如我设置23秒发生中断,那么每一分钟的23秒都会中断一次
还要注意,因为使用的是BCD计数,所以对时钟的读取,写入都要进行BCD码的转换,否则数据不对哦
详细查看代码
#include "rtc.h" char *week_num[7]={ "SUN","MON", "TUES", "WED", "THURS","FRI", "SAT" }; RTC_TIMER rtcTimer ; ALARM_TIMER alarmTimer ; /********************************
*
* TICK中断
*
*********************************/
void __irq RTC_tickHandler(void)
{
rSRCPND |= BIT_TICK;//清除源挂起
rINTPND |= BIT_TICK;//清除中断挂起
RTCGetValue();
printf("current year %d mouth %d day %d hour %d minute %d sec %d\r\n",rtcTimer.year,\
rtcTimer.month,rtcTimer.day,rtcTimer.hour,rtcTimer.minute,rtcTimer.second);
} /********************************
*
* alarm闹钟中断
*
*********************************/
void __irq RTC_alarmHandler(void)
{
rSRCPND |= BIT_RTC;//清除源挂起
rINTPND |= BIT_RTC;//清除中断挂起 printf("alarm int happend\r\n");
} //rtc获取时间
void RTCGetValue(void)
{
u8 temp = 0,cover = 0;
rRTCCON |= 0x01; //RTC读写使能,BCD时钟、计数器、无复位
temp = rBCDYEAR;
temp = ((temp/16)*10)+(temp%16);
rtcTimer.year = temp+YEAR_BASE; temp = rBCDMON;
temp = ((temp/16)*10)+(temp%16);
rtcTimer.month = temp; temp = rBCDDATE;
temp = ((temp/16)*10)+(temp%16);
rtcTimer.day = temp; temp = rBCDDAY;
temp = ((temp/16)*10)+(temp%16);
rtcTimer.weekDay = temp; temp = rBCDHOUR;
temp = ((temp/16)*10)+(temp%16);
rtcTimer.hour = temp; temp = rBCDMIN;
temp = ((temp/16)*10)+(temp%16);
rtcTimer.minute = temp; temp = rBCDSEC;
temp = ((temp/16)*10)+(temp%16);
rtcTimer.second = temp; rRTCCON &= ~(1<<0); //RTC读写禁止,BCD时钟、计数器、无复位
} void RTCSetValue(void)
{
u8 temp;
rRTCCON |= 0x01; //RTC读写使能,BCD时钟、计数器、无复位 temp = rtcTimer.year - YEAR_BASE;
temp = ((temp/10)*16)+(temp%10);
rBCDYEAR = temp; temp = rtcTimer.month;
temp = ((temp/10)*16)+(temp%10);
rBCDMON = temp; temp = rtcTimer.day;
temp = ((temp/10)*16)+(temp%10);
rBCDDATE = temp; temp = rtcTimer.weekDay;
temp = ((temp/10)*16)+(temp%10);
rBCDDAY = temp; temp = rtcTimer.hour;
temp = ((temp/10)*16)+(temp%10);
rBCDHOUR = temp; temp = rtcTimer.minute;
temp = ((temp/10)*16)+(temp%10);
rBCDMIN = temp; temp = rtcTimer.second;
temp = ((temp/10)*16)+(temp%10);
rBCDSEC = temp; rRTCCON &= ~(1<<0); //RTC读写禁止,BCD时钟、计数器、无复位
} void RtcSetAlarm(void)
{
u8 temp;
rRTCCON |= 0x01; //RTC读写使能,BCD时钟、计数器、无复位 temp = alarmTimer.year - YEAR_BASE;
temp = ((temp/10)*16)+(temp%10);
rALMYEAR = temp; temp = alarmTimer.month;
temp = ((temp/10)*16)+(temp%10);
rALMMON = temp; temp = alarmTimer.day;
temp = ((temp/10)*16)+(temp%10);
rALMDATE = temp; temp = alarmTimer.hour;
temp = ((temp/10)*16)+(temp%10);
rALMHOUR = temp; temp = alarmTimer.minute;
temp = ((temp/10)*16)+(temp%10);
rALMMIN = temp; temp = alarmTimer.second;
temp = ((temp/10)*16)+(temp%10);
rALMSEC = temp; rRTCALM = 0x41; //RTC闹钟控制寄存器,启动秒中断和总中断 rRTCCON &= ~(1<<0); //RTC读写禁止,BCD时钟、计数器、无复位
} void RtcInit(u8 tick)
{
rtcTimer.year = 2014;
rtcTimer.month = 10;
rtcTimer.day = 10;
rtcTimer.weekDay = 5;
rtcTimer.hour = 16;
rtcTimer.minute = 34;
rtcTimer.second = 52;
alarmTimer.year = 2014;
alarmTimer.month = 10;
alarmTimer.day = 10;
alarmTimer.weekDay = 5;
alarmTimer.hour = 16;
alarmTimer.minute = 34;
alarmTimer.second = 52;
rRTCCON = 0x01;
rTICNT=(tick&0x7f)|0x80; //使能中断 RTCSetValue();//设置时间
RtcSetAlarm();//设置闹钟
//开启中断
pISR_RTC = (unsigned)RTC_alarmHandler;
pISR_TICK=(unsigned)RTC_tickHandler; //中断函数入口地址 rSRCPND |= BIT_RTC;//清除源挂起
rINTPND |= BIT_RTC;//清除中断挂起
rINTMOD &= ~BIT_RTC;//设置中断模式为IRQ模式 rSRCPND |= BIT_TICK;//清除源挂起
rINTPND |= BIT_TICK;//清除中断挂起
rINTMOD &= ~BIT_TICK;//设置中断模式为IRQ模式 rINTMSK &= ~BIT_RTC; //开中断
rINTMSK &= ~BIT_TICK; //开中断 }
#ifndef __RTC_H
#define __RTC_H
#include "2440addr.h"
#include "def.h"
#include "uart0.h" #define YEAR_BASE 2000 typedef struct RTC_TIMER
{
u16 year;
u8 month;
u8 day;
u8 weekDay;
u8 hour;
u8 minute;
u8 second;
}RTC_TIMER; typedef struct ALARM_TIMER
{
u16 year;
u8 month;
u8 day;
u8 weekDay;
u8 hour;
u8 minute;
u8 second;
}ALARM_TIMER; extern struct RTC_TIMER rtcTimer; void RTCGetValue(void); void RTCSetValue(void); void RtcSetAlarm(void); void RtcInit(u8 tick); #endif
S3C2440的RTC解析的更多相关文章
- S3C2440上RTC时钟驱动开发实例讲解(转载)
嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤.一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便.如有错误之处,谢请指正. 共享资源,欢迎转载:http:/ ...
- s3c2440 的 rtc 操作
实时时钟(RTC)其主要功能是电源故障的制度下,使用后备电源,时钟继续.为了不浪费时间信息. s3c2440内部集成了RTC模块,并且用起来也十分简单. 其内部的寄存器BCDSEC,BCDMIN,BC ...
- S3C2440硬件连接解析
S3c2440是三星公司推出的一款基于ARM920T的处理器,采用ARM内核,不同于单片机,无片上rom与ram,必须搭配相应的外围电路进行使用,现在,让我们从零开始进行这一块MCU的学习,为了入门简 ...
- S3C2440的SPI解析
位串行数据的频率.如果只希望发送,则接收数据可以保持伪位(dummy).此外如果只希望接收,则需要发送伪位'1'数据 使用SPI主要需要以下寄存器 选择SPI模式,中断模式,查询模式等SCK选择,主从 ...
- S3C2440看门狗解析
个PCLK周期的复位信号 也就是说,在某些环境下,看门狗可以当做定时器使用,当他中断的时候并不发生复位,只发生中断,我看看图 看门狗的中断和复位信号是可以依靠wtcon来切断的(看门狗的时钟是无法切断 ...
- 应用程序 /dev/rtc 编程 获取时间 2011-12-13 01:01:06【转】
本文转载自:http://blog.chinaunix.net/uid-16785183-id-3040310.html 分类: 原文地址:应用程序 /dev/rtc 编程 获取时间 作者:yuwei ...
- [nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC
一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻 ...
- 关于在Arduino下STM32编程——RTC函数解析
注意:相关RTC基础知识这里不提! 该库头文件引用: #include <RTClock.h> 该库所在Arduino位置: 初始化RTC相关时钟 Arduino版的库里初始化配置PW ...
- S3C2440启动代码2440init.s彻底解析
可以选择nand启动和nor启动,这两者之间的关系通过一个按键来选择 这个OM0有何玄机,在数据手册中有这么一段 位宽RAM启动了(当然,还得设置一些东西,下面就说), Nanaflash启动经历的过 ...
随机推荐
- Oracle Sql优化之lead,lag分析函数
1.表中有四个字段:人员编号,开始时间,结束时间,类型,数据ID,需要实现如下需求 a.当类型为-1时,丢弃该记录 b.当类型为-1时,且前一行结束时间为null,当前行的开始时间-1作为前一行的结束 ...
- 转:浅谈手机app测试注意点
现在我们测试时,开发会先在本地机上打好测试包,自己安装,轮完一轮,开发修改好后,再打一个包.以下是功能测试时需要注意的点: 1.登录 ●登录用户名和密码错误时,界面有提示信息 ●用户主动退出登录后,下 ...
- material design 的android开源代码整理
material design 的android开源代码整理 1 android (material design 效果的代码库) 地址请点击:MaterialDesignLibrary 效果: 2 ...
- 在Visual C++中的用ADO进行数据库编程
1. 生成应用程序框架并初始化OLE/COM库环境 创建一个标准的MFC AppWizard(exe)应用程序,然后在使用ADO数据库的InitInstance函数中初始化OLE/COM库(因为ADO ...
- PAT乙1002
有毒,真的有毒,难题对于简单题影响太大了,想的东西太多,总会在考虑,会不会时间超限,数据量有多大,三个循环就太慢了.... 总之我是真的不愿意看到这样的程序能过的,总觉得有更好的,却总是找不更好的额. ...
- PHP递归算法的一个实例 帮助理解
递归函数为自调用函数,在函数体内直接或间接自己调用自己,但需要设置自调用的条件,若满足条件,则调用函数本身,若不满足则终止本函数的自调用,然后把目前流程的主控权交回给上一层函数来执行,可能这样给大家讲 ...
- linux仅修改文件夹权限;linux 分别批量修改文件和文件夹权限
比如我想把/var/www/html下的文件全部改成664,文件夹改成775,怎么做呢 方法一: 先把所有文件及文件夹改成664,然后把所有文件夹改成775 root@iZ25bq9kj7yZ:/ c ...
- myeclipse连接hadoop集群编程及问题解决
原以为搭建一个本地编程测试hadoop程序的环境很简单,没想到还是做得焦头烂额,在此分享步骤和遇到的问题,希望大家顺利. 一.要实现连接hadoop集群并能够编码的目的需要做如下准备: 1.远程had ...
- OpenGL学习-------visual studio 2010配置和第一个OpenGL程序讲解
OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenG ...
- 常用Select语句
--语 句 功 能--数据操作SELECT --从数据库表中检索数据行和列INSERT --向数据库表添加新数据行DE ...