新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 五 ARM9(S3C2440)的實時時鐘(RTC)-理論知識及程序?qū)嵗v解

五 ARM9(S3C2440)的實時時鐘(RTC)-理論知識及程序?qū)嵗v解

作者: 時間:2016-11-27 來源:網(wǎng)絡(luò) 收藏

在一個嵌入式系統(tǒng)中,實時時鐘單元可以提供可靠的時鐘,包括時、分、秒和年、月、日。即使系統(tǒng)處于關(guān)機(jī)狀態(tài)下,它也能夠正常工作(通常采用后備電池供電,能夠可靠工作十年),其外圍也不需要太多的輔助電路,只需要一個高精度的晶振。

本文引用地址:http://m.butianyuan.cn/article/201611/322170.htm

它具有以下特點(diǎn):

時鐘數(shù)據(jù)采用BCD編碼或二進(jìn)制表示;

能夠?qū)﹂c年的年、月、日進(jìn)行自動處理;

具有告警功能,當(dāng)系統(tǒng)處于關(guān)機(jī)狀態(tài)時,能產(chǎn)生告警中斷;

具有獨(dú)立的電源輸入;

提供毫秒級的時鐘中斷,該中斷可用于嵌入式操作系統(tǒng)的內(nèi)核時鐘。

實時時鐘特殊功能寄存器
實時時鐘控制(RTCCON)寄存器
RTCCON 寄存器由4 位組成,如控制BCD 寄存器讀/寫使能的RTCEN、CLKSEL、CNTSEL 和測試用的
CLKRST。
RTCEN 位可以控制所有CPU 與RTC 之間的接口,因此在系統(tǒng)復(fù)位后在RTC 控制程序中必須設(shè)置為1 來使
能數(shù)據(jù)的讀/寫。同樣的在掉電前,RTCEN 位應(yīng)該清除為0 來預(yù)防誤寫入RTC 寄存器中。

RTC 鬧鐘控制(RTCALM)寄存器
RTCALM 寄存器決定了鬧鐘使能和鬧鐘時間。請注意RTCALM 寄存器在掉電模式中同時通過INT_RTC 和
PMWKUP 產(chǎn)生鬧鐘信號,但是在正常工作模式中只產(chǎn)生INT_RTC。

鬧鐘秒數(shù)據(jù)(ALMSEC)寄存器:鬧鐘秒數(shù)據(jù)寄存器

同理:鬧鐘分?jǐn)?shù)據(jù)(ALMMIN)寄存器,鬧鐘時數(shù)據(jù)(ALMHOUR)寄存器,鬧鐘日數(shù)據(jù)(ALMDATE)寄存器,鬧鐘月數(shù)據(jù)(ALMMON)寄存器,鬧鐘年數(shù)據(jù)(ALMYEAR)寄存器

BCD 秒(BCDSEC)寄存器:存儲的是當(dāng)前時間秒,同樣還有,BCDMIN,BCDHOUR,BCDDATE(日),BCDDAY(星期),BCDMON,BCDYEAR

注意以上這些寄存器存儲的數(shù)據(jù)都是BCD碼,即是自動處理的數(shù)據(jù),如果自己想做時鐘顯示時,如果調(diào)時間的請注意時間加減時實際上是十六進(jìn)制的

下面結(jié)合具體的程序介紹一下RTC操作

程序編寫包括三步,第一步是時鐘初始化,第二步把嵌入式控制系統(tǒng)投入運(yùn)行時要將當(dāng)前準(zhǔn)確時間寫入RTC,俗稱效表;第三步是系統(tǒng)正常運(yùn)行后,讀取RTC時間在LCD上顯示。

廢話少說,上程序(開發(fā)板FL2440)

