3430|0

33

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

F5438的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号。有时小时值出错。
 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表