3711|2

4

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

浅谈msp430f5529入门(1)——时钟模块DCO [复制链接]


        刚开始摸索430F55系列,我也是菜鸟一名,折腾了两天它的时钟系统,总算自认为有点眉目。想到入门不易,趁热把我的一些体会分享一下。菜鸟才疏学浅,如有不妥之处,请务必指出。


DCO

        5系列中比149多了个FLL——锁频环,初学者对着他确实有点头疼。另外,还有一个名为DCOCLKDIV的时钟源,它只是由DCOCLK分频而得,但请谨记:


        ·PUC后MCLK和SMCLK的默认时钟源并不是DCOCLK,而是DCOCLKDIV!频率是DCOCLK的二分之一!

        ·DCOCLKDIV的分频值为D,由FLLD所确定,PUC后D默认为2,所以DCOCLKDIV的频率是DCOCLK的二分之一。


        如果把锁频环关闭不用的话,这样的DCO和1xx系列的几乎没有区别,只要配置好DCO,MOD,和DCORSEL就行了。


        这里主要说一下这个FLL:


        ·PUC后FLL默认为工作

        ·置位SR中的SCG0或SCG1和将其禁止。


        FLL的主要作用是稳定DCO,利用它硬件可以自动地配置DCO和MOD,使得DCO比以往更加稳定,也就是说DCOMOD都不用我们用户去操心,即使你配置了它,FLL也会去改变它。那么,这里出现了一个需要注意的问题!:


        ·使用FLL时还需配置DCORSEL!


根据DCO目标值的范围来配置DCORSEL,若目标值超出DCORSEL所规定的范围,那你所得到的fDCO将不会是所计算的值。详细每个值对应范围请参阅datasheet。


        ·FLL具有它的时钟FLLREFCLK,默认为TX1LF提供,TX1失效自动转为REFCLK。

        ·TX1一般外接32768Hz晶振,所以TX1LF模式的频率为32768Hz。

        ·REFOCLK为低频修正内部参考振荡器,典型值为32768Hz。

        ·PUC后,TX1默认是关闭的,也就是说FLLREFCLK是由REFOCLK提供,但不论哪个提供,频率都为32768Hz。


        接下来介绍fdco的计算式子,在user guide里面有给出:


        ·fDCOCLK= D × (N + 1) × (fFLLREFCLK÷ n)
        ·fDCOCLKDIV= (N + 1) × (fFLLREFCLK÷ n)


        其中:

       ·D为DCOCLK分频为DCOCLKDIV的分频数,由FFLD确定,可取1,2,4,8,16,32,默认值为2。

        ·N由FLLN确定,值取1-1023,最小值为1,如果写0会被置位1,默认值为31。

        ·n为FLLREFCLK的分频值,游FLLREFDIV确定,可取1,2,4,8,12,16.默认值为1。

        ·fFLLREFCLK默认由REFOCLK提供,除非打开了TX1,但值都为32768Hz。


这样,我们就能计算出PUC后,fDCOCLKDIV的值为1,048,576Hz。所以MCLK和SMCLK的默认频率为1MHz,但应注意的是:fDCOCLK的值是这个值得两倍!也就是说PUC后DCOCLK的频率为2MHz。


        所以,对于设置DCO频率,使用FLL的确会方便和稳定很多,根据目标值频率通过公式反推,一般fFLLREFCLK就是32768,n为1,D为2,这些值取默认值就好,那么我们只要计算出N,只要N的值落在了1023之内,它就符合范围,而且一般都不会超出的。那么只要设置好DCORSLFLLN,我们就可以得到想好的DCO频率了。但一定要记住:


        ·MCLK和SMCLK的默认时钟源是fDCOCLKDIV!是(N + 1) × (fFLLREFCLK÷ n)!


根据以上两条公式,我将DCOCLKDCOCLKDIV的关系理解为,fFLLREFCLK,N,n,这三个值确定了DCOCLKDIV,而DCOCLK则是在DCOCLKDIV的基础上乘上了D,是DCOCLKDIV确定了DCOCLK


        关于XT1LFREFOCLK,虽说它们两个都是32768Hz,不过如果PUC后不处理XT1,而让ACLKFLLREFCLK的时钟源自动转为REFOCLK,那么XT1LFOFFG(XT1晶振失效标志位(低频模式))将会一直被置位,而OFIFG也跟着一直置位。

        所以,解决办法无非是两种:

        1.操作简单的方法,重新配置ACLKFLLREFCLK的时钟源,一般就是将它们的源取为REFOCLK。只需两行代码:

  1. UCSCTL3 |= SELREF_2;                      // Set DCO FLL reference = REFO  
  2. UCSCTL4 |= SELA_2;                        // Set ACLK = REFO  
复制代码

2.打开XT1LF,只要将XT1成功起振,并成功取为时钟源,TX1LFOFFG便不会被置位。因为ACLKFLLREFCLK的时钟源默认就是XT1LF,所以我们只需(1)将XINXOUT的I/O口选为XINXOUT模式,使得晶振接通,(2)再将XT1OFF置0,打开晶体振荡器,(3)配置XCAP,选择好电容,一般TX1是32768Hz的话,电容取12pf,不过这个是默认值,所以可以不配置。

  1. P5SEL |= BIT4+BIT5;                       // Port select XT1  
  2. UCSCTL6 &= ~(XT1OFF);                     // XT1 On  
  3. UCSCTL6 |= XCAP_3;                        // Internal load cap  
复制代码

我测试过这两种方法,第一种获得的时钟频率,无论是ACLK还是MCLKSMCLK,与目标值有约百分之零点几到一点几的误差,而且频率有波动。而第二种使用了外部晶振,频率非常接近目标值,ACLK只相差了0.5Hz,而且非常稳定,几乎没有波动。

        所以,我推荐在不考虑功耗和要求精确的情况下,尽量使用XT1LF。

        参照TI提供的例程,在设置DCORSELFLLN前,需要暂时禁止FLL,即将SR中的SCG0置位,然后再配置UCSCTL1UCSCTL2,配置好后再将SCG0置0,如下:

  1. __bis_SR_register(SCG0);                // Disable the FLL control loop  
  2. UCSCTL1 = DCORSEL_5;                    // Select DCO range 16MHz operation  
  3. UCSCTL2 |= 249;                         // Set DCO Multiplier for 8MHz  
  4.                     // (N + 1) * FLLRef = Fdco  
  5.                     // (249 + 1) * 32768 = 8MHz  
  6. __bic_SR_register(SCG0);                // Enable the FLL control loop  
复制代码


最新回复

赞赞赞!  详情 回复 发表于 2016-7-28 20:22
 
点赞 关注(2)

回复
举报

186

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
赞!这几天学习时钟系统超级头疼~
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
赞赞赞!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表