專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

PIC32 RTCC實時時鐘和日歷

作者:未知   來源:手上青春飛翔的博客   點擊數(shù):  更新時間:2014年08月08日   【字體:

 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();
 
}
關(guān)閉窗口

相關(guān)文章