RTC(Real-Time Clock):实时时钟。它的主要作用就是提供稳定的实时时钟给后续电路用。主要功能有:时钟,日历,闹钟,周期性中断输出,32KHz时钟输出。系统掉电的情况下,利用后备电源使时钟继续运行,从而不会丢失时间信息。
下面简要介绍一下它的用法:
用到的寄存器:
RTCCON :控制寄存器
TICNT:节拍时间计数器
RTCALM:闹钟控制寄存器
ALMSEC:秒闹钟寄存器
ALMMIN:分闹钟寄存器
ALMHOUR:小时闹钟寄存器
ALMDATE:日闹钟寄存器
ALMMON:月闹钟寄存器
ALMYEAR:年闹钟寄存器
BCDSEC :秒寄存器
BCDMIN:分寄存器
BCDHOUR:时寄存器
BCDDAY:星期寄存器
BCDDATE:日寄存器
BCDMON:月寄存器
BCDYEAR:年寄存器
1,首先通过RTCCON的第一位使能RTC:
[html] view plaincopy
- rRTCCON = 1 ; //RTC read and write enable
2,设定初始时间,通过写相应寄存器完成:
1. rBCDYEAR = 0x11 ; //年
2. rBCDMON = 0x11 ; //月
3. rBCDDATE = 0x26 ; //日
4. rBCDDAY = 0x06 ; //星期
5. rBCDHOUR = 0x11 ; //小时
6. rBCDMIN = 0x09 ; //分
7. rBCDSEC = 0x30 ; //秒
3.然后不断地从相应寄存器中读取RTC的值:
1. year = 0x2000+rBCDYEAR ; //年
2. month = rBCDMON ; //月
3. day = rBCDDATE ; //日
4. / week = rBCDDAY ; //星期
5. hour = rBCDHOUR ; //小时
6. minute = rBCDMIN ; //分
7. second = rBCDSEC ; //秒
4,读取出来之后要关掉RTC读写功能,防止误写,如有需要可以对其格式进行转化:
1. Uart_Printf( "RTC time : %04x-%02x-%02x %02x:%02x:%02x\n", year, month, day, hour, minute, second );
2. //以16进制打印rtc time,因为存进去的是16进制
3. Delay( 900 ) ;//延时约一秒
That's it!
下图可以看到RTC工作流程:
上图中Time Tick Generrator产生TIME TICK信号,Alarm Generrator 产生INT_RTC信号,分别是s3c2440实时时钟(RTC)中的两个中断源:报警中断和时间节拍中断。
下面介绍一下他们的原理(此段参考赵老师的讲解):
1,报警中断可以实现当实时时间达到预置的时间后,引起报警。RTC在掉电模式中或正常工作模式中的指定时间产生一个闹钟信号。在正常工作模式中,只激活闹钟中断(INT_RTC)信号。RTC闹钟寄存器(RTCALM)决定了闹钟使能/禁止状态和闹钟时间设置的条件。预置的时间是存储在报警时间数据寄存器中的,包括ALMYEAR(年)、ALMMON(月)、ALMDATE(日)、ALMHOUR(小时)、ALMMIN(分)和ALMSEC(秒)。而如何报警,是由报警控制寄存器RTCALM控制的。
1. //报警中断
2. void __irq Alarm_ISR(void)
3. {
4. <<30;
5. <<30;
6.
7. rTICNT = 0xbf; //开启时间节拍中断,周期为500毫秒
8. }
2,时间节拍中断类似于定时器中断。但时间节拍中断是毫秒级的,而定时器中断可以达到微秒,甚至更小级别。
RTC节拍时间是用于中断请求。TICNT寄存器有一个中断使能位和中断的计数值。当节拍时间中断发生时计数值到达‘0’。然后中断周期如下:
------周期=(n+1)/128秒
------n:节拍时间计数值(1至127)
1. //时间节拍中断,用于LED闪烁15秒
2. void __irq RTCTick_ISP(void)
3. {
4. static char count;
5. <<8;
6. <<8;
7.
8. 2==0) //LED亮0.5秒
9. rGPBDAT = ~0x1e0;
10. else //LED灭0.5秒
11. rGPBDAT = 0x1e0;
12. count++;
13. count==30)
14. {
15. rTICNT = 0x0; //禁止时间节拍中断
16. rGPBDAT = 0x1e0; //LED灭
17. count=0;
18. }
19. }
RTC.c源码,实现在串口打印实时时间。
1. //====================================================================
2. // File Name : RTC.c
3. // Function : S3C24X0 RTC Test
4. // Program : Kang, Weon Tark
5. // Date : May 22, 2002
6. // Version : 0.0
7. // History
8. // 0.0 : Programming start (March 29,2002) -> KWT
9. // RTC Test -> May 15, 2002 SOP
10. //====================================================================
11.
12. #include "def.h"
13. #include "option.h"
14. #include "2440addr.h"
15. #include "2440lib.h"
16. #include "2440slib.h"
17.
18. //==================================================================================
19. void RTC_Time_Set( void )//设置rtc初值
20. {
21. rRTCCON = 1 ; //RTC read and write enable
22. //往相应BCD寄存器中写入初值
23. rBCDYEAR = 0x11 ; //年
24. rBCDMON = 0x11 ; //月
25. rBCDDATE = 0x26 ; //日
26. rBCDDAY = 0x06 ; //星期
27. rBCDHOUR = 0x11 ; //小时
28. rBCDMIN = 0x09 ; //分
29. rBCDSEC = 0x30 ; //秒
30.
31. rRTCCON &= ~1 ; //RTC read and write disable
32. }
33.
34. //==================================================================================
35. void RTC_Display(void)
36. {
37. U16 year ;
38. U8 month, day ; // week
39. U8 hour, minute, second ;
40.
41. RTC_Time_Set() ;
42.
43. Uart_Printf( "RTC TIME Display, press ESC key to exit !\n" ) ;
44.
45. while( Uart_GetKey() != ESC_KEY )
46. {
47. rRTCCON = 1 ; //RTC read and write enable
48. //不断读相应BCD寄存器中的值
49. year = 0x2000+rBCDYEAR ; //年
50. month = rBCDMON ; //月
51. day = rBCDDATE ; //日
52. // week = rBCDDAY ; //星期
53. hour = rBCDHOUR ; //小时
54. minute = rBCDMIN ; //分
55. second = rBCDSEC ; //秒
56.
57. rRTCCON &= ~1 ; //RTC read and write disable
58.
59. Uart_Printf( "RTC time : %04x-%02x-%02x %02x:%02x:%02x\n", year, month, day, hour, minute, second );
60. //以16进制打印rtc time,因为存进去的是16进制
61. Delay( 900 ) ;//延时约一秒
效果图:
完整工程文件可在这里下载。