RTC与msp430

时间:2011-06-29 08:25:05

标签: c embedded msp430 iar real-time-clock

之前我曾问过这个问题,但我想这次我可以更清楚地问一下。

以下是我的RTC测试代码。我正在使用msp430f5418和IAR EW 5.

我的问题是在一段时间后(我们测试了15分钟以上),分钟中断比预期更早。

即,第一次,在正好60秒之后和15分钟之后,分钟中断在第45秒开始。

为什么会这样?我们使用TI提供的库来进行RTC寄存器操作。

任何人都可以告诉我为什么会这样?

是代码的问题还是库的不当使用或硬件本身的问题?

提前致谢...

#include <msp430.h>
#define RTC_VALID_READ_MAX_WAIT  500U
int main()
{
    WDTCTL = WDTPW + WDTHOLD;
    RTCCTL01 = RTCMODE + RTCTEVIE + RTCTEV_0;
    RTCCTL01 |= RTCHOLD;
    /* Calling the routines in the workaround assembly module supplied by TI */
    SetRTCYEAR (2011U);
    SetRTCMON (6U);
    SetRTCDOW (3U);
    SetRTCDAY (4U);
    SetRTCHOUR (23U);
    SetRTCMIN (0U);
    SetRTCSEC (0U);
    RTCCTL01 &= ~RTCHOLD;
    __enable_interrupt();
    while(1)
    {
    }
}

#pragma vector=RTC_VECTOR
__interrupt void handle_rtc_interrupt(void)
{
    switch(RTCIV)
    {
        case 2U:  /* RTC one second Ready Event for valid read */
        {
            int wait_counter = 0U;
            while (!(RTCCTL01&RTCRDY)) /* Wait for RTCRDY to go high, so read will be valid. */
            {
                wait_counter++;
                if (wait_counter > RTC_VALID_READ_MAX_WAIT)
                {
                    break;
                }
            }
            if (wait_counter<=RTC_VALID_READ_MAX_WAIT)
            {
                volatile int min = RTCMIN;
                volatile int sec = RTCSEC;
            }
            RTCCTL01 |= RTCHOLD;
            RTCCTL01 &= ~RTCRDYIE;
            RTCCTL01 &= ~RTCHOLD;
            break;
        }
        case 4U:        /* RTC Minute Interval Event */
        {
            RTCCTL01 |= RTCHOLD;
            RTCCTL01 |= RTCRDYIE;  /* Enable Ready Flag Interrupt */
            RTCCTL01 &= ~RTCHOLD;
            break;
        }
        default:
        {
            break;
        }
    }
}

2 个答案:

答案 0 :(得分:4)

我担心我无法帮助你调试代码,但我放弃了5418中的RTC,因为我在硬件中连续出现故障。这是在2008年,当时我有原型和第一个生产芯片。我认为即使现在标准(非A)级部件中的RTC错误也没有完全解决。由于我必须运行任何5418生产芯片(任何掩模转/勘误级别)并从F2418和F149处理器迁移,我已经有一个软RTC,然后又回到了那个。处理和功耗的开销很小。

答案 1 :(得分:1)

绘制中断间隔时间。让冷却,重新启动,但在它上面吹一个吹风机并重复绘图。如果它发生变化,则会对振荡器产生温度影响。