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.

关于MSP430g2231配置时钟

Other Parts Discussed in Thread: MSP430G2231

我是个软件新手,我最近用MSP430g2231在编一个应用软件(编译仿真用的是IAR),刚开始我配置的主频是其“出厂自带校准的1Mhz DCO”,且已调通程序正常工作;现在我想将主频设到2Mhz左右(不需要校准,只要将DCO频率设置到2MHz左右就行),虽然MSP430g2231的手册中有这方面介绍(如23页DCO介绍部分),但我看了半天还是没搞懂如何具体地配置主频,比如如何去写那几个寄存器?特请专家帮我具体描述一下,最好帮我把这段语句写出来,特致一只菜鸟的十分感谢!

 以下是我目前正常使用的1MHz DOC 的时钟配置函数

void Clockinit(void)

{

 DCOCTL = 0x00;                  // Safe Flow

 if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)                                    

 {  

   while(1);        // If calibration constants erased, do not load, trap CPU!!

 }  

 BCSCTL1 = CALBC1_1MHZ;        // 主频 run at 1Mhz (内部DCO)

 DCOCTL = CALDCO_1MHZ;

}

  •  

    void Clockinit(void)

    {

     DCOCTL = 0x00;                  // 先设置DCO到最慢

     if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)           //检查DCO校正数据空间是否为FF,FF就是说明这两个校正数据丢失,如果丢失则一直死循环,程序相当于挂掉了                         

     {  

       while(1);        // If calibration constants erased, do not load, trap CPU!!

     }  

     BCSCTL1 = CALBC1_1MHZ;        // 把校正数据赋值给DCO的寄存器,主频 run at 1Mhz (内部DCO)

     DCOCTL = CALDCO_1MHZ;        // 把校正数据赋值给DCO的寄存器,主频 run at 1Mhz (内部DCO)

    }

     

  • DCO的配置,由于对于1MHZ/8MHZ/12MHZ/16MHZ在flash  0x10F8-0x10FF的地址进行了出场设定,那么就可以直接对DCO寄存器就行配置。如果对于其他频率,不需要校正的,可以通过对DCOCTL,BCSCTL1中的DCOx/MODx/RSELx进行配置,具体参数查看数据手册的第25页。

  • 您好!

    您测一下下面的代码

       DCOCTL = 0x00;

       DCOCTL = MOD1 + MOD2 + DCO0;

       BCSCTL1 = XT2OFF + DIVA_0 + RSEL0 + RSEL3;

    我还没来得及测。

    然后,有个很有用的外设配置工具是GRACE,集成在CCS5和IAR中的,如果以后遇到类似的问题您可以自己来配置。

  • 非常感谢您!最后这个问题俺完全搞懂了:

    1)除了特殊的“出厂校准”的频率,DCO的其它频率都可以在BCSCTL1和DCOCTL 这两个寄存器中进行配置

    2)所谓配置这两个寄存器,就是直接给它们赋值!俺以前就是不知道如何给这俩寄存器赋值,其实就是像给普通变量赋值那样用“=”就行了,哈哈,这个迷糊有点太幼稚了!

    3)具体将DCO配置成哪个频率(不是什么频率都可配置),可根据手册23页那张表格具体填写就行了,比如:

    若BCSCTL1=134;DCOCTL = 96;---------此时配出的DCO频率为0.8MHz,也是开机默认值

    若BCSCTL1=136;DCOCTL = 96;---------此时配出的DCO频率为1.6MHz左右

    若BCSCTL1=137;DCOCTL = 96;---------此时配出的DCO频率为2.3MHz左右

    若BCSCTL1=138;DCOCTL = 96;---------此时配出的DCO频率为3.4MHz左右

    ....

    若BCSCTL1=143;DCOCTL = 96;---------此时配出的DCO频率为15.25MHz左右

    若BCSCTL1=143;DCOCTL = 224;-------到顶了!此时配出的DCO频率为21MHz左右,此为最大可设值。

    最后俺又用高级示波器细测了一下时钟信号,发现一个特殊现象--------出厂校准的1MHzDCO,频率准确度比较高,但方波上下沿抖动厉害;其它自选配置的DCO频率准确度差一些,但波形非常稳定。希望大家在选取时留意参考这点。

  • 楼上说:最后俺又用高级示波器细测了一下时钟信号,发现一个特殊现象--------出厂校准的1MHzDCO,频率准确度比较高,但方波上下沿抖动厉害;其它自选配置的DCO频率准确度差一些,但波形非常稳定。希望大家在选取时留意参考这点。

     

    请大侠确定一下是否真的有这种现象?什么原因引起的?有什么影响?

  • 回楼上Fuchong Wang

    俺不是大侠也是新虾,我以前是搞通讯系统以及射频方面的,最近才上手嵌入式,对频域和时域的测量是我的老专长。

    这个特异现象我用高档数字示波器反复、多频率、多台机器测过多次,结果都是一致的!我还另开了一帖专门问这事(尚无回答)

    这个现象对一般的MCU程序运行应该是没什么影响的,因为短暂的“时钟频率微抖”并不会干扰“纯”软件的运行,但如果你想用直接用主函数中的控制语句(而非Timer)在某些I/O口输出一些信号控制外设机电设备,就可能会有不良的影响。比如你想给外部设备输出一个时标,如果这个时标本身的沿就在打摆子,控制精度肯定就会受影响。

    我昨天又琢磨了一下,猜测原因可能是这样的:

    1)DCO振荡器的频率其实是靠内部一系列电阻决定的,如果我们选的是一个普通的频率,那MCU内部就会调用几个固定的电阻,这样虽然频率只是大概在那个范围内,但因为选用的电阻是唯一的、确定的,所以输出频率(方波)也就是稳定的。

    2)而出厂专门校准的频点(如CALL 1MHz),它是厂家在出厂前专门预配置的一个精度较高频率,即根据实测专门配出的一个频率,但厂家又绝不可能专为该频率而在芯片内设计制造几个特殊的电阻,他一定是把芯片内几组标准电阻“混搭使用”来凑出一个更精确点的电阻,比如:假设内部电阻100K对应1.1MHz、内部电阻110K对应0.9MHz,单选一个电阻是肯定凑不出1MHz这个频率的,于是机灵的TI工程师就在前一毫秒取100K、后一毫秒取110K,这样其平均值也就=1MHz,而从波形上我们就看到了一种特殊的沿抖动,这种抖从我们电子信号时域测量上来------其实就是一种微弱的“调频”。

  • 看了下手册,好像是这么回事,好像MODx位就是控制这个的,不过看文档好像碰巧了的配置却可以无此现象

  • modulator造成的,DCO进行频率补偿时,只能在两个相近的频率中进行加权后输出,所以会在两个频率点上不停装换,公式为:t = (32 – MODx) × tDCO + MODx × tDCO+1