繁体   English   中英

带 msp430 的 RTC

[英]RTC with msp430

我以前也问过这个问题,但我想这次我可以问得更清楚一些。

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

我的问题是一段时间后(我们测试了 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;
        }
    }
}

哈里

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

Plot 中断之间的时间间隔。 让它冷却,重新启动,但在它上面运行一个吹风机并重复 plot。 如果它发生变化,您的振荡器就会受到温度影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM