深入理解ARM體系架構(S3C6410)—rtc執行個體

來源:互聯網
上載者:User

本系列文章由張同浩編寫轉載請註明出處: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

由於上傳檔案不及時顯示,大家要程式的話,留下郵箱即可,

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.