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.

[参考译文] LP-MSPM0G3507:如何覆盖同一地址上的闪存数据

Guru**** 2350610 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1243575/lp-mspm0g3507-how-can-i-over-write-the-flash-memory-data-on-the-same-address

器件型号:LP-MSPM0G3507

#include "ti_msp_dl_config.h"

/* Address in main memory to write to */
#define MAIN_BASE_ADDRESS (0x00010000)

/* 16-bit data to write to flash */
uint16_t gData16 = 0x2222;
uint16_t gData160 = 0x4444;

/* 32-bit data to write to flash */
uint32_t gData32 = 0x33333333;

/* Array to write 64-bits to flash */
uint32_t gDataArray64[] = {0xABCDEF00, 0x12345678};

/* 32-bit data array to write to flash */
uint32_t gDataArray32[] = {0x00000000, 0x11111111, 0x22222222, 0x33333333,
    0x4444, 0x55555, 0x66, 0x77, 0x8, 0x9};

/* 8-bit data to write to flash */
uint8_t gData80 = 0x11;
uint8_t gData81 = 0x03;
uint8_t gData82 = 0xFF;

volatile DL_FLASHCTL_COMMAND_STATUS gCmdStatus;

int main(void)
{
    SYSCFG_DL_init();
    /* Unprotect sector in main memory with ECC generated by hardware */
    DL_FlashCTL_unprotectSector(
        FLASHCTL, MAIN_BASE_ADDRESS, DL_FLASHCTL_REGION_SELECT_MAIN);
    /* Erase sector in main memory */
    gCmdStatus = DL_FlashCTL_eraseMemoryFromRAM(
        FLASHCTL, MAIN_BASE_ADDRESS, DL_FLASHCTL_COMMAND_SIZE_SECTOR);
    if (gCmdStatus == DL_FLASHCTL_COMMAND_STATUS_FAILED) {
        /* If command was not successful, set a breakpoint */
        __BKPT(0);
    }

    /* 8-bit write to flash in main memory */
    DL_FlashCTL_unprotectSector(
        FLASHCTL, MAIN_BASE_ADDRESS, DL_FLASHCTL_REGION_SELECT_MAIN);
    gCmdStatus = DL_FlashCTL_programMemoryFromRAM8WithECCGenerated(
        FLASHCTL, MAIN_BASE_ADDRESS, &gData80);
    if (gCmdStatus == DL_FLASHCTL_COMMAND_STATUS_FAILED) {
        /* If command was not successful, set a breakpoint */
        __BKPT(0);
    }

    DL_FlashCTL_unprotectSector(
        FLASHCTL, MAIN_BASE_ADDRESS, DL_FLASHCTL_REGION_SELECT_MAIN);
    gCmdStatus = DL_FlashCTL_programMemoryFromRAM8WithECCGenerated(
        FLASHCTL, MAIN_BASE_ADDRESS, &gData81);
    if (gCmdStatus == DL_FLASHCTL_COMMAND_STATUS_FAILED) {
        /* If command was not successful, set a breakpoint */
        __BKPT(0);
    }

    DL_FlashCTL_unprotectSector(
        FLASHCTL, MAIN_BASE_ADDRESS, DL_FLASHCTL_REGION_SELECT_MAIN);
    gCmdStatus = DL_FlashCTL_programMemoryFromRAM8WithECCGenerated(
        FLASHCTL, MAIN_BASE_ADDRESS, &gData82);
    if (gCmdStatus == DL_FLASHCTL_COMMAND_STATUS_FAILED) {
        /* If command was not successful, set a breakpoint */
        __BKPT(0);
    }

您好、先生。

我想制作程序以便 将数据写入闪存中。

我引用 mspm0_sdk 中的示例程序"flashctl_multiple_size_write"、并在同一闪存地址中添加"过写不同数据程序"。

此程序应在闪存0x00010000上写入8位数据0x11、0x03、0xff、但在写入第一个字节"0x11"后它不会改变。 (我预计存储器数据将会更改11->03->ff)

如何编写我需要的程序。 请告诉我。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shotaro:

    我预计在下周一发布最新消息。 感谢您的耐心等待。

    B.R.

    萨尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shotaro

    如果在将数据写入已有数据的存储器之前没有擦除闪存区域、则最终数据将与您写入的数据错误。 这将导致数据无法通过 ECC、因此数据将被覆盖。

    顺便说一下、M0器件应该擦除至少一个扇区、如代码示例所示。

    B.R.

    萨尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Sal-San

    感谢您的建议。 我要在一个全扇区中以随机时序更改每个8个字节。

    正如您提到过的、如果 M0器件应该擦除至少一个扇区、  

    1.将1扇区数据保存到 RAM

    2.取消保护1扇区闪存

    3.擦除1扇区闪存

    4.更改 RAM 中的8字节数据

    5.取消保护1扇区闪存

    6.将1扇区数据从 RAM 写入闪存

    7.重复1~6

    这很无聊。

    是否没有 任何方法可以"仅擦除8字节闪存字区域"?

    请提供建议。

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shotaro

    抱歉、没有办法"只擦除8字节闪存字区域"、这是硬件限制。

    对于此应用、我建议您使用 EEPROM 仿真、应用包含在 SDK 中。  它 可以修改8字节闪存字、并像 EEPROM 一样使用。 如果您在代码中仔细检查、它会自动移动到下一个闪存区域以更新新数据。

    有关详细信息、请参阅以下内容: https://www.ti.com/lit/pdf/slaaeb4

    B.R.

    萨尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Sal-San

    感谢您的好主意。 我将尝试这种方法。

    此致

    约塔