完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在一个嵌入式系统中,实时时钟单元可以提供可靠的时钟,包括时、分、秒和年、月、日。即使系统处于关机状态下,它也能够正常工作(通常采用后备电池供电,能够可靠工作十年),其外围也不需要太多的辅助电路,只需要一个高精度的晶振。
它具有以下特点: • 时钟数据采用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)); } 原作者:痞子晶 |
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
飞凌嵌入式ElfBoard ELF 1板卡-在ELF 1开发环境中使用QT Creator进行远程调试
1468 浏览 0 评论
1512 浏览 0 评论
ElfBoard ELF 1板卡-开发板启动后打印random: nonblocking pool is initialized
868 浏览 0 评论
G2D图像处理硬件调用和测试-基于米尔-全志T113-i开发板
7186 浏览 0 评论
飞凌嵌入式ElfBoard ELF 1板卡- 减少uboot阶段的等待时间
2030 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-5-5 09:44 , Processed in 0.613759 second(s), Total 66, Slave 50 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号