RTCC實時時間和日歷
結(jié)構(gòu)體定義:
rtccDate dt;//日期結(jié)構(gòu)體dt.year年,dt.mon月,dt.mday日,dt.wday星期幾,dt.l整體
rtccTime tm;//時間結(jié)構(gòu)體tm.hour時,tm.min分,tm.sec秒,tm.l整體
rtccDate adt;//鬧鐘時間結(jié)構(gòu)體定義
rtccTime atm;
一.RTCC模塊設(shè)置
初始化RTCC
RtccInit(); //禁止中斷,清除中斷標(biāo)志,關(guān)閉鬧鐘Alarm,鎖寫,開啟RTCC ON
等待穩(wěn)定開啟RTCC
While(RtccGetClkStat()!=RTCC_CLK_ON);
寫入RTCC初始值
RtccOpen(tm.l,da.l,Cal); //寫入初始時間,設(shè)置校準(zhǔn)偏移cal
校準(zhǔn)值CAL
CAL=( 理想頻率(32,758)– 實際頻率) * 60 = 每分鐘誤差時鐘數(shù)
RtccSetCalibration(10);//每分鐘加10時鐘數(shù)
二.鬧鐘模塊設(shè)置
鬧鐘時間設(shè)置
RtccSetAlarmTimeDate(atm.l,adt.l);
鬧鈴匹配周期 注意1
RtccSetAlarmRpt(RTCC_RPT_TEN_SEC); //10s一次匹配
鬧鈴重復(fù)次數(shù)
RtccSetAlarmRptCount(5); //每發(fā)生一次鬧鐘時間遞減1即重復(fù)5+1次
是否需要無限重復(fù)鬧鈴
RtccChimeEnable(); //CHIME為1時rptcount能從0回到ff無限重復(fù),反之
鬧鐘使能
RtccAlarmEnable();
三.中斷模塊設(shè)置
設(shè)置中斷優(yōu)先級,使能事件中斷,系統(tǒng)中斷使能(詳見中斷)
注 1:重復(fù)周期RPT即計時器與鬧鐘寄存器相匹配的周期。
若在匹配周期內(nèi)有鬧鐘時間,則中斷信號在此發(fā)出。隨后以此鬧鐘時間為基準(zhǔn)延后一個匹配周期后
發(fā)出中斷信號。
若在匹配周期內(nèi)無鬧鐘時間,中斷都將在匹配周期結(jié)束時發(fā)出,重復(fù)上面的情況。
例如 現(xiàn)在時間2014年7月19日星期六,0:05:30
設(shè)置鬧鐘時間2014年7月19日,0:05:59
設(shè)置半秒:則每半秒都會產(chǎn)生中斷 設(shè)置10秒:前兩個中斷在40s,50s,然后59s,9s...
設(shè)置1分:中斷發(fā)生在05:59,06:59... 設(shè)置10分:中斷在05:59,15:59…
2:RTCC 器件可以產(chǎn)生一些中斷,反映在RTCC 定時器與鬧鐘寄存器匹配時發(fā)生的鬧鐘事件。模塊會根據(jù)AMASK位設(shè)置,與時間/ 日期寄存器的無掩碼部分進(jìn)行匹配。每個鬧鐘事件發(fā)生時,都能產(chǎn)生中斷.
3:ARPT<7:0>:鬧鐘重復(fù)計數(shù)器值位每當(dāng)發(fā)生鬧鐘事件時計數(shù)器就遞減1。要提供無限重復(fù)鬧鐘,可以使用CHIME(RTCALRM<14>)位使能響鈴功能。當(dāng)CHIME = 1 時,在執(zhí)行最后一次重復(fù)之后,ARPT將從0x00計滿返回至0xFF,并繼續(xù)無限計數(shù),而不是禁止鬧鐘。
CHIME = 1,計數(shù)器能從00返回到FF,即可連續(xù)響鈴。
CHIME = 0,計數(shù)器不能從00返回到FF,響鈴ARPT+1次。
RtccSetAlarmRpt(rtccRepeat rpt);// 設(shè)定鬧鐘重復(fù)周期
RTCC_RPT_HALF_SEC, // repeat alarm every half second
RTCC_RPT_SEC, // repeat alarm every second
RTCC_RPT_TEN_SEC, // repeat alarm every ten seconds
RTCC_RPT_MIN, // repeat alarm every minute
RTCC_RPT_TEN_MIN, // repeat alarm every ten minutes
RTCC_RPT_HOUR, // repeat alarm every hour
RTCC_RPT_DAY, // repeat alarm every day
RTCC_RPT_WEEK, // repeat alarm every week
RTCC_RPT_MON, // repeat alarm every month
RTCC_RPT_YEAR // repeat alarm every year (except when configured for Feb 29th.)
例如
RTCC鬧鐘中斷點亮led
#include
#pragma config JTAGEN = OFF // JTAG Enable (JTAG Disabled)
#pragma config FWDTEN = OFF // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls))
rtccDate dt;//日期結(jié)構(gòu)體dt.year年,dt.mon月,dt.mday日,dt.wday星期幾,dt.l整體
rtccTime tm;//時間結(jié)構(gòu)體tm.hour時,tm.min分,tm.sec秒,tm.l整體
rtccDate adt;//鬧鐘時間結(jié)構(gòu)體定義
rtccTime atm;
int Alarmflag=0;
int main()
{
PORTSetPinsDigitalOut(IOPORT_B,BIT_9);
PORTSetBits(IOPORT_B,BIT_9);
RtccInit();//實時時間日歷初始化,RTCC ON
while(RtccGetClkStat()!=RTCC_CLK_ON);//等待振蕩器穩(wěn)定
tm.hour=0x22;
tm.min=0x40;
tm.sec=0x30;
dt.year=0x14;
dt.mon=0x07;
dt.mday=0x17;
dt.wday=0x04;
RtccOpen(tm.l,dt.l,0);//初時間22:40:30,14年7月17日星期4,校準(zhǔn)偏移0
RtccGetTimeDate(&tm,&dt);//獲得實時時間和日期
atm.l=tm.l;
adt.l=dt.l;
atm.sec=tm.sec+0x20;//延后20秒
RtccChimeEnable();//無限重復(fù)鬧鈴允許
RtccSetAlarmRptCount(0);//鬧鈴重復(fù)次數(shù)0+1,最高256,CHIME=1時次數(shù)無限
RtccSetAlarmRpt(RTCC_RPT_MIN);//鬧鐘匹配周期1min 注意:1
RtccSetAlarmTimeDate(atm.l,adt.l);//設(shè)置鬧鐘時間
RtccAlarmEnable();//鬧鐘使能
mRTCCSetIntPriority(2);
mRTCCClearIntFlag();
mRTCCIntEnable(1);
INTEnableSystemMultiVectoredInt();
while(1)
{
if(Alarmflag==1)
{
RtccSetAlarmRpt(RTCC_RPT_HALF_SEC);//若觸發(fā)鬧鐘則每半秒產(chǎn)生一中斷
break;//跳出while
}
}
void __ISR(_RTCC_VECTOR,ipl2) hander(void)
{
PORTBINV=(1<<9);
Alarmflag=1;
mRTCCClearIntFlag();
}