mini2440硬件篇之RTC
硬件原理
實(shí)時(shí)時(shí)鐘(RTC)的主要功能是在系統(tǒng)掉電的情況下,利用后備電源使時(shí)鐘繼續(xù)運(yùn)行,從而不會(huì)丟失時(shí)間信息。
1.1.時(shí)間的設(shè)置和獲取
s3c2440內(nèi)部集成了RTC模塊,而且用起來(lái)也十分簡(jiǎn)單。其內(nèi)部的寄存器BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON和BCDYEAR分別存儲(chǔ)了當(dāng)前的秒,分,小時(shí),星期,日,月和年,表示時(shí)間的數(shù)值都是BCD碼。這些寄存器的內(nèi)容可讀可寫(xiě),并且只有在寄存器RTCCON的第0位為1時(shí)才能進(jìn)行讀寫(xiě)操作。為了防止誤操作,當(dāng)不進(jìn)行讀寫(xiě)時(shí),要把該位清零。當(dāng)讀取這些寄存器時(shí),能夠獲知當(dāng)前的時(shí)間;當(dāng)寫(xiě)入這些寄存器時(shí),能夠改變當(dāng)前的時(shí)間。另外需要注意的是,因?yàn)橛兴^的“一秒誤差”,因此當(dāng)讀取到的秒為0時(shí),需要重新再讀取一遍這些寄存器的內(nèi)容,才能保證時(shí)間的正確。
1.2.報(bào)警和時(shí)間節(jié)拍
s3c2440實(shí)時(shí)時(shí)鐘(RTC)中,定義了兩個(gè)中斷源:報(bào)警中斷和時(shí)間節(jié)拍中斷。
時(shí)間節(jié)拍中斷,顧名思義,就像一個(gè)節(jié)拍器,可以等時(shí)性的控制節(jié)拍。因此它類(lèi)似于定時(shí)器中斷。但時(shí)間節(jié)拍中斷是毫秒級(jí)的,而定時(shí)器中斷可以達(dá)到微秒,甚至更小級(jí)別。時(shí)間節(jié)拍中斷的周期公式為:(n+1)÷128,單位是秒,即每隔這么長(zhǎng)時(shí)間,會(huì)中斷一次。其中n的值為1~127,它存儲(chǔ)在寄存器TICNT的低6位中,當(dāng)寄存器TICNT的第7位被置1時(shí),表示開(kāi)啟時(shí)間節(jié)拍中斷,這時(shí)n遞減,當(dāng)減為0時(shí),進(jìn)入時(shí)間節(jié)拍中斷。
報(bào)警中斷可以實(shí)現(xiàn)當(dāng)實(shí)時(shí)時(shí)間達(dá)到預(yù)置的時(shí)間后,引起報(bào)警。預(yù)置的時(shí)間是存儲(chǔ)在報(bào)警時(shí)間數(shù)據(jù)寄存器中的,包括ALMYEAR(年)、ALMMON(月)、ALMDATE(日)、ALMHOUR(小時(shí))、ALMMIN(分)和ALMSEC(秒)。而如何報(bào)警,是由報(bào)警控制寄存器RTCALM控制的。它的第6位置1表示全局報(bào)警,而第5位到第0位置1分別表示年、月、日、小時(shí)、分和秒報(bào)警。比如,我們想要在2010年4月5日22時(shí)30分0秒報(bào)警,那么把這個(gè)時(shí)間分別存儲(chǔ)到相應(yīng)的報(bào)警時(shí)間數(shù)據(jù)寄存器中,然后設(shè)置RTCALM為0x7F,這樣當(dāng)實(shí)時(shí)時(shí)鐘到達(dá)這個(gè)時(shí)刻時(shí),會(huì)引起報(bào)警中斷;又比如我們想要系統(tǒng)具有鬧鐘的功能,讓它每天早上6點(diǎn)提醒我們起床,那么我們可以設(shè)置ALMHOUR為6,RTCALM為0x44。如果我們只想讓系統(tǒng)在4月份的時(shí)候提醒我們6點(diǎn)起床,那該怎么辦呢?這個(gè)問(wèn)題對(duì)于s3c2440來(lái)說(shuō)就是小菜一碟,只要我們?cè)僭贏LMMON里寫(xiě)入4,然后把RTCALM改為0x54即可??傊?,就是系統(tǒng)根據(jù)RTCALM所置1的相應(yīng)位來(lái)比較相對(duì)應(yīng)的當(dāng)前時(shí)間與報(bào)警時(shí)間數(shù)據(jù)寄存器中的值,如果相等就進(jìn)入中斷。
2.芯片手冊(cè)
3.mini2440電路圖
4.S3C2440寄存器
RTCCON控制寄存器
選擇時(shí)鐘,使能RTC。BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON和BCDYEAR分別存儲(chǔ)了當(dāng)前的秒,分,小時(shí),星期,日,月和年,表示時(shí)間的數(shù)值都是BCD碼。
TICNT計(jì)數(shù)寄存器
[7]使能中斷,[6:0]計(jì)數(shù)值
RTCALM報(bào)警控制
分別使能年月日時(shí)分秒和總報(bào)警開(kāi)關(guān)。預(yù)置的時(shí)間是存儲(chǔ)在報(bào)警時(shí)間數(shù)據(jù)寄存器中的,包括ALMYEAR(年)、ALMMON(月)、ALMDATE(日)、ALMHOUR(小時(shí))、ALMMIN(分)和ALMSEC(秒)。
rtc.h
/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:rtc.h
*Author:HuangYinqing
*Version:1.0
*Date::2012-04-22
*Description:rtc驅(qū)動(dòng).
*FunctionList:
*History:
******************************************************************/
#ifndef__RTC_H__
#define__RTC_H__
#defineDBG_RTC_LEVEL1
/*函數(shù)聲明*/
voidRTCInit(void);
voidRTCTest(void);
#endif
rtc.c
/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:rtc.c
*Author:HuangYinqing
*Version:1.0
*Date::2012-04-22
*Description:rtc驅(qū)動(dòng).
*FunctionList:
*History:
******************************************************************/
#include"common.h"
#include"core.h"
#include"rtc.h"
unsignedcharpucAlarmBuffer[6];//==報(bào)警緩存數(shù)組
unsignedcharpucDateBuffer[7];//==時(shí)間緩沖數(shù)組
/********************************************************************
函數(shù)功能:RTC報(bào)警中斷。
入口參數(shù):無(wú)。
返回:無(wú)。
備注:無(wú)。
********************************************************************/
staticvoid__irqRTCAlarmHandler(void)
{
rSRCPND|=BIT_RTC;
rINTPND|=BIT_RTC;
rTICNT=0xbf;//開(kāi)啟時(shí)間節(jié)拍中斷,周期為500毫秒
rGPBDAT|=0x01;//==蜂鳴器響
}
/********************************************************************
函數(shù)功能:時(shí)鐘節(jié)拍中斷。
入口參數(shù):無(wú)。
返回:無(wú)。
備注:無(wú)。
********************************************************************/
staticvoid__irqRTCTickHandler(void)
{
staticcharcount;
rSRCPND|=BIT_TICK;
rINTPND|=BIT_TICK;
if(count==10)//==響5秒不再響
{
rGPBDAT&=~(0x01);
rTICNT=0;
count=0;
}
count++;
}
/********************************************************************
函數(shù)功能:RTC初始化。
入口參數(shù):無(wú)。
返回:無(wú)。
備注:無(wú)。
********************************************************************/
voidRTCInit(void)
{
rGPBCON&=~(0x3<<0);
rGPBCON|=0x1<<0;
rGPBDAT&=~(0x01);//==蜂鳴器不響
rRTCCON=1;
rRTCALM=(1<<6)|(1<<0);//==開(kāi)全局鬧鐘和秒鬧鐘
pISR_RTC=(unsignedint)RTCAlarmHandler;
pISR_TICK=(unsignedint)RTCTickHandler;
rINTMSK&=~(BIT_RTC);
rINTMSK&=~(BIT_TICK);
}
/********************************************************************
函數(shù)功能:設(shè)置報(bào)警時(shí)間。
入口參數(shù):無(wú)
返回:無(wú)。
備注:無(wú)。
********************************************************************/
voidRTCSetAlarm(void)
{
rALMYEAR=pucAlarmBuffer[0];//年
rALMMON=pucAlarmBuffer[1];//月
rALMDATE=pucAlarmBuffer[2];//日
rALMHOUR=pucAlarmBuffer[3];//小時(shí)
rALMMIN=pucAlarmBuffer[4];//分
rALMSEC=pucAlarmBuffer[5];//秒
}
/********************************************************************
函數(shù)功能:設(shè)置時(shí)間。
入口參數(shù):無(wú)
返回:無(wú)。
備注:無(wú)。
********************************************************************/
voidRTCSetDate(void)
{