打印

【TI FAQ】+MPS430手中模块DCO中FLL的作用是什么?

[复制链接]
1392|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
okyouwin|  楼主 | 2014-9-22 16:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MPS430手中模块DCOFLL的作用是什么?
FLL的主要作用是稳定DCO,利用它硬件可以自动地配置DCOMOD,使得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)
其中:
·DDCOCLK分频为DCOCLKDIV的分频数,由FFLD确定,可取1,2,4,8,16,32,默认值为2
·NFLLN确定,值取1-1023,最小值为1,如果写0会被置位1,默认值为31
·nFLLREFCLK的分频值,游FLLREFDIV确定,可取1,2,4,8,12,16.默认值为1
·fFLLREFCLK默认由REFOCLK提供,除非打开了TX1,但值都为32768Hz
这样,我们就能计算出PUC后,fDCOCLKDIV的值为1,048,576Hz。所以MCLKSMCLK的默认频率为1MHz,但应注意的是:fDCOCLK的值是这个值得两倍!也就是说PUCDCOCLK的频率为2MHz
所以,对于设置DCO频率,使用FLL的确会方便和稳定很多,根据目标值频率通过公式反推,一般fFLLREFCLK就是32768,n1,D2,这些值取默认值就好,那么我们只要计算出N,只要N的值落在了1023之内,它就符合范围,而且一般都不会超出的。那么只要设置好DCORSLFLLN,我们就可以得到想好的DCO频率了。但一定要记住:
·MCLKSMCLK的默认时钟源是fDCOCLKDIV!(N + 1) × (fFLLREFCLK÷ n)!
根据以上两条公式,我将DCOCLKDCOCLKDIV的关系理解为,fFLLREFCLKNn,这三个值确定了DCOCLKDIV,而DCOCLK则是在DCOCLKDIV的基础上乘上了D,是DCOCLKDIV确定了DCOCLK
关于XT1LFREFOCLK,虽说它们两个都是32768Hz,不过如果PUC后不处理XT1,而让ACLKFLLREFCLK的时钟源自动转为REFOCLK,那么XT1LFOFFG(XT1晶振失效标志位(低频模式))将会一直被置位,而OFIFG也跟着一直置位。
所以,解决办法无非是两种:
1.操作简单的方法,重新配置ACLKFLLREFCLK的时钟源,一般就是将它们的源取为REFOCLK。只需两行代码:
[cpp] view plaincopyprint?
UCSCTL3 |= SELREF_2; // Set DCO FLL reference = REFO
UCSCTL4 |= SELA_2; // Set ACLK = REFO
2.打开XT1LF,只要将XT1成功起振,并成功取为时钟源,TX1LFOFFG便不会被置位。因为ACLKFLLREFCLK的时钟源默认就是XT1LF,所以我们只需(1)XINXOUTI/O口选为XINXOUT模式,使得晶振接通,(2)再将XT1OFF0,打开晶体振荡器,(3)配置XCAP,选择好电容,一般TX132768Hz的话,电容取12pf,不过这个是默认值,所以可以不配置。
[cpp] view plaincopyprint?
P5SEL |= BIT4+BIT5; // Port select XT1
UCSCTL6 &= ~(XT1OFF); // XT1 On
UCSCTL6 |= XCAP_3; // Internal load cap
我测试过这两种方法,第一种获得的时钟频率,无论是ACLK还是MCLKSMCLK,与目标值有约百分之零点几到一点几的误差,而且频率有波动。而第二种使用了外部晶振,频率非常接近目标值,ACLK只相差了0.5Hz,而且非常稳定,几乎没有波动。
所以,我推荐在不考虑功耗和要求精确的情况下,尽量使用XT1LF
参照TI提供的例程,在设置DCORSELFLLN前,需要暂时禁止FLL,即将SR中的SCG0置位,然后再配置UCSCTL1UCSCTL2,配置好后再将SCG00,如下:
[cpp] view plaincopyprint?
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL1 = DCORSEL_5; // Select DCO range 16MHz operation
UCSCTL2 |= 249; // Set DCO Multiplier for 8MHz
// (N + 1) * FLLRef = Fdco
// (249 + 1) * 32768 = 8MHz
__bic_SR_register(SCG0); // Enable the FLL control loop

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:把每天当做世界末日、。、

56

主题

765

帖子

3

粉丝