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