代码之家  ›  专栏  ›  技术社区  ›  Feroze Mohamed

MSP430-XT1晶体在LPM3中关闭

  •  2
  • Feroze Mohamed  · 技术社区  · 10 年前

    我使用的是MSP430F6638控制器。 根据数据表ACLK,在LPM3(Deep SLeep)中,ACLK来源的源时钟不会关闭。

    但在我的情况下,只要我进入LPM3,XT1就停止振荡。

    上述情况仅在XT2晶体关闭时发生。如果XT2未关闭,然后进入LPM3,则XT1保持振荡。

    我如何配置时钟

      P3SEL |= BIT4; // SMCLK
      P3DIR |= BIT4;
      
      P7SEL |= 0x0C; // P7.3,2 -> XT2OUT, XT2IN
      
      // Unlock XT1 pins for operation
      while(BAKCTL & LOCKBAK)
      {
        BAKCTL &= ~(LOCKBAK);
      }
      
      // From XT2 = 16 Mhz
      UCSCTL6 |= XCAP_2; // Fz 120216: Internal load cap (CAP Value + 2)/2 = 8.5pF (Refer Datasheet)
      UCSCTL6 &= ~(XT1DRIVE1 | XT1DRIVE0 | XT2DRIVE1);
      UCSCTL6 |= (XT2DRIVE0);
      UCSCTL6 &= ~XT2OFF;       // Set XT2 On
      UCSCTL6 &= ~XT1OFF;       // Set XT1 On
      UCSCTL3 = 0x0021; // FLL : REFOCLK and divby2
      
      do
      {
        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG); // Clear XT1 fault flags
      }while(UCSCTL7 & (XT2OFFG + XT1LFOFFG)); // Test XT1 fault flag
      
      __bis_SR_register(SCG0); // Disable the FLL control loop
      
      UCSCTL0 = 0x1F00; //Range
      UCSCTL1 = 0x50; //Range
      UCSCTL2 = 0x1138; // MCLK : 5 Mhz
      
      _delay_ms(100);
      
      // Clock Source Selection :
      UCSCTL4 = 0x0054;     // ACLK : XT1CLK; SMCLK : XT2CLK; MCLK : DCOCLKDIV
      UCSCTL5 |= DIVS1;     // SMCLK div by 4 (4 Mhz)
      
      UCSCTL3 |= 0x0021;      // FLLRef : REF0; FLLRef/2 => MCLK = 5Mhz
      
      // Enable the FLL control loop
      __bic_SR_register(SCG0);
      
      // Loop until XT1,XT2 & DCO fault flag is cleared
      do
      {
        UCSCTL7 &= ~(XT2OFFG | XT1LFOFFG | DCOFFG); // Clear XT2,XT1,DCO fault flags; XT1HFOFFG
        
        SFRIFG1 &= ~OFIFG; // Clear fault flags
        
      }while(SFRIFG1 & OFIFG); // Test oscillator fault flag
    

    如何关闭XT2:

    UCSCTL6 |= (SMCLKOFF);
    _delay_ms(10);
    UCSCTL6 |= (XT2OFF);
    

    晶体源

    XT1: 32.768千赫

    XT2: 16兆赫

    外设取决于ACLK(因此取决于XT1)

    UART波特率生成

    看门狗中断

    一旦我进入LPM3,我希望WDT定时器将控制器从深度睡眠中唤醒,但观察到XT1在我进入LPM2(也尝试了LPM0)时立即关闭,因此控制器永远不会从睡眠中唤醒。

    我已经确定的:

    我确保中断正常工作(在LPM3中)

    在以下场景中工作正常

    1. 连接USB时(XT2处于活动状态)

    2. XT2未关闭

    3. 已连接调试器/仿真器(我理解LPM不能完全与已连接的仿真器一起工作)

    尝试此页面: https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/131760

    还尝试了 勘误表UCS11 错误(我认为关闭XT2时不需要这样做)

    提前谢谢。

    1 回复  |  直到 5 年前
        1
  •  0
  •   Feroze Mohamed    10 年前

    问题解决了。回答我自己的问题,这样别人可能会觉得有帮助。

    在我的设计中,VBAT引脚未连接。根据用户手册,不使用时应连接到DVcc。

    将VBAT连接到DVcc解决了问题。

    我不知道为什么XT1在DVCC未关闭时依赖VBAT供电。

    无论如何,问题已经解决:)