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.

MSP430F149 FLASH写操作之前是不是必须先擦除?而不能重复写入?

Other Parts Discussed in Thread: MSP430F149

多次写入同一地址下发现数据错误,为什么?

  • Flash 写入前均需保证此地址数据为0XFF,否则会导致写入失败。

    所以写入前擦除是对的。

  • 那这也太坑了吧~ flash擦除的最小单位是段。比如说我在某段里存了好多数据,而只对某一个或多个数据修改,我却需要把整段数据都擦除重写吗?有什么更好的办法吗?

  • flash MCU都是这样的。

    如果是TI flash MCU, 内部带有information flash来存储数据,建议你用information flash 来存储数据。当然也是需要擦除。

    如果是TI FRAM MCU,可以直接改写不需要擦除。

  • 我现在用的是MSP430F149啊~ flash MCU的,不是FRAM MCU,

    你有针对flash MCU修改一个段内部分数据的例程吗?能不能给我借鉴一下?谢谢!

  • 这个是对information flash 写

    /* --COPYRIGHT--,BSD_EX
    * Copyright (c) 2012, Texas Instruments Incorporated
    * All rights reserved.
    *
    * Redistribution and use in source and binary forms, with or without
    * modification, are permitted provided that the following conditions
    * are met:
    *
    * * Redistributions of source code must retain the above copyright
    * notice, this list of conditions and the following disclaimer.
    *
    * * Redistributions in binary form must reproduce the above copyright
    * notice, this list of conditions and the following disclaimer in the
    * documentation and/or other materials provided with the distribution.
    *
    * * Neither the name of Texas Instruments Incorporated nor the names of
    * its contributors may be used to endorse or promote products derived
    * from this software without specific prior written permission.
    *
    * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
    * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
    * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
    * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    *
    *******************************************************************************
    *
    * MSP430 CODE EXAMPLE DISCLAIMER
    *
    * MSP430 code examples are self-contained low-level programs that typically
    * demonstrate a single peripheral function or device feature in a highly
    * concise manner. For this the code may rely on the device's power-on default
    * register values and settings such as the clock configuration and care must
    * be taken when combining code from several examples to avoid potential side
    * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
    * for an API functional library-approach to peripheral configuration.
    *
    * --/COPYRIGHT--*/
    //****************************************************************************
    // MSP-FET430P140 Demo - Flash In-System Programming, Copy SegA to SegB
    //
    // Description: This program first erases flash seg A, then it increments all
    // values in seg A, then it erases seg B, then copies seg A to seg B.
    // Assumed MCLK 550kHz - 900kHz.
    // //* Set Breakpoint on NOP in the Mainloop to avoid Stressing Flash *//
    //
    // MSP430F149
    // -----------------
    // /|\| XIN|-
    // | | |
    // --|RST XOUT|-
    // | |
    //
    // M. Mitchell
    // Texas Instruments Inc.
    // Feb 2005
    // Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.21A
    //******************************************************************************

    #include <msp430.h>

    char value; // 8-bit value to write to segment A

    // Function prototypes
    void write_SegA (char value);
    void copy_A2B (void);

    int main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
    FCTL2 = FWKEY + FSSEL0 + FN0; // MCLK/2 for Flash Timing Generator
    value = 0; // Initialize value

    while(1) // Repeat forever
    {
    write_SegA(value++); // Write segment A, increment value
    copy_A2B(); // Copy segment A to B
    __no_operation(); // SET BREAKPOINT HERE
    }
    }

    void write_SegA (char value)
    {
    char *Flash_ptr; // Flash pointer
    unsigned int i;

    Flash_ptr = (char *) 0x1080; // Initialize Flash pointer
    FCTL1 = FWKEY + ERASE; // Set Erase bit
    FCTL3 = FWKEY; // Clear Lock bit
    *Flash_ptr = 0; // Dummy write to erase Flash segment

    FCTL1 = FWKEY + WRT; // Set WRT bit for write operation

    for (i=0; i<128; i++)
    {
    *Flash_ptr++ = value; // Write value to flash
    }

    FCTL1 = FWKEY; // Clear WRT bit
    FCTL3 = FWKEY + LOCK; // Set LOCK bit
    }


    void copy_A2B (void)
    {
    char *Flash_ptrA; // Segment A pointer
    char *Flash_ptrB; // Segment B pointer
    unsigned int i;

    Flash_ptrA = (char *) 0x1080; // Initialize Flash segment A pointer
    Flash_ptrB = (char *) 0x1000; // Initialize Flash segment B pointer
    FCTL1 = FWKEY + ERASE; // Set Erase bit
    FCTL3 = FWKEY; // Clear Lock bit
    *Flash_ptrB = 0; // Dummy write to erase Flash segment B
    FCTL1 = FWKEY + WRT; // Set WRT bit for write operation

    for (i=0; i<128; i++)
    {
    *Flash_ptrB++ = *Flash_ptrA++; // Copy value segment A to segment B
    }

    FCTL1 = FWKEY; // Clear WRT bit
    FCTL3 = FWKEY + LOCK; // Set LOCK bit
    }

  • Information Flash 除了出厂占用的固化参数以外,就是给你存用户数据的,扇区比普通Flash小