S3C2440的RTC解析

发布者:FreeSpirit123最新更新时间:2017-01-07 来源: eefocus关键字: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解析

上一篇:S3C2440的定时器详解
下一篇:S3C2440的SPI解析

推荐阅读最新更新时间:2024-03-16 15:29

RTC的I2C总线铁电存储器FM31256
FM31256是由Ramtron公司推出的新一代多功能系统监控和非易失性铁电存储芯片。与其他非易失性存储器比较,它具有如下优点: 读/写速度快,没有写等待时间;功耗低,静态电流小于1 mA,写入电流小于150 mA;擦写使用寿命长,芯片的擦写次数为100亿次,比一般的EEPROM存储器高10万倍,即使每秒读/写30次,也能用10年;读/写的无限性,芯片擦写次数超过100亿次后,还能和SRAM一样读/写。 铁电存储器(FRAM)的核心技术是铁电晶体材料。这一特殊材料使铁电存储器同时拥有随机存取存储器(RAM)和非易失性存储的特性。本文介绍了FM31256的主要功能,并具体给出了基于嵌入式C语言编写的存储器读/写程序。 1 FM31
[缓冲存储]
【STM32】RTC实时时钟,步骤超细详解,一文看懂RTC
什么是RTC RTC (Real Time Clock):实时时钟 RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。 在断电情况下 RTC仍可以独立运行 只要芯片的备用电源一直供电,RTC上的时间会一直走。 RTC实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断)。但其高级指出也就在于掉电之后还可以正常运行。 两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时( 12 或 24 小
[单片机]
【STM32】<font color='red'>RTC</font>实时时钟,步骤超细详解,一文看懂<font color='red'>RTC</font>
S3C2440裸机实验(7)----LCD驱动
lcd只要搞清楚了时序其实还是比较简单的,现在LINUX下的LCD驱动如果是像三星的处理器都有很好的支持,只需要修改一些参数就OK了,如果是芯片级的驱动那是比较复杂的,主要是涉及到Framebuffer会让人很抓狂,等完成了裸机的驱动我将会开始写linux的驱动程序编写的文章,请各位网友关注并提出宝贵意见!!! 先来看一下s3c2440中LCD控制器的结构: 从上面结构图可以看出:整个lcd控制器大致可以由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器几个部分组成。 1。REGBANK由17个可编程的寄存器组和一块256*16的调色板内存组成,它们用来配置LCD控制器的 2。LCDCDM
[单片机]
<font color='red'>S3C2440</font>裸机实验(7)----LCD驱动
STM32学习笔记一一RTC实时时钟
1. 简述 STM32 的实时时钟(RTC)是一个独立的定时器。 STM32 的 RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC 模块和时钟配置系统 (RCC_BDCR 寄存器)是在后备区域,即在系统复位或从待机模式唤醒后 RTC 的设置和时间维持不变。但是在系统复位后,会自动禁止访问后备寄存器和 RTC,以防止对后备区域 (BKP) 的意外写操作。所以在要设置时间之前, 先要取消备份区域(BKP)写保护。 RTC 由两个主要部分组成(参见上图), 第一部分(APB1 接口)用来和 APB1 总线相连。此单元还包含一组 16 位寄存器
[单片机]
STM32学习笔记一一<font color='red'>RTC</font>实时时钟
ARM-Linux s3c2440 之中断分析(二)
软件篇: 上一篇文章回顾了s3c2440的中断控制器原理的相关硬件知识,有了这个基础再来分析Linux中的软件分析方式,心里就有底了。面对浩瀚如海的Linux源代码,s3c2440的中断到底是怎样呢,如何处理,如何实现的呢?一步一步来揭开它神秘的面纱吧,当然需要从Linux内核源码入手! 在Linux中start_kernel()时会进行体系结构的初始化:init_IRQ(), 故名思议,其源代码如下: view plain copy void __init init_IRQ(void) { intirq; for(irq = 0; irq NR_IRQS; i
[单片机]
Linux平台上S3C2440的物流配送系统设计
引言 现代的物流系统已经进入了信息化的阶段。信息化配送系统对信息化物流有着重要的影响。物流配送信息化,就是运用现代信息系统与电子化手段加强对企业物流链管理,形成企业物流的支撑体系,进而实现物流配送的高效率与高效益。本文通过嵌入式系统模块与GPS定位技术的融合,加上计算机控制中心,形成一个比较完善的物流配送系统。在物流配送过程中,通过这个系统对整个物流配送过程进行监控与管理。 1 相关核心技术概述 1.1 移动定位技术 目前的移动定位技术已经非常成熟,最主要的有3类: ①利用卫星进行后方交汇的定位技术,即GPS(Global Positioning System,全球定位系统),是由美国建立的一个卫星导航定位系。利用该
[单片机]
Linux平台上<font color='red'>S3C2440</font>的物流配送系统设计
嵌入式驱动编写之简单驱动Hello_word
开发环境 BootLoader:u-boot-1.1.6 kernel:linux-2.6.30.4 cpu:S3C2440 步骤 1、编写驱动代码 这应该是最简单的一个驱动了,只在内核打印一下信息,代码如下: #include linux/module.h #include linux/kernel.h MODULE_LICENSE( GPL ); static int __init le2440_hello_init(void) { printk( 1 n Hello,changle_2440!n ); printk( 1 nThis is first driver progr
[单片机]
嵌入式驱动编写之简单驱动Hello_word
S3C2440-裸机篇-05 | S3C2440时钟体系详解(FCLK、PCLK、HCLK)
1.时钟架构 简化一下如图所示: 1.1.时钟源的选择 S3C2440的时钟源来源有两种: 外部晶振(OSC) 外部时钟信号(EXTCLK) 选择哪一路作为S3C2440的时钟源由模式控制引脚OM3和OM2引脚(的电平)决定,如何选择见下图: 以JZ2440开发板为例,其使用的是12Mhz外部晶振, 硬件电路如下: 其OM3和OM2选择引脚设置如下,选择第一种方式: 1.2.MPLL改变主时钟FCLK的控制时序(上电复位时序) 2.实验 —— LED闪烁(为了后续对比) 2.1.实验目的 使用C语言控制LED闪烁。 2.2.实验代码 启动文件与之前相同; C程序添加延时函数delay修改后如下: v
[单片机]
S3C2440-裸机篇-05 | <font color='red'>S3C2440</font>时钟体系详解(FCLK、PCLK、HCLK)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved