RTCC實時時間和日歷
結構體定義:
rtccDate dt;//日期結構體dt.year年,dt.mon月,dt.mday日,dt.wday星期幾,dt.l整體
rtccTime tm;//時間結構體tm.hour時,tm.min分,tm.sec秒,tm.l整體
rtccDate adt;//鬧鐘時間結構體定義
rtccTime atm;
一.RTCC模塊設置
初始化RTCC
RtccInit(); //禁止中斷,清除中斷標志,關閉鬧鐘Alarm,鎖寫,開啟RTCC ON
等待穩定開啟RTCC
While(RtccGetClkStat()!=RTCC_CLK_ON);
寫入RTCC初始值
RtccOpen(tm.l,da.l,Cal); //寫入初始時間,設置校準偏移cal
校準值CAL
CAL=( 理想頻率(32,758)– 實際頻率) * 60 = 每分鐘誤差時鐘數
RtccSetCalibration(10);//每分鐘加10時鐘數
二.鬧鐘模塊設置
鬧鐘時間設置
RtccSetAlarmTimeDate(atm.l,adt.l);
鬧鈴匹配周期 注意1
RtccSetAlarmRpt(RTCC_RPT_TEN_SEC); //10s一次匹配
鬧鈴重復次數
RtccSetAlarmRptCount(5); //每發生一次鬧鐘時間遞減1即重復5+1次
是否需要無限重復鬧鈴
RtccChimeEnable(); //CHIME為1時rptcount能從0回到ff無限重復,反之
鬧鐘使能
RtccAlarmEnable();
三.中斷模塊設置
設置中斷優先級,使能事件中斷,系統中斷使能(詳見中斷)
注 1:重復周期RPT即計時器與鬧鐘寄存器相匹配的周期。
若在匹配周期內有鬧鐘時間,則中斷信號在此發出。隨后以此鬧鐘時間為基準延后一個匹配周期后
發出中斷信號。
若在匹配周期內無鬧鐘時間,中斷都將在匹配周期結束時發出,重復上面的情況。
例如 現在時間2014年7月19日星期六,0:05:30
設置鬧鐘時間2014年7月19日,0:05:59
設置半秒:則每半秒都會產生中斷 設置10秒:前兩個中斷在40s,50s,然后59s,9s...
設置1分:中斷發生在05:59,06:59... 設置10分:中斷在05:59,15:59…
2:RTCC 器件可以產生一些中斷,反映在RTCC 定時器與鬧鐘寄存器匹配時發生的鬧鐘事件。模塊會根據AMASK位設置,與時間/ 日期寄存器的無掩碼部分進行匹配。每個鬧鐘事件發生時,都能產生中斷.
3:ARPT<7:0>:鬧鐘重復計數器值位每當發生鬧鐘事件時計數器就遞減1。要提供無限重復鬧鐘,可以使用CHIME(RTCALRM<14>)位使能響鈴功能。當CHIME = 1 時,在執行最后一次重復之后,ARPT將從0x00計滿返回至0xFF,并繼續無限計數,而不是禁止鬧鐘。
CHIME = 1,計數器能從00返回到FF,即可連續響鈴。
CHIME = 0,計數器不能從00返回到FF,響鈴ARPT+1次。
RtccSetAlarmRpt(rtccRepeat rpt);// 設定鬧鐘重復周期
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;//日期結構體dt.year年,dt.mon月,dt.mday日,dt.wday星期幾,dt.l整體
rtccTime tm;//時間結構體tm.hour時,tm.min分,tm.sec秒,tm.l整體
rtccDate adt;//鬧鐘時間結構體定義
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);//等待振蕩器穩定
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,校準偏移0
RtccGetTimeDate(&tm,&dt);//獲得實時時間和日期
atm.l=tm.l;
adt.l=dt.l;
atm.sec=tm.sec+0x20;//延后20秒
RtccChimeEnable();//無限重復鬧鈴允許
RtccSetAlarmRptCount(0);//鬧鈴重復次數0+1,最高256,CHIME=1時次數無限
RtccSetAlarmRpt(RTCC_RPT_MIN);//鬧鐘匹配周期1min 注意:1
RtccSetAlarmTimeDate(atm.l,adt.l);//設置鬧鐘時間
RtccAlarmEnable();//鬧鐘使能
mRTCCSetIntPriority(2);
mRTCCClearIntFlag();
mRTCCIntEnable(1);
INTEnableSystemMultiVectoredInt();
while(1)
{
if(Alarmflag==1)
{
RtccSetAlarmRpt(RTCC_RPT_HALF_SEC);//若觸發鬧鐘則每半秒產生一中斷
break;//跳出while
}
}
void __ISR(_RTCC_VECTOR,ipl2) hander(void)
{
PORTBINV=(1<<9);
Alarmflag=1;
mRTCCClearIntFlag();
}