PIC32 RTCC实时时钟和日历

2019-04-15 13:12发布

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(); }   装载请说明出处  下一篇         输出比较(PWM)由于这是本次暑假作业,等作业验收后再发,学习了PWM就可以完成电子琴的发音了。