TI中文支持网
TI专业的中文技术问题搜集分享网站

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都是自动修改的吧。

 

John C Smith:

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

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

Lina Lian:

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会根据设置将频率逐步调制设定的值。

Lina Lian:

回复 John C Smith:

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输出实时变化。

John C Smith:

回复 Lina Lian:

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

/   __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不太一样啊,这是咋回事?

Peter_Zheng:

回复 John C Smith:

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

long cheng2:

回复 Lina Lian:

/   __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的呢?

赞(0)
未经允许不得转载:TI中文支持网 » F5系列UCS的问题
分享到: 更多 (0)