#include "def.h"
#include "option.h"
#include "2440addr.h"
U8 beep=1;
void __irq IsrAlarm(void);//下面這些都是函數(shù)聲明
void delay(int x);
void RTC_Alm_Set(U8 almyear,U8 almmon,U8 almdate,
U8 almhour,U8 almmin,U8 almsec);
void RTC_Time_Set( U8 wRTCyear,U8 wRTCmon,U8 wRTCdate,U8 wRTCday,U8 wRTChour,U8 wRTCmin,U8 wRTCsec );
void OpenAlarm(void) ;
void CloseAlarm(void) ;
//==================================================================================
void RTC_Time_Set( U8 wRTCyear,U8 wRTCmon,U8 wRTCdate,U8 wRTCday,U8 wRTChour,U8 wRTCmin,U8 wRTCsec )//時間設(shè)置函數(shù),操作是不是比較簡單?呵呵

{
rRTCCON = 1 ;//RTC 讀寫使能

rBCDYEAR = wRTCyear ;//年
rBCDMON= wRTCmon ;//月
rBCDDATE = wRTCdate ;//日
rBCDDAY= wRTCday ;//星期
rBCDHOUR = wRTChour ;//小時
rBCDMIN= wRTCmin ;//分
rBCDSEC= wRTCsec ;//秒

rRTCCON &= ~1 ;//RTC read and write disable
}
void RTC_Alm_Set(U8 almyear,U8 almmon,U8 almdate,
U8 almhour,U8 almmin,U8 almsec)//年、月、日、時、分、秒//鬧鐘設(shè)置
{rRTCCON=0x01;//RTCCON實時時鐘控制寄存器,
//【0】位RTC使能信號控制位,0為禁止,1為允許
//對RTC模塊進(jìn)行讀寫操作前應(yīng)對其最低位至1
rALMYEAR = almyear;
rALMMON= almmon;
rALMDATE = almdate;
rALMHOUR = almhour;
rALMMIN= almmin;
rALMSEC= almsec;

rRTCCON = 0;//讀取數(shù)據(jù)完后禁止使能信號,以防誤操作,
//整個文件的設(shè)置都一樣,不重覆
}
void OpenAlarm(void) //開鬧鐘函數(shù)
{
pISR_RTC = (unsigned)IsrAlarm;//中斷寄存器ISR中的RTC中斷位
ClearPending(BIT_RTC);
rRTCALM = (0x7f); //RTCALM鬧鐘控制寄存器,

//【0-7】分別對應(yīng)秒到年的鬧鐘 使能,
//相應(yīng)位0表示禁止,1表示允許
EnableIrq(BIT_RTC);//開中斷

}

//關(guān)鬧鐘功能函數(shù)
void CloseAlarm(void)
{
rRTCALM = 0; //RTCALM鬧鐘控制寄存器所有位禁止
DisableIrq(BIT_RTC);//關(guān)中斷
}
void __irq IsrAlarm(void)//利用中斷,鬧鐘時進(jìn)入中斷函數(shù)
{
ClearPending(BIT_RTC);//SRCPND,INTPND分別置1.
beep = 0;// 蜂鳴器標(biāo)志位清0
CloseAlarm();//關(guān)鬧鐘,即如果要開鬧鐘的先要把它關(guān)了,再開。
}
void delay(int x)//延時函數(shù)
{
while(x)
{
int k,j;
for(k=0xff;k>0;k--)
for(j=0xff;j>0;j--);
x--;
}
}

//==================================================================================
void RTCmain(void)
{
rGPBCON = (1<<0)|(1<<10)|(1<<12)|(1<<16)|(1<<20);// GPB5,GPB6,GPB8,GPB10設(shè)置為輸出,分別連了4個LED
rGPBDAT|=0x560;//4個LED全滅
RTC_Time_Set(0x11,0x08,0x06,0x06,0x10,0x00,0x00) ;//設(shè)置時間
RTC_Alm_Set(0x11,0x08,0x06,0x10,0x01,0x00);//設(shè)置鬧鐘時間按
OpenAlarm();
while(1)
{
if(beep==0)
{
rGPBDAT=0x01;//燈亮,蜂鳴器響
delay(1000);
rGPBDAT=0x561;//燈滅,實際是閃爍
delay(1000);
}
}
}



關(guān)鍵詞: ARM9S3C2440實時時鐘RT

評論


技術(shù)專區(qū)

關(guān)閉