實時時鐘(RTC)其主要功能是電源故障的制度下,使用后備電源,時鐘繼續。為了不浪費時間信息。
s3c2440內部集成了RTC模塊,并且用起來也十分簡單。
其內部的寄存器BCDSEC,BCDMIN,BCDHOUR,BCDDAY。BCDDATE,BCDMON和BCDYEAR分別存儲了當前的秒,分,小時。星期,日,月和年,表示時間的數值都是BCD碼。
這些寄存器的內容可讀可寫。而且僅僅有在寄存器RTCCON的第0位為1時才干進行讀寫操作。為了防止誤操作。當不進行讀寫時。要把該位清零。當讀取這些寄存器時。可以獲知當前的時間;當寫入這些寄存器時,可以改變當前的時間。
另外須要注意的是。由于有所謂的“一秒
誤差”,因此當讀取到的秒為0時,,才干保證時間的正確(關于這點能夠看s3c2440文檔)。
以下給出一個簡單的程序。當剛上電的時候讀取當前時間值,通過串口顯示出來。并設置當前的時間為 2014年8月25日,21點40分 33秒:
write_date(0x14,0x8,0x25,0x1,0x21,0x40,0x33);
read_date();
printf('year:%4d,month:%2d,day:%2d,week:%2d,hour:%2d,minute:%2d,second:%2drn',
rYear, rMonth,rDay,rDayOfWeek,rHour,rMinute,rSecond);
//參數須要是BCD形式的
void write_date(UINT8 year,UINT8 month,UINT8 day,UINT8 dayofweek,UINT8 hour,UINT8 minute,UINT8 second)
{
rRTCCON = 1;
rBCDYEAR = year; //年
rBCDMON = month ; //月
rBCDDAY = dayofweek; //日
rBCDDATE = day; //星期
rBCDHOUR = hour; //小時
rBCDMIN = minute; //分
rBCDSEC = second; //秒
rRTCCON = 0;
}
void read_date(void)
{
rRTCCON = 1 ;
if(rBCDYEAR==0x99)
rYear = 1999;
else
rYear = (2000 + FROM_BCD(rBCDYEAR));
rMonth = FROM_BCD(rBCDMON & 0x1f);
rDayOfWeek = FROM_BCD(rBCDDAY & 0x0f);
rDay = FROM_BCD(rBCDDATE&0x3f);
rHour = FROM_BCD(rBCDHOUR & 0x3f);
rMinute = FROM_BCD(rBCDMIN & 0x7f);
rSecond = FROM_BCD(rBCDSEC & 0x7f);
rRTCCON = 0 ;
}
發懶了,竟然沒有考慮到一秒誤差。這算是個簡單的 小功能。能夠在我github上clone。
除了簡單的計時之外RTC還提供了2種時鐘中斷功能:報警中斷和時間節拍中斷,時間節拍中斷。顧名思義。就像一個節拍器。能夠等時性的控制節拍。
因此它類似于定時器中斷。
但時間節拍中斷是毫秒級的,而定時器中斷能夠達到微秒,甚至更小級別。時間節拍中斷的周期公式為:(n+1)÷128。單位是秒,即每隔這么長時間,會中斷一次。
當中n的值為1~127,它存儲在寄存器TICNT的低6位中,當寄存器TICNT的第7位被置1時,表示開啟時間節拍中斷。這時n遞減,當減為0時,進入時間節拍中斷。一般在ucos里面的節拍就是ms級別,作為ucos的節拍比較合適。
報警中斷能夠實現當實時時間達到預置的時間后。引起報警。預置的時間是存儲在報警時間數據寄存器中的(rtc有2套時間有關的寄存器,都是BCD形式存儲。當前時間用一套,),包含ALMYEAR(年)、ALMMON(月)、ALMDATE(日)、ALMHOUR(小時)、ALMMIN(分)和ALMSEC(秒)。而怎樣報警。是由報警控制寄存器RTCALM控制的。
它的 第6位置1表示全局報警,而第5位到第0位置1分別表示年、月、日、小時、分和秒報警。
比方,我們想要在2010年4月5日22時30分0秒報警。那么把這個時間分別存儲到對應的報警時間數據寄存器中,然后設置RTCALM為0x7F,這樣當實時時鐘到達這個時刻時,會引起報警中斷;
又比方我們想要系統具有鬧鐘的功能,讓它每天早上6點提醒我們起床。那么我們能夠設置ALMHOUR為6,RTCALM為0x44。
假設我們僅僅想讓系統在4月份的時候提醒我們6點起床,那該怎么辦呢?這個問題對于s3c2440來說就是小菜一碟,僅僅要我們再在ALMMON里寫入4,然后把RTCALM改為0x54就可以。
總之,就是系統依據RTCALM所置1的相應位來比較相相應的當前時間與報警時間數據寄存器中的值。假設相等就進入中斷,不論設置什么形式的鬧鐘中斷全局使能須要置位。
能夠依據這個實現一些功能:時間節拍中斷設置為1s一次,每次節拍中斷向串口寫一串字符'beat int'。而 剛上電之后設置鬧鐘中斷 則是在上電之后1分鐘之后向串口寫字符
串'alarm int'。
void Task2(void *pdata)
{
int i=0;
write_date(0x14,0x8,0x25,0x1,0x21,0x40,0x33);
set_alarm(0x14,0x8,0x25,0x21,0x41,0x33);
while(1)
{
i++;
if(i>99)i=0;
read_date();
printf('year:%4d,month:%2d,day:%2d,week:%2d,hour:%2d,minute:%2d,second:%2drn',
rYear, rMonth,rDay,rDayOfWeek,rHour,rMinute,rSecond);
OSTimeDly( 5 );
OSTimeDly(OS_TICKS_PER_SEC);
}
}
void init_rtc(void)
{
rINTMSK &= ~( (1<<8) | (1<<30) );
pIRQ_RTC = (UINT32)alarm_rtc;
pIRQ_TICK=(UINT32)tick_rtc;
rTICNT=(0x7f)|0x80; //使能中斷 tick=127
rRTCALM = 0x41; //RTC鬧鐘控制寄存器 //0x41表示使能RTC鬧鐘,以及使能秒時鐘鬧鐘
}
void tick_rtc(void)
{
printf('beat intrn');
}
void alarm_rtc(void)
{
printf('alarm intrn');
}
上一篇:uboot在s3c2440上的移植(6)
下一篇:s3c2440 地址分配講解
推薦閱讀最新更新時間:2025-04-23 16:37


設計資源 培訓 開發板 精華推薦
- DC2071A-B,用于 LTC2372CUH-18、18 位、500ksps、8 通道、具有 100dB SNR 的 SAR ADC 的演示板
- LTC3803ES6 演示板,電信 DC/DC 轉換器,+Vin 至 -Vin = 36V-72V,+Vout = 5V @ 2A
- LT1308BIS8 5V 至 12V 升壓轉換器的典型應用電路
- MIC5191 的典型應用:超高速、大電流有源濾波器/LDO 控制器
- MAXREFDES176#:IO-Link 16通道數字輸入集線器
- DC2106A-B,具有 LTM4676EY 高效率、多相、DC/DC 降壓模塊穩壓器和 PMBU 電源系統管理功能的演示板
- 使用 Analog Devices 的 LTC2656BCFE-L16#PBF 的參考設計
- LTC3630AHDHC 5V 至 76V 輸入至 5V 輸出、高效率、500mA 穩壓器的典型應用電路
- AD8602ARMZ-REEL 作為 DAC 輸出緩沖器驅動重負載的典型應用
- LT1819 的典型應用 - 400MHz、2500V/us、9mA 雙通道運算放大器