现在我做了一款产品,使用的是TI的MSP430F2131作为主控MCU,出现了在flash中写入64个字节的固定数组时,内存区的数据在写的时候MEMORY内的数据不对或者出现上电后进行重新读写相同的数据到flash后,数据会变。后面换一块MCU后,发现不会出现这种情况。
上面是要写的数据:
上面是写数据的代码:
flash:
写数据的时候已经上锁了,但是内存区的数据还是会改变,如红色的01;按道理说上锁之后这部分的内存是不会有变化的。
在后面样机更换一个新的MCU后就没有这种情况发生,所以我得出的结论是MCU坏了。但是现在的问题是要找到会是什么原因导致MCU损坏,到底是MCU的质量问题还是由于本身样机的问题导致的。希望大神能够帮忙分析和指点@
Susan Yang:
那您 “flash区写数据写入错误” 的芯片在运行其他程序时是否正常?比如
www.ti.com/…/getliterature.tsp
内的
msp430x21x1_flashwrite_03.cFlash In-System Programming, Copy SegC to SegD
msp430x21x1_flashwrite_04.cFlash In-System Programming w/ EEI, Copy SegC to SegD或者其他程序
请问该芯片出现这种情况的概率大约是多少?
user6110578:
回复 Susan Yang:
msp430x21x1_flashwrite_03.c Flash In-System Programming, Copy SegC to SegD
msp430x21x1_flashwrite_04.c Flash In-System Programming w/ EEI, Copy SegC to SegD
我用这两个文件烧写进出问题的MCU中,发现一直卡在这个While(1)中;if (CALBC1_1MHZ==0xFF)// If calibration constants erased{while(1);// do not load, trap CPU!! }
但是也有可能是我的时钟设置不正确,硬件上面用的是12Mhz的外部晶振。
问题样机越来越多,刚刚又有一台之前能正常工作,在老化过程中又出现这种问题。就是在正常运行一段时间后,我写到flash中的功能性校准参数被更改了,导致我后面显示出来的数据不正常。按道理来说我进行读写操作之后,相关的内存区已经被LOCK了,但是在正常运行中这个内存区的数据莫名的更改了!不知道是不是MCU的性能问题还是什么问题。
下面是我的信心读写的程序;
/*将信息写入信息区FLASH*/
void SaveSysPara(void)
{UINT8 *Point;UINT8 i;
ParaRW.Item.Shift1 = Sensor.Shift[CH1];ParaRW.Item.Shift2 = Sensor.Shift[CH2];DisableInterrupt();Point = (void *)0x1040;// Initialize Flash pointerFCTL3 = FWKEY;// Clear Lock bitFCTL1 = FWKEY + ERASE;//+EEI;// Set Erase bit, allow *Point = 0;// Dummy write to erase Flash seg
FCTL1 = FWKEY + WRT;for(i=0;i<PARA_SIZE;i++)*Point++ = ParaRW.Array[i];
FCTL1 = FWKEY;// Clear WRT bitFCTL3 = FWKEY + LOCK;// Set LOCK bitEnableInterrupt();
}/*读取信息区FLASH信息*/
void GetSysPara(void)
{UINT8 *Point;UINT8 i;
DisableInterrupt();Point = (void *)0x1040;for(i=0;i<PARA_SIZE;i++)ParaRW.Array[i] = *Point++;if(ParaRW.Array[0] == 0xFF && ParaRW.Array[1] == 0xFF){ParaRW.Item.Shift1 =0;ParaRW.Item.Shift2 =0;ParaRW.Item.CalTempK =-4.011;ParaRW.Item.CalTempB =7907;ParaRW.Item.CalHumiK =-4.011;ParaRW.Item.CalHumiB =9110;ParaRW.Item.CalTempKF =-2.005;ParaRW.Item.CalTempBF =8308;ParaRW.Item.SetT1Standard=100;ParaRW.Item.SetT1Real=100;ParaRW.Item.SetT2Standard=300;ParaRW.Item.SetT2Real=300;ParaRW.Item.SetT3Standard=500; ParaRW.Item.SetT3Real=500;ParaRW.Item.SetH1Standard=300;ParaRW.Item.SetH1Real=300;ParaRW.Item.SetH2Standard=500;ParaRW.Item.SetH2Real=500;ParaRW.Item.SetH3Standard=700;ParaRW.Item.SetH3Real=700;ParaRW.Item.C_F_SYMBOL=0; }
Sensor.Shift[CH1] = ParaRW.Item.Shift1;Sensor.Shift[CH2] = ParaRW.Item.Shift2;
}
user6110578:
回复 user6110578:
硬件是12MHZ的外部晶振作为时钟源:
我的程序是这样的:
void main(void)
{ InitClock();InitGPIO();InitPWMOut();InitParam();InitDevice();InitSystem();EnableInterrupt();while(1){PeripheralHandle();
_BIS_SR(LPM1_bits+GIE);//进入低功耗0,使能总中断,等待参考稳定}
}时钟初始化程序如下:
void InitClock(void)
{volatile unsigned int i;WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer
BCSCTL1 |= XTS;// ACLK = LFXT1 = HF XTALBCSCTL3 |= LFXT1S1;// 3 ?16MHz crystal or resonator
do{IFG1 &= ~OFIFG;// Clear OSCFault flagfor (i = 0x47FF; i > 0; i–);// Time for flag to set}while (IFG1 & OFIFG);// OSCFault flag still set?
/*注意选择SMCLK的时钟的时钟源,因为定时器使用的是SMCLK*/BCSCTL2 |= SELM_3+SELS;// MCLK = LFXT1 (safe) SMCLK = LFXT1
DelaymS(100);}
#define DCO_FREQ12000000
#define BASE_TIME_COUNT65//50000/(CCR0_RESOLUTION_VALUE/DCO_FREQ)
Susan Yang:
回复 user6110578:
if (CALBC1_1MHZ==0xFF)// If calibration constants erased
{
while(1); // do not load, trap CPU!!
}卡在这里表明您的校正参数被擦除了
这些校正参数是芯片在生产时为每个单一MSP单独确定的,也就是说每个芯片的校正参数都是不同的
您可以尝试通过以下程序来重新获取这些参数
在 dev.ti.com/…/node
的 DCO Calibration Constants Programmer