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.

[参考译文] MSPM0C1104:如何读取/写入主闪存

Guru**** 2771175 points

Other Parts Discussed in Thread: MSPM0C1104, MSPM0C1103

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1616842/mspm0c1104-how-to-read-write-main-flash

器件型号: MSPM0C1104
主题: MSPM0C1103 中讨论的其他器件

根据技术参考手册第 310 页、应用程序可以使用 NVM 部分中的闪存。
www.ti.com/.../slau893c.pdf

image.png

根据 MSPM0C1103/MSPM0C1104 第 29 页的数据表、外设 存储器区域中包括闪存子区域。 我假设此区域与技术参考文献指定的闪存区域相同。

image.png

在 main 函数开始时、我运行以下代码、但无法从闪存中读取数据。 失败状态返回 DL_FLASHCTL_FAIL_TYPE_INQUIL_ADDRESS。

    SYSCFG_DL_init();

    DL_FlashCTL_executeClearStatus(FLASHCTL);
    DL_FlashCTL_unprotectSector(FLASHCTL, (uint32_t) &device_config_persistent, DL_FLASHCTL_REGION_SELECT_MAIN);
    DL_FlashCTL_readVerify32(FLASHCTL, (uint32_t) &device_config_persistent, (const uint32_t*) &device_config);
    DL_FlashCTL_waitForCmdDone(FLASHCTL);
    DL_FLASHCTL_FAIL_TYPE failType = DL_FlashCTL_getFailureStatus(FLASHCTL);
   if (failType != DL_FLASHCTL_FAIL_TYPE_NO_FAILURE) {
       __BKPT(0);
   }

DEVICE_CONFIG 的类型恰好为 32B、DEVICE_CONFIG_PERSISTENT 的定义如下:

__attribute__((section(".device_config")))
ST_DEVICE_CONFIG device_config_persistent = 
{
    .setting1 = BL_SHORT_CYCLE,
    .setting1 = FALSE, 
...

}  

如何读取 持久性存储器区域的写入数据和写入数据?

此致

更新:

在取消保护操作之前和之后、保护寄存器保持不变。
FLASHCTL->GEN.CMDWEPROTA = 0xFFFF
FLASHCTL->GEN.CMDWEPROTB = 0x0000
FLASHCTL->GEN.CMDWEPROTC = 0x0000

原因是 sectorNumber 和 sectorInBank 等于 0x1000 (4096)。
此 API 显然并不用于写入该存储器部分。 至少不在我的控制器上。

更新 2:

而是尝试将数据写入 8kB 代码闪存的最后一部分。
但在读取时我一直收到错误 0x20、DL_FLASHCTL_FAIL_TYPE_VERIFY_ERROR。 不清楚原因。
通过 DL_FlashCTL_programMemory32、写入也不起作用、因为 ROM 数据不会更新。

MEMORY
{
    FLASH           (RX)  : ORIGIN = 0x00000000, LENGTH = 0x00001BFF
    SRAM            (RWX) : ORIGIN = 0x20000000, LENGTH = 0x00000400
    DEVICE_CONFIG   (RW!x) : ORIGIN = 0x00001C00, LENGTH = 0x000001FF
    BCR_CONFIG      (R)   : ORIGIN = 0x41C00000, LENGTH = 0x000000FF
}

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

    高 RH、
    您不能读取数据的意思是什么? 使用 DL_FlashCTL_readVerify32 读取存储器时是否会发生失败? 我建议调试程序、仔细检查赋予函数的地址中的值是否与您的预期相同。  

    至于如何写入、您可以使用我们 SDK 中的示例 (flashctl_multiple_size_write)、其中介绍了如何写入闪存中的地址

    此致、

    Diego Abad

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

    尊敬的 Diego:

    我应该说明一下。 我确实收到了一个 DL_FLASHCTL_FAIL_TYPE_INLULTRAL_ADDRESS 返回。  由于我想象的错误、调用后我的输出 device_config 根本不包含任何数据。

    这是否是从闪存部分 0x00400000 读取数据的唯一方法?
    我的链接器配置尽可能指向正确的地址。

    MEMORY
    {
        DEVICE_CONFIG   (RW!x) : ORIGIN = 0x00400000, LENGTH = 0x000001FF
    }
    
    /* Define output sections */
    SECTIONS
    {
        .device_config : {
            __device_config_load__ = LOADADDR (.device_config);
            __device_config_start__ = .;
            KEEP (*(.device_config))
            KEEP (*(.device_config*))
            . = ALIGN (8);
            __device_config_end__ = .;
        } > DEVICE_CONFIG AT> DEVICE_CONFIG
    }

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

    尊敬的 R.H.:
    由于该器件没有 ECC、我相信您也可以使用指针读取数据。 但是、必须按照 SDK 中的示例进行写入。

    此致、

    Diego Abad

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

    发现问题。 我没有想到需要擦除、但在编程前擦除可以让它以某种方式起作用。