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.

关于MSP430F5xx系统DCO和FLL的问题

Other Parts Discussed in Thread: MSP430F5529

关于系统时钟这块,我有个问题比较迷惑,就是系统的DCO和FLL。

通过阅读MSP430F5529的PDF文档,里面的第59页,给出了不同的DCORSEL位的值对应的DCO频率范围。

 

但是我有一个地方不明白,就是在官方给出的很多示例文档中,对DCO设置的时候,DCORSEL位的配置和手册里对应的DCO频率范围不相符,不知道为什么?比如按照文档中的说明DCORSEL = 0的时候 DCO频率范围是0.07M到1.7M,但是TI给出的一个例子里是这样的:

  if (fsystem <= 630)            //           fsystem < 0.63MHz
 UCSCTL1 = DCORSEL_0;
  else if (fsystem <  1250)      // 0.63MHz < fsystem < 1.25MHz
 UCSCTL1 = DCORSEL_1;
  else if (fsystem <  2500)      // 1.25MHz < fsystem <  2.5MHz
 UCSCTL1 = DCORSEL_2;
  else if (fsystem <  5000)      // 2.5MHz  < fsystem <    5MHz
 UCSCTL1 = DCORSEL_3;
  else if (fsystem <  10000)     // 5MHz    < fsystem <   10MHz
 UCSCTL1 = DCORSEL_4;
  else if (fsystem <  20000)     // 10MHz   < fsystem <   20MHz
 UCSCTL1 = DCORSEL_5;
  else if (fsystem <  40000)     // 20MHz   < fsystem <   40MHz
 UCSCTL1 = DCORSEL_6;
  else
 UCSCTL1 = DCORSEL_7;


按照TI的注释,要得到0.63M到1.25M的频率,需要设置DCORSEL的值为1,但是手册里给出的是0.63M到1.25M的频率完全在DCORSEL=0(0.07M到1.7M)的范围内,为什么要设置DCORSEL为1呢,为0就可以了啊,还有这个例子的后面几句,结合注释,它设置的频率范围和手册里的都对应不上啊,这是怎么回事呢?很困惑...

  • 需要考虑分频,综合起来得到的是最好的MCLK/SMCLK

  • 你可以看一下下面这个代码:

     

    UCSCTL3 = SELREF_2;                       // Set DCO FLL reference = REFO

     UCSCTL4 |= SELA_2;                        // Set ACLK = REFO    

    __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 = Fdco                                            

                                                                    // (249 + 1) * 32768 = 8MHz     

    __bic_SR_register(SCG0);                  // Enable the FLL control loop

     

    DCO是与FLL配合使用的,所以DCORSELx的选择不但要看spec的范围,而且还要看FLLN的取值;

    综合起来选择。

  • 谢谢~ 不过还是不太明白,就那你给的这个例子说吧,其中有两句:

    UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx   

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

    第一句,按手册里说的,如果使能了FLL,那么DCOx 和 MODx都是硬件自动调整,为啥还要在这里都设置成0?

    第二句,如果要让DCO在16M运行,按照手册(http://www.ti.com/lit/ds/symlink/msp430f5529.pdf )第61页,设置  UCSCTL1 = DCORSEL_4 也完全可以啊,DCORSELx = 4的时候 DCO频率是1.3M到28.2M,16M完全在这个范围内,为啥要设置成 DCORSEL_5呢?

     

  • 你好!

    官方程序和手册是一致的,楼主可以参考下图理解:

  • 参考上图,16Mhz应当选择 R 参数 为 5, DCOX  自动调节。

  • 结合下面的图就更清楚了,请查看:

    可见每一个不同的DCORSELx,对应于不同的DCOx(0~31)后,是一个输出频率的范围。

  • 看了你这个说明,我还是明白,就拿DCORSELx = 0 来说吧,DCO的范围为什么不是 0.07到1.70 而是你画的那个 0.20到0.70?

  • DCO频率 fDCO (DCORSEL, DCOx) 为二元函数,由两个变量决定。以DCORSEL = 0 为例,对于不同器件,在f(0,0)的时候,可能的频率范围为0.07Mhz ~ 0.2Mhz,在f(0,31)的时候,可能的频率范围为0.7Mhz ~ 1.7Mhz。那么fDCO(0,y)y取值范围[0,31],所有的器件都能覆盖的频率为,0.2Mhz ~ 0.7Mhz。

    其他设置同理。

  • 虽然还是不太理解,但还是谢谢了~

  • 楼主可以按照以下1、2步骤做即可:

    1、确定工作频率;

    2、根据下图确定工作频率范围,选择对应DCORSEL 值;

    3、DCO中FLL模块会自动调节DCOx的参数,使频率满足设定值得要求;