PIC32 RTCC实时时钟和日历

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就可以完成电子琴的发音了。

       

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个详细的PIC32单片机RTCC驱动例程代码,其中包含了初始化RTCC、设置日期和时间、读取日期和时间的函数: ```c #include <xc.h> #define SYS_FREQ 80000000L void init_RTCC(void) { __builtin_disable_interrupts(); // 禁用中断 RCFGCALbits.RTCEN = 0; // 关闭RTCC RCFGCALbits.RTCWREN = 1;// 允许写入RTCC寄存器 RCFGCALbits.RTCOE = 0; // 禁止输出RTCC时钟 RCFGCALbits.RTCPTR = 0b00; // 选择日期时间寄存器 // 设置日期时间 RTCVAL = 0x21071931; // 日期为2021年7月19日,时间为13时31分00秒 RCFGCALbits.RTCEN = 1; // 使能RTCC __builtin_enable_interrupts(); // 使能中断 } void set_RTCC_datetime(unsigned short year, unsigned char month, unsigned char day, unsigned char hour, unsigned char minute, unsigned char second) { __builtin_disable_interrupts(); // 禁用中断 RCFGCALbits.RTCEN = 0; // 关闭RTCC RCFGCALbits.RTCWREN = 1;// 允许写入RTCC寄存器 RCFGCALbits.RTCOE = 0; // 禁止输出RTCC时钟 RCFGCALbits.RTCPTR = 0b00; // 选择日期时间寄存器 // 设置日期时间 RTCVAL = ((year-1980)<<25) | (month<<21) | (day<<16) | (hour<<11) | (minute<<5) | (second>>1); RCFGCALbits.RTCEN = 1; // 使能RTCC __builtin_enable_interrupts(); // 使能中断 } void get_RTCC_datetime(unsigned short *year, unsigned char *month, unsigned char *day, unsigned char *hour, unsigned char *minute, unsigned char *second) { unsigned long datetime; __builtin_disable_interrupts(); // 禁用中断 RCFGCALbits.RTCPTR = 0b00; // 选择日期时间寄存器 datetime = RTCVAL; RCFGCALbits.RTCPTR = 0b01; // 选择日期寄存器 *day = RTCVALbits.DAY; *month = RTCVALbits.MONTH; *year = RTCVALbits.YEAR + 1980; RCFGCALbits.RTCPTR = 0b10; // 选择时间寄存器 *second = RTCVALbits.SEC << 1; *minute = RTCVALbits.MIN; *hour = RTCVALbits.HR; __builtin_enable_interrupts(); // 使能中断 } ``` 在这个例程中,我们使用XC32编译器来编写代码。首先,我们定义函数`init_RTCC()`来初始化RTCC。在这个例子中,我们关闭RTCC,并允许写入RTCC寄存器。然后,我们设置日期时间为2021年7月19日13时31分00秒,并启用RTCC。接下来,我们定义函数`set_RTCC_datetime()`来设置日期和时间。在这个例子中,我们将年份、月份、日期、小时、分钟和秒钟分别写入到对应的寄存器中。最后,我们定义函数`get_RTCC_datetime()`来读取日期和时间。在这个例子中,我们首先读取日期时间寄存器的值,然后将年份、月份、日期、小时、分钟和秒钟分别从对应的寄存器中读取出来。 这只是一个简单的例程,实际应用中需要根据具体的需求进行更复杂的RTCC驱动程序开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值