MSP430时钟模块总结

摘自  zzzljb的博客

最近开始学习MSP430,看过不少视频,读过许多文章,逛过各大论坛之后,以为自己懂得差不多了,等板子回来后便摩拳擦掌跃跃欲试。先来个LED闪灯程序小试以下,OK没问题。(我用的芯片是MSP430F5438A)然后开始调试先前写好的大程序,结果不尽如人意,没能通过,不过这很正常。于是回头开始单步调试,仔细研究。程序中好多是直接借用的TI官网的例程。

    其中程序开始前的一句注释就让我困惑了很久,这句注释如下:

   MCLK = SMCLK = BRCLK = default DCO = ~1.045MHz

    都知道MSP430在时钟方面是灵活多变的,它的UCS模块有三个时钟信号(MCLK、SMCLK和VCLK)和五个时钟源(XT1CLK、VLOCLK、REFOCLK、DCOCLK和XT2CLK)。

    PUC(上电清零)之后,UCS模块的默认配置如下:

    ●  XT1为LF模式,作为XT1CLK时钟源。XT1CLK作为ACLK。

    ●  DCOCLKDIV 作为MCLK

    ●  DCOCLKDIV 作为SMCLK

    ●  FLL模块使能。XT1CLK作为FLL基准时钟FLLREFCLK。

    ●  XIN 和XOUT管脚为普通IO 口,XT1仍然不能用直到I/O口配置为XT1模式。

    ●  XT2IN 和XT2OUT脚作为普通IO 口,XT2禁止。

    MCLK = SMCLK = BRCLK = default DCO = ~1.045MHz。首先我不太清楚1.045MHz是怎么来的,后来在MSP430x5xx Family User's Guide中找到了相关解释。在第56页有如下英文介绍:

As shown above, FLL operation with XT1 is enabled by default. On MSP430x5xx devices, the crystalpins(XIN, XOUT) are shared with general-purpose I/O. To enable XT1, the PSEL bits associated with the crystal pins must be set. When a 32,768Hz crystal is used for XT1CLK, the fault controllogic will immediately cause ACLK to be sourced by the REFOCLK since XT1 will not be stable immediately. See Section 3.2.12 for further details. Once the crystal startup is obtained and settled, the FLL stabilizes MCLK and SMCLK to 1.048576MHz and f DCO=2.097152MHz.

    这段英文的前半部分正好解释了FLL和XT1上电后的默认状态。关键是最后一句,说一旦晶振启动并稳定,ACLK 将取自外部的32768Hz晶振,FLL将使MCLK 和SMCLK 稳定为1.047586MHz和Fdco=2.097152MHz。我想刚才的1.045MHz应该就是取自这个地方吧。但是此处的Fdco=2.097152MHz,差不多是1.045MHz的两倍。那为什么要说MCLK = SMCLK = BRCLK = default DCO = ~1.045MHz呢?default DCO不是1.045MHz呀?于是将这句注释粘贴在百度里去查找,凡是能搜索到的,大部分都是照搬TI官网的例程,对这句注释也没做太多关注。

    经过自己的研究摸索,发现其实是这样的:刚才在说PUC之后的默认状态时提到MCLK和SMCLK都是取自DCODIV的,而这个DCODIV从字面意思就可知道是DCO的分频,而做几分频是由UCSCTL2寄存器中的FLLD位决定的,该位的默认状态是001,即二分频。所以默认状态下应该是MCLK = SMCLK = DCODIV = DCO/2。所以说TI官网例程中的那句注释严格来说是不对的。

    那现在又有一个疑问,DCO的默认频率是多少?上面的2.097152MHz又是怎么来的呢?网上介绍到DCO默认频率时一般有800KHz和1.045MHz(根据前面的分析,我觉得网友们普遍提到DCO默认1.045MHz的说法,其实严格来说指的是通过使用DCO产生的MCLK和SMCLK是1.045MHz,而不是指DCO本身,DCO默认频率是要翻倍的。)两种说法。貌似800KHz主要是针对1系列单片机的,1.045MHz主要是针对4、5系列而言的。这里又出现了一个有必要关注的东西——FLL(锁频环)。网上一致说,因为4(5)系列内有FLL,所以即便不外接晶振,只使用内部DCO也会获得比较精确的频率。那FLL和DCO的产生有什么关系呢?下面通过从MSP430x5xx Family User's Guide截取的一部分UCS原理图分析开始:

 

