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.

msp430g2553的DCO校准值被清除后该如何处理

Other Parts Discussed in Thread: MSP-GANG

因为DCO校准值在MCU出厂时保存于信息段A,一般是不允许清除信息段A的。

且示例代码中,有如下语句:

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

{
    while(1);// If calibration constants erased
// do not load, trap CPU!!
}
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation */

可以看出在启动时都先检查DCO1MHZ的校准值是否为0xFF,是则进入while(1)死循环。

正常情况下因为信息段A不清除没问题的,但是我测试BSL下载时,故意给错误的BSL密码,导致FLASH都被擦除,发现转载DCO校准值的信息段A也被清掉了,于是程序运行到上面的代码时即进入死循环。

现在的问题:

1、DCO校准值被擦除后,是否有办法恢复。

2、若跳过上面的代码,不对DCO进行校正,影响有多大,是否会影响代码的正常运行。(ACLK使用外部32768晶振,定时器等需要精确时钟源的都已选择ACLK)。

3、找另一个G2553,通过仿真查到其CALBC1_1MHZ=0x86、CALDCO_1MHZ=0xBE,将代码改成如下:

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


  BCSCTL1 =0x86;

  DCOCTL =0xBE;
}

else

{
  BCSCTL1 = CALBC1_1MHZ; // Set range
  DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation */

}

检查DCO校准值是否存在,存在则使用该校准值,不存在则将0x86、0xBE作为校准值使用,这样是否可以。

  • 每个芯片内部关于DCO的校正数值不是完全一样,你用两外一块芯片的数值,不一定适合你现在的芯片。

    针对于这种DCO数据被擦除的情况,一般的解决办法是,通过利用Timer捕捉外部的32.768K晶振或是时钟源,然后得到1M,8M或是12Mhz之类的DCO的数值,然后在直接写入segment flashA里面。

       关于这个程序,我们是有相关的代码的。另外还有一种办法是通过类似于430Gang之类的工具,它具有校正DCO的功能选项。

    谢谢

  • 你好,谢谢解答。

    我的意思是DCO本身精度是很低的,我假设DCO校正只不过是修正一下精度,使其稍微准确一点。这样我干脆不校正,固定一个数值,让它误差大一点好了,哪怕是1M的跑到0.5~1.5M也没事。但是这里就有一个问题,固定一个数值会不会使G2553不能正常工作,如果仅仅是主频误差比较大,那就没什么关系了,大不了本来1ms执行完的语句现在需要1.5ms的时间,反正MCU大多数时间都是空闲着。

  • 两个办法:

    1、外接晶体,用晶体配合timer校正DCO,TI的msp4300ware有源代码。

  • 第二个办法是,

    http://www.elprotronic.com/ 

    Elprotronic新版MSP430下载工具带有DCO校正功能。

  • 你好,

    我觉得手动去恢复DCO时钟校准数据是个非常麻烦的事情,唯一方便的解决措施就是使用专业的工具来恢复。

    你可以使用MSP-GANG烧录工具来恢复,该工具支持重新效验DCO校准数据,然后写入information memory。

    下次也记得个教训,在做BSL的时候,事先把DCO数据读出,做好备份工作。