MSP430实时时钟(RTC_B)不起作用。无法写入日期/时间寄存器

时间:2013-12-06 11:46:29

标签: microcontroller msp430 texas-instruments real-time-clock

我正在尝试使用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;
}

2 个答案:

答案 0 :(得分:1)

我已经解决了在时钟设置之前添加这个问题:

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

基本上这是因为msp430f5338具有备用电池系统,所以在设置XT1驱动ACLK之前你需要这个代码。

希望这有帮助。

答案 1 :(得分:0)

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

  1. 通过在RTCBCD中设置RTCCTL1标记,您说要使用二进制编码的小数,因此将RTCHOUR设置为0x0A是无稽之谈。要为14:47(下午2:47)编写适当的BCD,您可以将小时编号为0x140x47作为分钟,即按您所见的方式编写。

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

  3. <强>附录:

    此外,RTCOFIFG标志表示您的振荡器出现故障,因此请确认您的电路。