This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

官方代码的时钟疑惑2

Other Parts Discussed in Thread: MSP430F5529

 这是可以设置ACLK = REFO = 32kHz, MCLK = SMCLK = 8MHz的代码

#include <msp430f5529.h>

void main(void)
{
  volatile unsigned int i;

  WDTCTL = WDTPW+WDTHOLD;                   // Stop WDT
  P1DIR |= BIT1;                            // P1.1 output

  P1DIR |= BIT0;                            // ACLK set out to pins
  P1SEL |= BIT0;                           
  P2DIR |= BIT2;                            // SMCLK set out to pins
  P2SEL |= BIT2;                           
  P7DIR |= BIT7;                            // MCLK set out to pins
  P7SEL |= BIT7;          

  UCSCTL3 = SELREF_2;                       // Set DCO FLL reference = REFO
  UCSCTL4 |= SELA_2;                        // Set ACLK = REFO
  UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx

  // 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
 
  __bis_SR_register(SCG0);                  // Disable the FLL control loop
  UCSCTL1 = DCORSEL_5;                      // Select DCO range 16MHz operation
  UCSCTL2 |= 249;                           // Set DCO Multiplier for 8MHz
                                            // (N + 1) * FLLRef = Fdco
                                            // (249 + 1) * 32768 = 8MHz
  __bic_SR_register(SCG0);                  // Enable the FLL control loop

  // Worst-case settling time for the DCO when the DCO range bits have been
  // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
  // UG for optimization.
  // 32 x 32 x 8 MHz / 32,768 Hz = 250000 = MCLK cycles for DCO to settle
  __delay_cycles(250000);
 
  while(1)
  {
    P1OUT ^= BIT0;                          // Toggle P1.0
    __delay_cycles(600000);                 // Delay
  }
}

 

我把它下进单片机后,结果发现这个程序在执行中发现,ACLK是32khz, 但MCLK与SMCLK不是8MHZ,而是2.3Mhz!

然后我把 这句 UCSCTL2 |= 249;改为UCSCTL2 |= 190时为6.3Mhz,改为UCSCTL2 |= 195时为4Mhz;,改为UCSCTL2 |= 100时也为4Mhz;

这里应该是问题所在吧,UCSCTL2不是包含了FLLD与FLLN吗?这么设置怎么就可以用公式(N + 1) * FLLRef = Fdco呢?

谢谢啊

  • kaixiang,

    您好!

    首先很欣赏您能够这么细致的去研究学习例程。

    我把这个程序下到5529的开发板上测了一下,ACLK大概是33.47K,MCLK大概8.4MHz左右。

    请问您用的板子是自己做的,还是开发板?

    建议您将

    UCSCTL1 = DCORSEL_5;                      // Select DCO range 16MHz operation

    改为:

    UCSCTL1 = DCORSEL_4;                      // Select DCO range 16MHz operation

    再试试。

    设置DCO的频率由以下几个步骤:

    1, 选择FLL模块的参考时钟;

    2, 选择DCO工作的频率带,例如 UCSCTL1 = DCORSEL_5;                      // Select DCO range 16MHz operation

    3, 选择FLL中的倍频系数,例如 UCSCTL2 |= 249;

    希望能对您有所帮助。

  • 我记得我在做430f6137的开发时也碰到时钟问题。这里的程序应该是对的,用5529测了,ACLK=33.64K,MCLK=8.5M,检查你的电路,跟最小系统的设计。是不是测量中的问题。

    另外range的选择在data里有,如下图所示