ARM9 mini2451裸机学习——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上显示。


贴代码:

#ifndef _RTC_H_
#define _RTC_H_

#define rRTCCON   (*(volatile unsigned  long *)0x57000040)
#define rBCDYEAR  (*(volatile unsigned  long *)0x57000088) 
#define rBCDMON   (*(volatile unsigned  long *)0x57000084) 
#define rBCDDAY   (*(volatile unsigned  long *)0x57000080) 
#define rBCDDATE  (*(volatile unsigned  long *)0x5700007C) 
#define rBCDHOUR  (*(volatile unsigned  long *)0x57000078) 
#define rBCDMIN   (*(volatile unsigned  long *)0x57000074) 
#define rBCDSEC   (*(volatile unsigned  long *)0x57000070) 

extern void RTC_Time_Set(char wRTCyear,char wRTCmon,char wRTCdate,char wRTCday,char wRTChour,char wRTCmin,char wRTCsec );//ʱ¼äÉèÖú¯Êý
extern void RTC_Time_display(void);
extern char BCDToInt(char bcd);
extern void time_set(void);
extern char IntToBCD(char num);

#endif

void RTC_Time_Set(char wRTCyear,char wRTCmon,char wRTCdate,char wRTCday,char wRTChour,char wRTCmin,char wRTCsec )//时间处置化设置 
//入参为十六进制BCD码形式
{
	rRTCCON = (1 << 0) ;  //RTC control enable.
	rBCDYEAR = wRTCyear ;  
	rBCDMON  = wRTCmon ;  
	rBCDDATE = wRTCdate ;  
	rBCDDAY  = wRTCday ;  
	rBCDHOUR = wRTChour ; 
	rBCDMIN  = wRTCmin ;  
	rBCDSEC  = wRTCsec ; 
	rRTCCON  &= ~(1 << 0) ;  //RTC read and write disable
}

void RTC_Time_display(void)//显示
{
	const unsigned char time[30];
	char rRTCyear;
	char rRTCmon;
//	char rRTCdate;
	char rRTCday;
	char rRTChour;
	char rRTCmin;
	char rRTCsec;
	
	rRTCCON = (1 << 0) ; 
	rRTCyear = rBCDYEAR ; 
	rRTCmon  = rBCDMON; 
//	rRTCdate = rBCDDATE ;
	rRTCday  = rBCDDAY ;  
	rRTChour = rBCDHOUR ;  
	rRTCmin  = rBCDMIN  ; 
	rRTCsec  = rBCDSEC ;  
	rRTCCON  &= ~(1 << 0) ;  //RTC read and write disable
	
	rRTCyear = BCDToInt(rRTCyear);
	rRTCmon = BCDToInt(rRTCmon);
	rRTCday = BCDToInt(rRTCday);
	rRTChour = BCDToInt(rRTChour);
	rRTCmin = BCDToInt(rRTCmin);
	rRTCsec = BCDToInt(rRTCsec);
	
	sprintf(time,"20%2d %2d %2d %2d:%2d:%2d",rRTCyear,rRTCmon,rRTCday,rRTChour,rRTCmin,rRTCsec);
	lcd_draw_ch_en_str(time,290,1,0xff00,0xffffff);
}

char BCDToInt(char bcd) //BCD转十进制形式  8421码
{
      return (0xff & (bcd>>4))*10 + (0xf & bcd);
}

char IntToBCD(char num)	//十进制转十六进制BCD码
{
			return (((num / 10) * 16) + (num % 10));
}



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值