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:
例程一般都是比较简单的应用。