[英]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.