MSP430单片机之RTC-实时时钟

RTC-Real Time Clock是430单片机的实时时钟模块 , 可以配置成实时时钟模式(万年历)或者一般目的的32位计数器模式 , 其中实时时钟模式提供了年月日、时分秒 , 可以选择BCD码或者二进制格式 , 并且具有可编程的闹钟 。RTC模块支持中断 。相关寄存器请参阅430系列单片机user's guide(我用的是5438A) 。
1.计数器模式
实时时钟控制器寄存器1 RTCMODE位被重置时 , 计数器模式被选择 , 通过软件设置可以得到一个32位的计数器 。从时钟模式切换到计数器模式是通过重置计数值:RTCNT1、RTCNT2、RTCNT3、RTCNT4 和 预换算计数器:RT0PS、RT1PS 。
计数器的增量计数器来自ACLK、SMCLK或者分频之后的ACLK、SMCLK 。分频系数来自分频除法器RT0PS、RT1PS 。RT0PS的输出可以和RT1PS的输出级联构成32位计数器的时钟源 。4个独立的8位计数器级联成为32位的计数器 。这能提供计数时钟的8位、16位、24位、32位溢出中断 。RTCTEV位选择各自的触发 , 通过设置RTCTEVIE位 , 一个RTCTEV能够触发一个中断 。计数器RTCNT1到RTCNT4都可以单独访问 , 并可能被写入数值 。
2.日历模式
当RTCMODE被置位时 , 万年历模式被选中 。值得一提的是 , 万年历模式有能够计算能否被4整除的闰年算法 , 这个算法范围是1901年到2099年 。
2.1预分频
分频器自动将RT0PS和RT1PS配置成为实时时钟提供一秒间隔的时钟 , RT0PS源于ACLK , 一般来说ACLK为32768Hz , 是为了实时时钟的运行 。从日历模式切换到计数器模式时 , 会将年月日、时分秒全部被置位1 , RT0PS和RT1PS也会被置位 。当RTCBCD=1时 , 日历寄存器会被选为BCD码 , 必须在时间设置之前选择好格式 , 改变RTCBCD的状态和切换到计数器模式影响一样 。
2.2闹钟功能
用户可编程闹钟只有在日历模式下有效 。每一个闹钟寄存器都包括都包括一个闹钟使能位 , AE用来修改每一个闹钟寄存器 , 通过设置闹钟寄存器的AE位 , 可以产生多种闹钟 。无效的闹钟不会通过硬件的检测 , 所以用户有必要检查所设闹钟是否正确 。
2.3读写实时时钟寄存器
系统时钟和实时时钟的时钟源异步 , 因而读写实时时钟寄存器的时候要注意 。此时实时时钟寄存器每秒钟更新一次 , 为了防止在更新的时候读取实时时钟数据而造成错误数据的读取 , 应该设置一个禁止进入的窗口 , 在禁止进入窗口和窗口外期间 , 只有RTCRDY复位有效才可以读取 。在RTCRDY复位的时候 , 读取操作是错误的并且读取的时间数据也无效被忽略 。
2.4时钟中断
由于我做的部分只涉及实时时钟显示 , 中断部分没有过多涉及 , 就不在讨论了 。
RTC实时时钟显示部分程序结构如下:


1 //只是部分代码 , 远未完整 , 只是说明一下框架
2 void Init_RTC(void)//初始化RTC
3 {
4RTCCTL01 = RTCSSEL_0 + RTCMODE;// 时钟模式,每分钟中断, BCD格式
5unsigned int hour,min,sec;
6
7hour=key[0]*10+key[1];
8min =key[2]*10+key[3];
9sec =key[4]*10+key[5];
10
11SetRTCYEAR(2012);
12SetRTCMON(6);
13SetRTCDAY(1);
14SetRTCHOUR(hour); //按键设定时间
15SetRTCMIN(min);
16SetRTCSEC(sec);
17 }
18
19while(key_C)//扫描按键
20{
21
22if(key_stime_ok)
23{
24char str[4];
25key_stime_ok=0;
26key_temp=Read_Key();//读取按键数值
27if(key_temp != No_key)
28{
29key[key_C-1]=key_temp;
30sprintf(str,"%d",key_temp);
31PutStringEN24(60,k,str);
32k-=16;
33key_C--;
34}
35}
36}
37
38 void Show_Clock(void)
39 {
40unsigned int Hour ,Minute,Second;
41char p1[10],p2[10],p3[10];
42for(;RTCCTL01&RTCRDY;)_NOP(); // 等待RTC有效
43for(;RTCCTL01&RTCRDY;)_NOP();
44
【MSP430单片机之RTC-实时时钟】45Hour = GetRTCHOUR();
46Minute = GetRTCMIN();
47Second = GetRTCSEC();
48
49sprintf(p1,"%02d",Hour);
50sprintf(p2,"%02d",Minute);
51sprintf(p3,"%02d",Second);
52
53PutStringEN24(1,2,p1); //用的TFT屏显示时钟
54PutStringEN24(1,34,":");
55PutStringEN24(1,50,p2);
56PutStringEN24(1,82,":");
57PutStringEN24(1,98,p3);
58 }


    推荐阅读