×
嵌入式 > 技术百科 > 详情

MSP430系统实时时钟RTC学习日志

发布时间:2020-06-20 发布时间:
|
读取实时时钟:
 
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位可以忽略。[page]
 
 
 
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                                        ;
}
 
 
 
 
 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil5(MDK5)在调试(debug)过程中遇到的问题