RTC与msp430

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

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

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

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

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

谁能告诉我为什么会这样?

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

提前致谢…

#include  #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,然后又回到了那个。 处理和功耗的开销很小。

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