因为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作为校准值使用,这样是否可以。