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.

关于MSP430F2131的flash区写数据写入错误的问题讨论

Other Parts Discussed in Thread: MSP430F2131

现在我做了一款产品,使用的是TI的MSP430F2131作为主控MCU,出现了在flash中写入64个字节的固定数组时,内存区的数据在写的时候MEMORY内的数据不对或者出现上电后进行重新读写相同的数据到flash后,数据会变。后面换一块MCU后,发现不会出现这种情况。

上面是要写的数据:

上面是写数据的代码:

flash:

写数据的时候已经上锁了,但是内存区的数据还是会改变,如红色的01;按道理说上锁之后这部分的内存是不会有变化的。

在后面样机更换一个新的MCU后就没有这种情况发生,所以我得出的结论是MCU坏了。但是现在的问题是要找到会是什么原因导致MCU损坏,到底是MCU的质量问题还是由于本身样机的问题导致的。希望大神能够帮忙分析和指点@

  • 那您 “flash区写数据写入错误” 的芯片在运行其他程序时是否正常?比如

    www.ti.com/.../getliterature.tsp

    内的

    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

    或者其他程序

    请问该芯片出现这种情况的概率大约是多少?
  • 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 pointer
    FCTL3 = FWKEY; // Clear Lock bit
    FCTL1 = 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 bit
    FCTL3 = FWKEY + LOCK; // Set LOCK bit

    EnableInterrupt();

    }

    /*读取信息区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;
    }
  • 硬件是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 XTAL
    BCSCTL3 |= LFXT1S1; // 3 ?16MHz crystal or resonator

    do
    {
    IFG1 &= ~OFIFG; // Clear OSCFault flag
    for (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_FREQ 12000000
    #define BASE_TIME_COUNT 65 //50000/(CCR0_RESOLUTION_VALUE/DCO_FREQ)
  • if (CALBC1_1MHZ==0xFF)// If calibration constants erased
    {
    while(1); // do not load, trap CPU!!
    }

    卡在这里表明您的校正参数被擦除了

    这些校正参数是芯片在生产时为每个单一MSP单独确定的,也就是说每个芯片的校正参数都是不同的

    您可以尝试通过以下程序来重新获取这些参数

    dev.ti.com/.../node

    的 DCO Calibration Constants Programmer
  • 请注意下面的说明

    //******************************************************************************
    //  MSP430F21x2 Demo - DCO Calibration Constants Programmer
    //
    //  NOTE: THIS CODE REPLACES THE TI FACTORY-PROGRAMMED DCO CALIBRATION
    //  CONSTANTS LOCATED IN INFOA WITH NEW VALUES. USE ONLY IF THE ORIGINAL
    //  CONSTANTS ACCIDENTALLY GOT CORRUPTED OR ERASED.
    //
    //  Description: This code re-programs the F2xx DCO calibration constants.
    //  A software FLL mechanism is used to set the DCO based on an external
    //  32kHz reference clock. After each calibration, the values from the
    //  clock system are read out and stored in a temporary variable. The final
    //  frequency the DCO is set to is 1MHz, and this frequency is also used
    //  during Flash programming of the constants. The program end is indicated
    //  by the blinking LED.
    //  ACLK = LFXT1/8 = 32768/8, MCLK = SMCLK = target DCO
    //  //* External watch crystal installed on XIN XOUT is required for ACLK *//
    //
    //           MSP430F21x2
    //         ---------------
    //     /|\|            XIN|-
    //      | |               | 32kHz
    //      --|RST        XOUT|-
    //        |               |
    //        |           P1.0|--> LED
    //        |           P2.1|--> SMLCK = target DCO
    //
    //  A. Dannenberg
    //  Texas Instruments Inc.
    //  December 2007
    //  Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.41A
    //******************************************************************************