本系列文章由張同浩編寫轉載請註明出處:http://blog.csdn.net/muge0913/article/details/7460440
郵箱:muge0913@sina.com
系統時鐘(RTC)的主要功能是在系統掉電的情況下,利用後備電源使時鐘繼續運行,從而不會丟失時間資訊。s3c6410內部整合了RTC模組,其內部的寄存器BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON和BCDYEAR分別儲存了當前的秒,分,小時,星期,日,月和年,表示時間的數值都是BCD碼。
S2C6410中的閏年問題:
閏年產生器基於BCDDAY,BCDMOD,BCDYEAR從而能決定每月最後的日期是28,29,30,還是31。一個8位的計數器只能表示2個BCD資料,因此不能判斷“00”結尾的年份是不是閏年。例如它不能判斷1900和2000是不是閏年。為瞭解決這個問題,S3C6410中有一硬體邏輯來支援2000的閏年問題。因此S3C6410支援1901到2099年的範圍。
讀寫操作:
在讀BCD寄存器時,RTCCON寄存器0位必須至1,為了顯示秒,分,小時,日,月,年,cpu必須從其對應的寄存器中取值(BCDSEC, BCDMIN, BCDHOUR,BCDDATE, BCDDAY, BCDMON, BCDYEAR)。多寄存器同時讀取可能會產生1秒誤差。例如使用者從BCDMIN到BCDYEAR都進行了讀,得到的結果為2059年12月31日23時59分,當讀取這個結果時BCDSEC的數值在1~59之間,讀到的2059年12月31日23時59分是沒有問題的,但是當讀取這個結果時BCDSEC的值為0,實際結果可能是2059年12月31日23時59分也可能是2060年1月1日0時0分。所以此時應重讀這些寄存器,從而得到正確的數值。
後備電源操作:
系統時鐘邏輯能被後備電源驅動,通過RTCVDD向RTC模組供電。當系統關閉時,cpu和RTC介面是封閉的,這時後備電源只驅動振蕩電路和BCD計數器,從而把功耗降到最低。
邏輯圖:
介面:
以下程式完成了時間設定擷取,在lcd上顯示功能,
源碼如下
標頭檔:
//RTC#define RTC_BASE (0x7E005040)#define rRTCCON (*(volatile unsigned *)RTC_BASE)#define rTICNT (*(volatile unsigned *)(RTC_BASE + 0x4))#define rRTCALM (*(volatile unsigned *)(RTC_BASE + 0x10))#define rALMSEC(*(volatile unsigned *)(RTC_BASE + 0x14))#define rALMMIN(*(volatile unsigned *)(RTC_BASE + 0x18))#define rALMHOUR(*(volatile unsigned *)(RTC_BASE + 0x1c))#define rALMDATE(*(volatile unsigned *)(RTC_BASE + 0x20))#define rALMMON(*(volatile unsigned *)(RTC_BASE + 0x24))#define rALMYEAR(*(volatile unsigned *)(RTC_BASE + 0x28))#define rBCDSEC(*(volatile unsigned *)(RTC_BASE + 0x30))#define rBCDMIN(*(volatile unsigned *)(RTC_BASE + 0x34))#define rBCDHOUR(*(volatile unsigned *)(RTC_BASE + 0x38))#define rBCDDATE(*(volatile unsigned *)(RTC_BASE + 0x3c))#define rBCDDAY(*(volatile unsigned *)(RTC_BASE + 0x40))#define rBCDMON(*(volatile unsigned *)(RTC_BASE + 0x44))#define rBCDYEAR(*(volatile unsigned *)(RTC_BASE + 0x48))#define rCURTICNT(*(volatile unsigned *)(RTC_BASE + 0x50))#define rINTP(*(volatile unsigned *)(RTC_BASE - 0x10))
初始化rtc:
void init_rtc(){rRTCCON = 0x85;}
設定即時資料:
void set_rtc(){//2012,04.14.13,06rRTCCON |= 0x01;rBCDSEC = 5*16 +1;rBCDMIN = 6;rBCDHOUR = 1*16 +3;rBCDDATE = 1*16+4;rBCDMON =4;rBCDYEAR = 1*16+2;rRTCCON &= ~(0x01);}
擷取即時資料:
void get_rtc(unsigned char rtc_data[6]){rRTCCON |= 0x01;rtc_data[0] =rBCDSEC;rtc_data[1] = rBCDMIN;rtc_data[2] = rBCDHOUR;rtc_data[3] = rBCDDATE;rtc_data[4] = rBCDMON;rtc_data[5] = rBCDYEAR;rRTCCON &= ~(0x01);if(rtc_data[0] == 0){rRTCCON |= 0x01;rtc_data[0] =rBCDSEC;rtc_data[1] = rBCDMIN;rtc_data[2] = rBCDHOUR;rtc_data[3] = rBCDDATE;rtc_data[4] = rBCDMON;rtc_data[5] = rBCDYEAR;rRTCCON &= ~(0x01);}}
mian:
init_rtc();LCD_Init();Paint_background(0xffffff,0,0,480,272);set_rtc();while(1){get_rtc(tmp_rtc);rtc_data_tmp[13] = tmp_rtc[0]%16;rtc_data_tmp[12] = tmp_rtc[0]/16;rtc_data_tmp[11] = tmp_rtc[1]%16;rtc_data_tmp[10] = tmp_rtc[1]/16;rtc_data_tmp[9] = tmp_rtc[2]%16;rtc_data_tmp[8] = tmp_rtc[2]/16;rtc_data_tmp[7] = tmp_rtc[3]%16;rtc_data_tmp[6] = tmp_rtc[3]/16;rtc_data_tmp[5] = tmp_rtc[4]%16;rtc_data_tmp[4] = tmp_rtc[4]/16;rtc_data_tmp[3] = tmp_rtc[5]%16;rtc_data_tmp[2] = tmp_rtc[5]/16;rtc_data_tmp[1] = tmp_rtc[6]%16;rtc_data_tmp[0] = tmp_rtc[6]/16;for(jj=0;jj<14;jj++){Paint_text(124+8*jj, 20, 0x0,charnum[rtc_data_tmp[jj]],8, 16);}delay_rtc();}
程式:http://download.csdn.net/detail/muge0913/4225558
由於上傳檔案不及時顯示,大家要程式的話,留下郵箱即可,