MSP430單片機(jī)之RTC-實(shí)時(shí)時(shí)鐘
掃描二維碼
隨時(shí)隨地手機(jī)看文章
RTC-Real Time Clock是430單片機(jī)的實(shí)時(shí)時(shí)鐘模塊,可以配置成實(shí)時(shí)時(shí)鐘模式(萬(wàn)年歷)或者一般目的的32位計(jì)數(shù)器模式,其中實(shí)時(shí)時(shí)鐘模式提供了年月日、時(shí)分秒,可以選擇BCD碼或者二進(jìn)制格式,并且具有可編程的鬧鐘。RTC模塊支持中斷。相關(guān)寄存器請(qǐng)參閱430系列單片機(jī)user's guide(我用的是5438A)。
1.計(jì)數(shù)器模式
實(shí)時(shí)時(shí)鐘控制器寄存器1 RTCMODE位被重置時(shí),計(jì)數(shù)器模式被選擇,通過(guò)軟件設(shè)置可以得到一個(gè)32位的計(jì)數(shù)器。從時(shí)鐘模式切換到計(jì)數(shù)器模式是通過(guò)重置計(jì)數(shù)值:RTCNT1、RTCNT2、RTCNT3、RTCNT4 和 預(yù)換算計(jì)數(shù)器:RT0PS、RT1PS。
計(jì)數(shù)器的增量計(jì)數(shù)器來(lái)自ACLK、SMCLK或者分頻之后的ACLK、SMCLK。分頻系數(shù)來(lái)自分頻除法器RT0PS、RT1PS。RT0PS的輸出可以和RT1PS的輸出級(jí)聯(lián)構(gòu)成32位計(jì)數(shù)器的時(shí)鐘源。4個(gè)獨(dú)立的8位計(jì)數(shù)器級(jí)聯(lián)成為32位的計(jì)數(shù)器。這能提供計(jì)數(shù)時(shí)鐘的8位、16位、24位、32位溢出中斷。RTCTEV位選擇各自的觸發(fā),通過(guò)設(shè)置RTCTEVIE位,一個(gè)RTCTEV能夠觸發(fā)一個(gè)中斷。計(jì)數(shù)器RTCNT1到RTCNT4都可以單獨(dú)訪問(wèn),并可能被寫(xiě)入數(shù)值。
2.日歷模式
當(dāng)RTCMODE被置位時(shí),萬(wàn)年歷模式被選中。值得一提的是,萬(wàn)年歷模式有能夠計(jì)算能否被4整除的閏年算法,這個(gè)算法范圍是1901年到2099年。
2.1預(yù)分頻
分頻器自動(dòng)將RT0PS和RT1PS配置成為實(shí)時(shí)時(shí)鐘提供一秒間隔的時(shí)鐘,RT0PS源于ACLK,一般來(lái)說(shuō)ACLK為32768Hz,是為了實(shí)時(shí)時(shí)鐘的運(yùn)行。從日歷模式切換到計(jì)數(shù)器模式時(shí),會(huì)將年月日、時(shí)分秒全部被置位1,RT0PS和RT1PS也會(huì)被置位。當(dāng)RTCBCD=1時(shí),日歷寄存器會(huì)被選為BCD碼,必須在時(shí)間設(shè)置之前選擇好格式,改變RTCBCD的狀態(tài)和切換到計(jì)數(shù)器模式影響一樣。
2.2鬧鐘功能
用戶(hù)可編程鬧鐘只有在日歷模式下有效。每一個(gè)鬧鐘寄存器都包括都包括一個(gè)鬧鐘使能位,AE用來(lái)修改每一個(gè)鬧鐘寄存器,通過(guò)設(shè)置鬧鐘寄存器的AE位,可以產(chǎn)生多種鬧鐘。無(wú)效的鬧鐘不會(huì)通過(guò)硬件的檢測(cè),所以用戶(hù)有必要檢查所設(shè)鬧鐘是否正確。
2.3讀寫(xiě)實(shí)時(shí)時(shí)鐘寄存器
系統(tǒng)時(shí)鐘和實(shí)時(shí)時(shí)鐘的時(shí)鐘源異步,因而讀寫(xiě)實(shí)時(shí)時(shí)鐘寄存器的時(shí)候要注意。此時(shí)實(shí)時(shí)時(shí)鐘寄存器每秒鐘更新一次,為了防止在更新的時(shí)候讀取實(shí)時(shí)時(shí)鐘數(shù)據(jù)而造成錯(cuò)誤數(shù)據(jù)的讀取,應(yīng)該設(shè)置一個(gè)禁止進(jìn)入的窗口,在禁止進(jìn)入窗口和窗口外期間,只有RTCRDY復(fù)位有效才可以讀取。在RTCRDY復(fù)位的時(shí)候,讀取操作是錯(cuò)誤的并且讀取的時(shí)間數(shù)據(jù)也無(wú)效被忽略。
2.4時(shí)鐘中斷
由于我做的部分只涉及實(shí)時(shí)時(shí)鐘顯示,中斷部分沒(méi)有過(guò)多涉及,就不在討論了。
RTC實(shí)時(shí)時(shí)鐘顯示部分程序結(jié)構(gòu)如下:
1 //只是部分代碼,遠(yuǎn)未完整,只是說(shuō)明一下框架
2 void Init_RTC(void)//初始化RTC
3 {
4 RTCCTL01 = RTCSSEL_0 + RTCMODE; // 時(shí)鐘模式,每分鐘中斷, BCD格式
5 unsigned int hour,min,sec;
6
7 hour=key[0]*10+key[1];
8 min =key[2]*10+key[3];
9 sec =key[4]*10+key[5];
10
11 SetRTCYEAR(2012);
12 SetRTCMON(6);
13 SetRTCDAY(1);
14 SetRTCHOUR(hour); //按鍵設(shè)定時(shí)間
15 SetRTCMIN(min);
16 SetRTCSEC(sec);
17 }
18
19 while(key_C) //掃描按鍵
20 {
21
22 if(key_stime_ok)
23 {
24 char str[4];
25 key_stime_ok=0;
26 key_temp=Read_Key();//讀取按鍵數(shù)值
27 if(key_temp != No_key)
28 {
29 key[key_C-1]=key_temp;
30 sprintf(str,"%d",key_temp);
31 PutStringEN24(60,k,str);
32 k-=16;
33 key_C--;
34 }
35 }
36 }
37
38 void Show_Clock(void)
39 {
40 unsigned int Hour ,Minute,Second;
41 char p1[10],p2[10],p3[10];
42 for(;RTCCTL01&RTCRDY;) _NOP(); // 等待RTC有效
43 for(;RTCCTL01&RTCRDY;) _NOP();
44
45 Hour = GetRTCHOUR();
46 Minute = GetRTCMIN();
47 Second = GetRTCSEC();
48
49 sprintf(p1,"%02d",Hour);
50 sprintf(p2,"%02d",Minute);
51 sprintf(p3,"%02d",Second);
52
53 PutStringEN24(1,2,p1); //用的TFT屏顯示時(shí)鐘
54 PutStringEN24(1,34,":");
55 PutStringEN24(1,50,p2);
56 PutStringEN24(1,82,":");
57 PutStringEN24(1,98,p3);
58 }