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

刚刚浏览了数据表 - 两件事:

  1. 通过在 中设置RTCBCD标志RTCCTL1,您是说要使用二进制编码的十进制,因此设置RTCHOURas0x0A是无稽之谈。例如,要为 14:47(下午 2:47)编写正确的 BCD,您可以将小时写为分钟0x140x47也就是写为您所看到的。

  2. 确保您未处于低功耗模式 5 (LPM5) - 不保留配置设置。

附录:

此外,RTCOFIFG标志表明您的振荡器有故障,因此也要确认您的电路。

于 2013-12-10T09:26:26.710 回答