您的位置 首页 国产IC

五 ARM9(S3C2440)的实时时钟(RTC)-理论知识及程序实例解说

在一个嵌入式系统中,实时时钟单元可以提供可靠的时钟,包括时、分、秒和年、月、日。即使系统处于关机状态下,它也能够正常工作(通常采用

在一个嵌入式体系中,实时时钟单元能够供给牢靠的时钟,包含时、分、秒和年、月、日。即便体系处于关机状况下,它也能够正常作业(一般选用后备电池供电,能够牢靠作业十年),其外围也不需要太多的辅佐电路,只需要一个高精度的晶振。

它具有以下特色:

时钟数据选用BCD编码或二进制表明;

能够对闰年的年、月、日进行主动处理;

具有告警功用,当体系处于关机状况时,能发生告警中止;

具有独立的电源输入;

供给毫秒级的时钟中止,该中止可用于嵌入式操作体系的内核时钟。

实时时钟特别功用寄存器
实时时钟操控(RTCCON)寄存器
RTCCON 寄存器由4 位组成,如操控BCD 寄存器读/写使能的RTCEN、CLKSEL、CNTSEL 和测试用的
CLKRST。
RTCEN 位能够操控一切CPU 与RTC 之间的接口,因此在体系复位后在RTC 操控程序中有必要设置为1 来使
能数据的读/写。相同的在掉电前,RTCEN 位应该铲除为0 来防备误写入RTC 寄存器中。

RTC 闹钟操控(RTCALM)寄存器
RTCALM 寄存器决议了闹钟使能和闹钟时刻。请留意RTCALM 寄存器在掉电形式中一起经过INT_RTC 和
PMWKUP 发生闹钟信号,但是在正常作业形式中只发生INT_RTC。

闹钟秒数据(ALMSEC)寄存器:闹钟秒数据寄存器

同理:闹钟分数据(ALMMIN)寄存器,闹钟时数据(ALMHOUR)寄存器,闹钟日数据(ALMDATE)寄存器,闹钟月数据(ALMMON)寄存器,闹钟年数据(ALMYEAR)寄存器

BCD 秒(BCDSEC)寄存器:存储的是当时时刻秒,相同还有,BCDMIN,BCDHOUR,BCDDATE(日),BCDDAY(星期),BCDMON,BCDYEAR

留意以上这些寄存器存储的数据都是BCD码,便是主动处理的数据,假如自己想做时钟显现时,假如调时刻的请留意时刻加减时实践上是十六进制的

下面结合详细的程序介绍一下RTC操作

程序编写包含三步,第一步是时钟初始化,第二步把嵌入式操控体系投入运转时要将当时精确时刻写入RTC,俗称效表;第三步是体系正常运转后,读取RTC时刻在LCD上显现。

废话少说,上程序(开发板FL2440)

#include “def.h”
#include “option.h”
#include “2440addr.h”
U8 beep=1;
void __irq IsrAlarm(void);//下面这些都是函数声明
void delay(int x);
void RTC_Alm_Set(U8 almyear,U8 almmon,U8 almdate,
U8 almhour,U8 almmin,U8 almsec);
void RTC_Time_Set( U8 wRTCyear,U8 wRTCmon,U8 wRTCdate,U8 wRTCday,U8 wRTChour,U8 wRTCmin,U8 wRTCsec );
void OpenAlarm(void) ;
void CloseAlarm(void) ;
//==================================================================================
void RTC_Time_Set( U8 wRTCyear,U8 wRTCmon,U8 wRTCdate,U8 wRTCday,U8 wRTChour,U8 wRTCmin,U8 wRTCsec )//时刻设置函数,操作是不是比较简单?呵呵

{
rRTCCON = 1 ;//RTC 读写使能

rBCDYEAR = wRTCyear ;//年
rBCDMON= wRTCmon ;//月
rBCDDATE = wRTCdate ;//日
rBCDDAY= wRTCday ;//星期
rBCDHOUR = wRTChour ;//小时
rBCDMIN= wRTCmin ;//分
rBCDSEC= wRTCsec ;//秒

rRTCCON &= ~1 ;//RTC read and write disable
}
void RTC_Alm_Set(U8 almyear,U8 almmon,U8 almdate,
U8 almhour,U8 almmin,U8 almsec)//年、月、日、时、分、秒//闹钟设置
{rRTCCON=0x01;//RTCCON实时时钟操控寄存器,
//【0】位RTC使能信号操控位,0为制止,1为答应
//对RTC模块进行读写操作前应对其最低位至1
rALMYEAR = almyear;
rALMMON= almmon;
rALMDATE = almdate;
rALMHOUR = almhour;
rALMMIN= almmin;
rALMSEC= almsec;

rRTCCON = 0;//读取数据完后制止使能信号,以防误操作,
//整个文件的设置都相同,不重覆
}
void OpenAlarm(void) //开闹钟函数
{
pISR_RTC = (unsigned)IsrAlarm;//中止寄存器ISR中的RTC中止位
ClearPending(BIT_RTC);
rRTCALM = (0x7f); //RTCALM闹钟操控寄存器,

//【0-7】别离对应秒到年的闹钟 使能,
//相应位0表明制止,1表明答应
EnableIrq(BIT_RTC);//开中止

}

//关闹钟功用函数
void CloseAlarm(void)
{
rRTCALM = 0; //RTCALM闹钟操控寄存器一切位制止
DisableIrq(BIT_RTC);//关中止
}
void __irq IsrAlarm(void)//使用中止,闹钟时进入中止函数
{
ClearPending(BIT_RTC);//SRCPND,INTPND别离置1.
beep = 0;// 蜂鸣器标志位清0
CloseAlarm();//关闹钟,即假如要开闹钟的先要把它关了,再开。
}
void delay(int x)//延时函数
{
while(x)
{
int k,j;
for(k=0xff;k>0;k–)
for(j=0xff;j>0;j–);
x–;
}
}

//==================================================================================
void RTCmain(void)
{
rGPBCON = (1<<0)|(1<<10)|(1<<12)|(1<<16)|(1<<20);// GPB5,GPB6,GPB8,GPB10设置为输出,别离连了4个LED
rGPBDAT|=0x560;//4个LED全灭
RTC_Time_Set(0x11,0x08,0x06,0x06,0x10,0x00,0x00) ;//设置时刻
RTC_Alm_Set(0x11,0x08,0x06,0x10,0x01,0x00);//设置闹钟时刻按
OpenAlarm();
while(1)
{
if(beep==0)
{
rGPBDAT=0x01;//灯亮,蜂鸣器响
delay(1000);
rGPBDAT=0x561;//灯灭,实践是闪耀
delay(1000);
}
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/256922.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部