读取实时时钟:
1、 RTCRDY 为0时,不能取读取实时时钟
RT0PS源于ACLK,为了实时时钟日历的正确的运行,ACLK必须是32768Hz。(易出错)
定时:
一、每小时闹一次:每一小时的15分钟闹一次:
1、将RTCAMIN设置成15;2、设置RTCAMIN的AE位和清除闹钟寄存器的其它所有AE位
3、AF会在:00:14:59到00:15:00、01:14:59到01:15:00、02:14:59到02:15:00等等时刻被置位。
二、在每天04:00:00时刻闹:
1、RTCAHOUR位置位成4;2、设置RTCHOUR的AE位和复位闹钟寄存器的所有其它AE位
3、AF就会在03:59:59到04:00:00时刻被置位。
三、在每天06:30:00时刻闹:
1、 将RTCAHOUR设置成6,将RTCAMIN 设置成30。
2、设置RTCAHOUR和RTCAMIN的AE位,即可使能闹钟
3、 AF位将会在每一个06:29:59到06:30:00的过渡时刻被置位
四、在每周二 06:30:00时刻闹:
1、 RTCADOW位设置成2,RTCAHOUR设置成6,RTCAMIN将要被设置成30。
2、 设置RTCADOW、RTCAHOUR和RTCAMIN的AE位,闹钟即被使能。
3、 AF位将会在RTCDOW位从1 到2的过渡后和06:29:59到06:30:00的过渡时刻被置位。
五、在每月第五天的06:30:00时刻闹:
1、 RTCADAY位将要设置成5,RTCAHOUR位将要被设置成6,RTCAMIN位将要被设置成30。
2、 设置RTCADAY位、RTCAHOUR位和RTCAMIN位的AE位,闹钟即被使能。
3、 AF位将要在06:29:59到06:30:00的过渡时刻和RTCADAY等于5的时刻被置位。
实时时钟模式下的间隔时间中断:
RTCCTL01 = RTCBCD+RTCMODE+RTCTEVIE+RTCAIE;
RTCMODE: 0:Counter 1: Calendar
置位RTCAIE 位就使能了时钟中断功能
置位RTCTEVIE 位就使能时间间隔中断功能,置位RTCTEVIFG
RTCTEV:00 分钟跳变
01 小时跳变
10 每天凌晨(00:00)
11 每天正午(12:00)
以上均在RTCMODE=1模式下。
//天中断。置位RTCRDYIE 位会使能中断,RTCRDY 位触发实时时钟中断RTCRDYIFG
计数器模式中的实时时钟中断
时间间隔中断:
实时时钟中断(RTCTEVIFG)
配置成8位、16位、24位或者32位中的一种溢出时引发一个触发事件。触发事件可由RTCTEV位进行选择
置位RTCTEVIE位使能中断
在计数器模式中,三个中断源是可用的,其分别是RT0PSIFG、RT1PSIFG和RTCTEVIFG。RTCAIFG位和RTCRDYIFG位被清除。RTCRDYIE和RTCAIE位可以忽略。
1通过设置RT0IP位,可以选择使RT0PSIFG位用来生成间歇中断。
2在计数器模式,RT0PS位时钟源,源自于ACLK或者SMCLK,也可以是基于ACLK或者SMCLK时钟源的2分频、4分频、8分频、16分频、32分频、64分频、128分频和256分频作为时钟源。
3设置RT0PSIE位可以使能中断。
1通过设置RT1IP位,可以选择地让RT1PSIFG位用来生成间歇中断。
2在计数器模式下,RT1PS位时钟源,源于ACLK、SMCLK或者是RT0PS位的输出,也可以是以上时钟源的2分频、4分频、8分频、16分频、32 分频、64分频、128分频和256分频后产生新的时钟源作为时钟。
3设置RT1PSIE位可以使能中断。
一个简单而安全读取实时时钟寄存器的方法是利用RTCRDYIFG中断标志位。置位RTCRDYIE位使能
RTCRDYIFG中断。一旦中断使能,在RTCRDY位上升沿的时候将会产生中断,致使RTCRDYIFG被置位。在这
一点上,这一应用几乎有完整的一秒钟安全地去读取任一个实时时钟寄存器。这一同步的处理方式防止在时间
跳变的过程中读取时间值。当中断得到响应的时候,RTCRDYIFG会自动复位,也可以软件复位。
在计数器模式下,RTCRDY位保持复位。可以不关心RTCRDYIE位,并且RTCRDYIFG维持复位。
资料:
http://www.jdzj.com/pic/Class347/Class410/20080804043437.html
设置RTC时间:
- void main(void)
- {
- WDTCTL = WDTPW + WDTHOLD; // Stop Watchdog Timer
- RTCCTL01 = RTCBCD+RTCHOLD+RTCMODE+RTCTEVIE+RTCAIE;
- // RTC enable, BCD mode,
- // alarm every Minute,
- // enable RTC interrupt
- // Init time
- RTCSEC = 0x00; // Set Seconds
- RTCMIN = 0x32; // Set Minutes
- RTCHOUR = 0x10; // Set Hours
- // Init date
- RTCDOW = 0x03; // Set DOW
- RTCDAY = 0x30; // Set Day
- RTCMON = 0x04; // Set Month
- RTCYEAR = 0x2008; // Set Year
- RTCCTL01 &= ~RTCHOLD; // Enable RTC
- P1DIR |= 0x01; // Set P1.0 to output direction
- __bis_SR_register(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
- }
- 读取RTC时间:
- //
- // //
- // 读取RTC时钟 //
- // //
- //
- unsigned long GetTime(void)
- {
- int hour,minute,second ;
- unsigned long time ;
- for(;RTCCTL01&RTCRDY;) _NOP() ; // 等待RTC有效
- for(;!(RTCCTL01&RTCRDY);) _NOP() ;
- hour = GetRTCHOUR() ;
- minute = GetRTCMIN() ;
- second = GetRTCSEC() ;
- time = (unsigned long)hour*1000000
- +(unsigned long)minute*1000
- +(unsigned long)second ;
- return time ;
- }
分享自:
http://t.cn/zOiB5oB