0

MSP430F5338 マイクロコントローラの RTC_B モジュールを使用して日付/時刻レジスタを設定しようとしています。私はこのようにやっています:

RTCCTL0 = 0;
RTCCTL1 |= RTCHOLD +RTCBCD;
RTCHOUR = 0x14;
RTCCTL1  &= ~RTCHOLD;

それは機能せず、単に割り当てを無視します。理由がわかりません。私が気づいた唯一の奇妙なことは、RTCOFIFGフラグセットです。

何か案が?

補遺

これは私がクロックソースを設定する方法です:

void clk_init(){
  SetVcoreUp (0x01);
  SetVcoreUp (0x02);
  SetVcoreUp (0x03);

  UCSCTL3 = SELREF_2;                       // Set DCO FLL reference = REFO
  UCSCTL4 |= SELA_2;                        // Set ACLK = REFO

  __bis_SR_register(SCG0);                  // Disable the FLL control loop
  UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx
  UCSCTL1 = DCORSEL_7;                      // Select DCO range 50MHz operation
  UCSCTL2 = FLLD_1 | ((f_SMCLK/f_ACLK) -1);                   // Set DCO Multiplier for 25MHz
                                            // (N + 1) * FLLRef = Fdco
                                            // (762 + 1) * 32768 = 25MHz
                                            // Set FLL Div = fDCOCLK/2
  __bic_SR_register(SCG0);                  // Enable the FLL control loop


  // Loop until XT1,XT2 & DCO stabilizes - In this case only DCO has to stabilize
  do{
    UCSCTL7 &= ~(XT2OFFG | XT1LFOFFG | DCOFFG);
                                            // Clear XT2,XT1,DCO fault flags
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag

}

void SetVcoreUp (unsigned int level)
{
  // Open PMM registers for write
  PMMCTL0_H = PMMPW_H;
  // Set SVS/SVM high side new level
  SVSMHCTL = SVSHE | SVSHRVL0 * level | SVMHE | SVSMHRRL0 * level;
  // Set SVM low side to new level
  SVSMLCTL = SVSLE | SVMLE | SVSMLRRL0 * level;
  // Wait till SVM is settled
  while ((PMMIFG & SVSMLDLYIFG) == 0);
  // Clear already set flags
  PMMIFG &= ~(SVMLVLRIFG | SVMLIFG);
  // Set VCore to new level
  PMMCTL0_L = PMMCOREV0 * level;
  // Wait till new level reached
  if ((PMMIFG & SVMLIFG))
    while ((PMMIFG & SVMLVLRIFG) == 0);
  // Set SVS/SVM low side to new level
  SVSMLCTL = SVSLE | SVSLRVL0 * level | SVMLE | SVSMLRRL0 * level;
  // Lock PMM registers for write access
  PMMCTL0_H = 0x00;
}
4

2 に答える 2

1

クロック設定の前にこれを追加して解決しました:

 while (BAKCTL & LOCKBAK) BAKCTL &= ~LOCKBAK;

これは基本的に、msp430f5338 がバッテリ バックアップ システムを備えているためです。したがって、XT1 ドライブ ACLK を設定する前に、このコードが必要になります。

お役に立てれば。

于 2013-12-10T16:45:52.217 に答える
0

データシートをざっと見ただけで、次の 2 つが挙げられます。

  1. RTCBCDフラグを inに設定することでRTCCTL1、2 進化 10 進数を使用したいと言っているので、 as を設定RTCHOURするの0x0Aはナンセンスです。たとえば、14:47 (午後 2 時 47 分) の適切な BCD を書き込むには、時間0x140x47分を書きます。つまり、表示どおりに書きます。

  2. 低電力モード 5 (LPM5) でないことを確認してください - 構成設定は保持されません。

補遺:

また、RTCOFIFGフラグは発振器に障害があったことを示しているので、回路も確認してください。

于 2013-12-10T09:26:26.710 に答える