TI中文支持网
TI专业的中文技术问题搜集分享网站

F5438的RTC设置

RTC设置不成功,要么RTC寄存器中“小时”不对,要么“天”不对。

source  code

//*********************************************************************************

#include "msp430x54x.h"
//******************************************************************************
struct TIME_RTC
{
    unsigned char second;
    unsigned char min;
    unsigned char hour;
//    unsigned char day_of_week;
    unsigned char day;
    unsigned char month;
    unsigned short year;
    unsigned char day_of_week;
};
//******************************************************************************
void InitRTC();
void ReadRTC(struct TIME_RTC *timer);
void WriteRTC(struct TIME_RTC *timer);

//******************************************************************************
#define HOUR_PERIOD 0x08               //周期上报时间小时,unsigned char
#define MIN_PERIOD  0x00               //周期上报时间分钟,unsigned char
#define PERIOD      0x3C               //周期上报间隔,单位分钟,unsigned short
//******************************************************************************
//main//******************************************************************************
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
   struct TIME_RTC timer1, timer2, timer3;
     timer1.year   = 2012 ;
    timer1.month  = 3 ;
    timer1.day    = 7 ;
    timer1.day_of_week = 3 ;
    timer1.hour   = 7 ;
    timer1.min    = 57 ;
    timer1.second = 0 ;
       timer2.day    = 0 ;
    timer2.day_of_week = 0 ;
    timer2.hour   = 0 ;
    timer2.min    = 2 ;
     InitRTC();
  WriteRTC(&timer1);
  
  P1OUT |= 0x00;
  P1DIR |= 0x0E;
   ReadRTC(&timer3);
    __bis_SR_register(LPM3_bits + GIE);       // Enter LPM3, enable interrupts
  __no_operation();                         // For debugger
}

//******************************************************************************
// 中断处理
// 现在只提供闹钟中断RTCAIFG
//******************************************************************************
#pragma vector=RTC_VECTOR
__interrupt void RTC_ISR(void)
{
  switch(__even_in_range(RTCIV,16))
  {
    case 0: break;                          // No interrupts
    case 2:    //break;                          // RTCRDYIFG
//            P1OUT ^= 0x08;
            break;
    case 4://            P1OUT ^= 0x04;
            break;                                // RTCEVIFG
    case 6:          P1OUT ^= 0x0E;
//          SetAlarmEx(0, 0, HOUR_PERIOD, MIN_PERIOD, PERIOD);
          break;                          // RTCAIFG
    case 8: break;                          // RT0PSIFG
    case 10: break;                         // RT1PSIFG
    case 12: break;                         // Reserved
    case 14: break;                         // Reserved
    case 16: break;                         // Reserved
    default: break;
  }
}
//******************************************************************************
// RTC 初始化
//******************************************************************************
void InitRTC()
{
  RTCCTL01 = RTCHOLD+RTCMODE;   //+RTCTEVIE+RTCTEV_0;  //寄存器字存取操作     +RTCRDYIE
  // RTC保持,实时时钟模式(日历模式),RTCAIE闹钟中断开启
   // 时间初始化
  RTCSEC =  0x01;                       // 设置秒
  RTCMIN =  0x00;                       // 设置分
  RTCHOUR = 0x00;                       // 设置小时

  // 日期初始化
  RTCDOW =  0x00;                     // 设置星期数
  RTCDAY =  0x0;                       // 设置日
  RTCMON =  0x01;                       // 设置月
  RTCYEAR = 0x0;                     // 设置年
   RTCCTL01 &= ~RTCHOLD;}
//******************************************************************************
// 读取时间
// 十六进制格式RTC 读
//******************************************************************************
void ReadRTC(struct TIME_RTC *timer)
{
    for(;RTCCTL01&RTCRDY;)         _NOP();
    for(;!(RTCCTL01&RTCRDY);)      _NOP();
    timer->year   = RTCYEAR ;
    timer->month  = RTCMON ;
    timer->day    = RTCDAY ;
//    timer->day_of_week = RTCDOW ;
    timer->hour   = RTCHOUR ;
    timer->min    = RTCMIN ;
    timer->second = RTCSEC ;
}
//******************************************************************************
// 设置时间
// 注:设置的时间必须正确无误
// 十六进制格式RTC 写
//******************************************************************************
void WriteRTC(struct TIME_RTC *timer)
{
    for(;RTCCTL01&RTCRDY;)         _NOP();
    for(;!(RTCCTL01&RTCRDY);)      _NOP();
       RTCCTL01 |= RTCHOLD ;

    RTCYEAR = timer->year ;
    RTCMON = timer->month ;
    RTCDAY = timer->day ;
//    RTCDOW = timer->day_of_week ;
    RTCHOUR = timer->hour  ;
    RTCMIN = timer->min ;
    RTCSEC = timer->second ;
       RTCCTL01 &= ~RTCHOLD;
}

//******************************************************************************

主函数实现写RTC寄存器功能。单步调试后,查看寄存器出错。

附件中有 WriteRTC后,RTC寄存器值。显然,我要写入日期为3月7号,而实际为3月6号。有时小时值出错。

Tony Lii:

四年后的今天解决了吗

Ling Zhu2:

回复 Tony Lii:

建议基于 code examples 改。

king jill:

回复 Ling Zhu2:

 官方给的例子里都没有动态读写寄存器的程序,只有初始化的时候写进寄存器,能否给一个读写时间的例子,谢谢

灰小子:

回复 king jill:

例程一般都是比较简单的应用。

赞(0)
未经允许不得转载:TI中文支持网 » F5438的RTC设置
分享到: 更多 (0)