以前も質問したことがありますが、今回はもう少し分かりやすく質問できると思います。
以下は私のRTCテストコードです。IAR EW 5 で msp430f5418 を使用しています。
私の問題は、しばらくすると(15分以上でテストしました)、分の割り込みが予想よりも早く来ることです。
つまり、最初は正確に 60 秒後、15 分後に 45 秒目に分の割り込みが発生します。
なぜそうなのですか?RTC レジスタ操作には TI が提供するライブラリを使用しています。
なぜそうなのか誰か教えてもらえますか??
コードの問題ですか、ライブラリの不適切な使用法またはハードウェア自体の問題ですか??
前もって感謝します...
#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;
}
}
}
ハリ