MSP430时钟模块总结
    我们看到DCOCLK和DCOCLKDIV其实是从FLL模块输出的。通过分析用户手册,我的理解如下:

    DCOCLK的产生可以通过两种途径:

    第一种就是直接通过UCSCTL0和UCSCTL1寄存器中的DCORSELx、DCOx、MODx来设置。其中DCORSELx负责DCO频率范围的选择,DCOx负责DCO频率阶梯选择,MODx负责混合两个DCO频率,在Fdco和Fdco+1之间产生一个有效的频率并扩展时钟驱动能力,减少电磁干扰。

    这应该就是包括1系列在内的没有FLL的MSP430设置DCO频率的方式。对于有FLL的430,将其FLL关闭后应该也是这种设置方式。这种方式设置的频率不会太精确,只是一个大体的范围,可用于对时钟精度要求不高的设计。

    MSP430F5438的DCO频率设置如下图:

MSP430时钟模块总结

MSP430时钟模块总结

    可以看到这种方式设置的DCO频率有一个很大的范围。

    第二种设置DCO频率的方式是DCO和FLL配合使用。先通过DCORSEL确定一个大致范围,然后通过FLL将DCO频率精确稳定到该范围内一确定值。PUC之后FLL是默认开启的。且有如下计算DCOCLK和DCOCLKDIV的公式:

    MSP430时钟模块总结

    其中的D由UCSCTL2中的FLLD位决定,N由FLLN位决定,n由UCSCTL3中的FLLREFDIV决定。默认情况下,D取2,N取31,n取1。

    那FLLREFCLK又怎么确定呢?还是在本文开始提到PUC之后默认配置中有一条为:FLL模块使能。XT1CLK作为FLL基准时钟FLLREFCLK。但XT1CLK上电后默认是失效的啊?我们说MSP430有5种时钟源,这里面有个REFOCLK(内部参考时钟)。在UCS中的位置如下图:

MSP430时钟模块总结

    用户手册中对REFO的介绍为:“内部参考时钟可以在没有外部晶振,对成本又比较敏感的场合得到很好的应用。内部参考振荡器可以产生一个比较稳定的频率,其典型值为32768Hz,他可以用作FLLREFCLK。REFOCL和FLL相结合可为系统提供灵活可变的时钟,而不需要外接晶振。REFO在不使用时,不消耗任何功耗。REFO被选中时,可以为ACLK、SMCLK、MCLK提供时钟源或者是作为FLLREFCLK。如果REFO不作为ACLK、SMCLK、MCLK的时钟源,软件设置OSCOFF将禁止REFO振荡器。在LPM4模式下OSCOFF禁止REFO振荡器。”(OSCOFF位于状态寄存器SR中,手册中对它的解释是“当该位置1时会关闭XT1晶体振荡器。”可见REFO与XT1的功能是极为相近的,且XT1推荐值是32.768KH在,而REFO的典型值也是32.768KHz。另外手册中还提到当XT1(32.768KHz)使能作为ACLK时钟源时,因为XT1不会立即稳定,这时失效标志位OFIFG会置位,ACLK就会自动切换到REFO,等XT1稳定后,ACLK将会取自外部的XT1。由此可见REFO和XT1不过是一个内置一个外接而已,功能是相同的。)

    当PUC之后,XT1不能作为FLLREFCLK时钟源,我个人认为FLLREFCLK会选择REFO作为其时钟源。那我们就来计算一下到底是不是如此。我们将D = 2、N = 31、FLLREFCLK = 32768、n = 1代入下式:

MSP430时钟模块总结

2 x (31 + 1) x 32768 = 2097152 Hz  = 2.097152 MHz 

    这与前面提到的用户指南中的默认值是一致的。

    还要注意的一点是,用户指南中提到,UCSCTL0寄存器中的DCO和MOD(就是第一种设置DCO频率方式中的两个因素)位会随着FLL的操作自动更新,或者说FLL使能后,DCO和MOD的值便会由FLL硬件控制。(用户指南59页和67页)。

    另外,先前以为在不使用外接晶振时,上电时ACLK默认无效的,但后来经过实测发现ACLK默认也会输出32768Hz的频率的,应该也是取自REFO的。

posted @ 2014-04-13 14:27  徐云朋123  阅读(1140)  评论(0编辑  收藏  举报