|
开始学习MSP430系列一款新CPU,F5529。按照之前学430的方法,我开始了解他的时钟部分,我参照TI官方例程学习,其中有段程序让我在实验室困惑了很久,这句注释如下:
ACLK=n/a, MCLK=SMCLK=BRCLK=default DCO=1.048576 MHZ
都知道 msp430的时钟系统灵活多变,他的USC模块有三个时钟(MCLK,SMCLK,ACLK)和五个时钟源(XT1CLK,VLO,REFOCLK,DCO,XT2)
PUC之后,UCS模块的默认配置如下:
1. XTI为LF模式,作为XT1CLK的时钟源。XT1CLK作为ACLK.
2. DCOCLKDIV作为MCLK
3. DCOCLKDIV作为SMCLK
4. FLL模块使能,XTI作为FLL基准时钟FLLREFCLK
5. XIN,XOUT管脚为普通I/O
6. XT2IN,XT2OUT脚为普通I/O
让我困惑的是后半句,MCLK=SMCLK=BRCLK=defaultDCO=1.048576 MHZ
首先我不太清楚1.045M是怎么来的,后来在5/6系列的Family User’s Guide中找到了相关解释
As previously stated,FLL operation with XT1 is selected by default. If the crystal pins (XIN, XOUT)are
shared withgeneral-purpose I/Os, XT1 will remain disabled until the PSEL bits associatedwith the crystal
pins are set. If XIN andXOUT are not shared with general-purpose I/O, XT1 is enabled. When a 32,768
Hz crystal is used forXT1CLK, the fault control logic immediately causes ACLK to be sourced by the
REFOCLK, because XT1 isnot stable immediately (see Section5.2.12). Once crystal startup is obtained
and settled, the FLL stabilizes MCLK and SMCLK to1.048576 MHz and fDCO = 2.097152 MHz.
这段英文前半段解释了FLL和XT1上电后默认状态。关键在后句,说一段晶振启动比稳定,ACLK将取自外部的32.768KHZ晶振,FLL将使MCLK和SMCLK稳定为1.048576M和fDCO = 2.097152 MHz.
我想1.048576M应该取自这个地方,但是此处的fDCO = 2.097152 MHz.
出不多是1.048576M的两倍,为什么说MCLK=SMCLK=BRCLK=default DCO=1.048576 MHZ,于是我将这句话粘贴去百度,结果大部分是照搬TI官方的例程,对着注释也没太关注。
经过自己的摸索,发现其实是这样的;刚才在说PUC后的默认状态是MCLK,SMCLK都是取自DCODIV的,而DCODIV从字面上看是DCO的分频,而坐几分频是由UCSCTL2中的FLLD决定的,该位的默认状态是001,即2分频。所以应该是MCLK=SMCLK=DCODIV=DCO/2.所以说TI官网的那个注释严格来说是不对的。
那DCO的默认频率是多少呢?上面的2.097152M又是怎么来的。我觉得网友们普遍提到DCO的默认值是1.048576M的说法是不够准确的,应该是通过使用DCO产生的MCLK和SMCLK是1.048576M,而不是DCO本身,DCO的默认值应该翻倍。这里有出现了一个要关注的东西FLL,4,5系列内有FLL,这是1,2系列所没有的,所以即便不外接晶振,只是用内部DCO也可获得很稳定的频率,那FLL与DCO的产生有什么关系呢?我从5/6系列的Family User’s Guide截了一个图(可惜不能显示),看到DCOCLK和DCOCLKDIV从FLL模块输出,通过用户手册,我理解到DCO的产生途径有两种:
第一种就是直接配置UCSCTL0和UCSCTL1寄存器中的DCORSELx,DCOx,MODx来设置。其中DCORSELx负责DCO频率范围的选择,DCOx负责频率阶梯的选择,MODx负责混合两个DCO频率。由于1系列单片机内部没有FLL因此DCO的频率不太精确,从5/6系列的Family User’s Guide看到这种方式设置DCO频率有一个很大的范围。
第二种就是通过FLL自动调节DCO。根据手册中公式
fDCOCLK = D × (N + 1) × (fFLLREFCLK ÷ n)
fDCOCLKDIV = (N + 1) × (fFLLREFCLK ÷n)
这里的D是FLLD,N是FLLN,他们都是UCSCTL2中的位,n由UCSCTL3中的FLLREFDIV决定,默认状态下D取2,N去31,n 取1。
7. 那FLLREFCLK又怎么确定呢?本文上面提到 FLL模块使能,XTI作为FLL基准时钟FLLREFCLK
此外手册中对REFO也作了介绍:内部参考时钟可以在没有外部晶振,对成本有很敏感的场合得到很好的应用,内部参考时钟可以会产生一个很稳定的频率,其典型值为32.768K,他也可作为FLLREFCLK,这样外部低频晶振和REFO可以为系统提供灵活多变的时钟
PUC后,XT1不能作为FLLREFCLK的时钟源,个人认为FLLREFCLK会选择REFO。那我就来验证下自己的是否正确。(默认D=2,N=31,n=1, FLLREFCLK=32.768K)
fDCOCLK = D × (N + 1) × (fFLLREFCLK ÷ n)
fDCOCLKDIV = (N + 1) × (fFLLREFCLK ÷n)
2*(31+1)*32768=2.097152M与用户指南中默认一致。
|
|