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.

F5系列UCS的问题



F5的官方例程里面有段代码是这样:

/
  __bis_SR_register(SCG0);                  // Disable the FLL control loop
  UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx
  UCSCTL1 = DCORSEL_5;                      // Select DCO range 16MHz operation
  UCSCTL2 = FLLD_1 + 249;                   // Set DCO Multiplier for 8MHz
                                            // (N + 1) * FLLRef = Fdcodiv 原Fdco
                                            // (249 + 1) * 32768 = 8MHz
                                            // Set FLL Div = fDCOCLK/2
  __bic_SR_register(SCG0);                  // Enable the FLL control loop

我的问题是: UCSCTL0 = 0x0000;为什么把MOD设为0,这样DCO调制器就关掉了,FLL如何调节频率?使能FLL时,MODx与DCOx都是自动修改的吧。

 

  • 另外,为什么先关闭FLL,再打开FLL。

    打开FLL后,前面设置的MODx与DCOx是不是就无效了,FLL会自动调整其值。

  • John C Smith,

    MOD为0,只是将DCO modulator关掉,并不是将DCO关掉。modulator的作用就是控制32个cycles内 fDCO和fDCO+1分别输出个数的多少,目的是为了spread the clock energy并减少EMI。如果将DCO modulator关掉,则输出的是单一频率fDCO;

    一旦设定之后,其实MODx,DCOx都是固定的按照设定或者默认设置,FLL会根据设置将频率逐步调制设定的值。

  • John C Smith,

    关闭FLL后,DCO runs at the previously selected tap and DCOCLK is not automatically stabilized. 则DCO一直输出之前的设置值,不会随着你的设置的更改,而是FLL实时调制DCO;

    在设置完毕后,再打开FLL,那么FLL会根据新的设置来调制DCO的输出直至设定值,前面设置的MODx与DCOx不会无效。

    先关后开,只是为了避免在更改设置时,DCO输出实时变化。

  • 今天做了做实验,例程部分:

    /
      __bis_SR_register(SCG0);                  // Disable the FLL control loop
      UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx    执行完这句,DCOx,MODx都变成0

      UCSCTL1 = DCORSEL_5;                      // Select DCO range 16MHz operation
      UCSCTL2 = FLLD_1 + 249;                   // Set DCO Multiplier for 8MHz
                                                // (N + 1) * FLLRef = Fdcodiv 原Fdco
                                                // (249 + 1) * 32768 = 8MHz
                                                // Set FLL Div = fDCOCLK/2
      __bic_SR_register(SCG0);                  // Enable the FLL control loop  执行完这句使能FLL后,发现DCOx MODx不为0了。
      __no_operation(); 
      // 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.   fFLLrefclk与fmclk的转换
      // 32 x 32 x 8 MHz / 32,768 Hz = 250000 = MCLK cycles for DCO to settle????
      __delay_cycles(250000);

    使能FLL后,DCOx MODx应该是由FLL自动调整的。

    n x 32 x 32 x f_MCLK / f_FLL_reference这个公式与用户手册的公式n x 32 x 32 x f_FLL_reference不太一样啊,这是咋回事?

  • 基本时钟是32768 ,DCO和MDO是根据FLL自动改变的

  • John C Smith,

    DCO输出的频率值是由DCORSELx , DCOx , MODx 三个参数决定的,你看到FLL调整输出, 是因为设置了 DCORSEL_5以及 UCSCTL2中的FLLD和FLLN. 但是你设置了DCOx , MODx的值是不会变的,你可以查看对应的寄存器。

    (n × 32 × 32) fFLLREFCLK cycles 的延时,使用了__delay_cycles()函数,故n x 32 x 32 x f_MCLK / f_FLL_reference是计算(n × 32 × 32) fFLLREFCLK cycles时间对应多少个MCLK cycle.


  •   __bis_SR_register(SCG0);                  // Disable the FLL control loop
      UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx    执行完这句,DCOx,MODx都变成0

      UCSCTL1 = DCORSEL_5;                      // Select DCO range 16MHz operation
      UCSCTL2 = FLLD_1 + 249;                   // Set DCO Multiplier for 8MHz
                                                // (N + 1) * FLLRef = Fdcodiv 原Fdco
                                                // (249 + 1) * 32768 = 8MHz
                                                // Set FLL Div = fDCOCLK/2
      __bic_SR_register(SCG0);                  // Enable the FLL control loop  执行完这句使能FLL后,发现DCOx MODx不为0了。
      __no_operation();  
      // 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);

    请问上面公式是:n x 32 x 32 x f_MCLK / f_FLL_reference,根据UG这里的n应该是FLLREFDIV,根据上面这一行“ Set FLL Div = fDCOCLK/2”,FLLREFDIV应该是2分频,n的值应该等于2,为什么“32 x 32 x 8 MHz / 32,768 Hz = 250000”没有×2的呢?