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.

[参考译文] MSPM0L1306-Q1:以32位、16位和8位块的形式写入相同扇区

Guru**** 2442090 points
Other Parts Discussed in Thread: MSPM0L1306

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1330628/mspm0l1306-q1-writing-to-the-same-sector-in-32-bit-16-bit-and-8-bit-chunks

器件型号:MSPM0L1306-Q1
主题中讨论的其他器件:MSPM0L1306

你好。

因此、此 MCU 上的闪存程序大小为闪存字(64位)。 我正在尝试了解在同一扇区中写入较小的块时写入是如何工作的。 我已经稍微修改了"flashctl_multiple_size_write"程序、这样它在偏移0处写入一个字节、在偏移1处写入2个字节、在偏移3处写入4个字节、最后在偏移7处写入8个字节(从而跨越字边界)。 原则上、它应该是这样的。

     11    22 22       33 33 33 33 33 33 33              44 44 44 44 44 44                  44   44    44      
   |------- |------- |------- |------- |------- |------- |------- |------- |------- |------- |------- |------- |------- |------- |------- |

0x1000                                0x1007                                      0x100F                             


现在、我单步执行程序、看看存储器看起来

在0x1000写入11:



在0x1001处写入2222:



将333333写入0x1003:



  向0x1007写入444444444444444444:


看看上面的屏幕快照、看起来好像从 RAM 执行一个"程序存储器"本质上会导致扇区被部分擦除。 有时现有的位都被归零(在0x1001处写入0x2222并在0x1007处写入0x44444444444444)、而其他一些时间则保持不变(在0x1003处写入0x3333)。  

有人能告诉我实际的规则是什么、这样我就能确定我可以期待什么?

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

    我不太明白您需要什么、但请记住、闪存被擦除为0xFF、并且只有零可以编程、直到下一次擦除。 因此、如果写入1设置为0、则很好、但如果它尝试将0设置为1、则不会成功。

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

    您好、AJ、

    我同意 Keith 的评论。 0x1为0001、0x2为0010、0x3为0011、0x4为0100。 因此、从图1到图2、0x11将修改为0x00。  

    谢谢。

    于浩

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

    如果是这种情况、那么将8/16/32位写入闪存字的 driverlib API 有什么用处? 这肯定需要读修改写入、以确保写入方式符合预期。

    不能保证写入任何少于闪存字(64位)的内容都会反映您写入的内容。 您能对此发表评论吗?

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

    请注意、闪存操作将执行地址对齐。  

     建议不要重复写入已写入的闪存字。  

    但如果您仍然想重复写入闪存字、可以尝试在已写入的部分中写入 FF。

    例如、在0x1000处写入0x11、然后在0x1000处写入0x22FF、依此类推...

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

    那么、这不会擦除现有数据吗? 我不太明白你说什么。

    顺便说一下、我知道重复写入同一个闪存字可能会更快地耗尽 NVM 闪存芯片。 在这种情况下,让我重新表述我的问题:

    假设我的闪存字包含0xFFFFFF11。 我是否能够将红色 FFFF 替换为2222 不带  正在执行读取-修改-写入? 由于我无法使用 driverlib API 直接在该位置进行写入。

    乐于听到您的回应。

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

    如玉豪所说:

    写入0xFFFFFF2222FF

    (我希望我得到了正确的 F 的数字!) 这将会将2222写入您要放置的位置、并保护 LSB 处的数据。

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

    您的意思是说、如果我将0xFFFFFF2222FF 写入包含0xFFFFFF11的字、那么我将拥有0xFFFFFF222211?

    这是否也意味着我必须始终使用'DL_FlashCTL_programMemoryFromRAM64' aka 64位写入(无论要写入的实际字节数如何)并屏蔽所有其他与 FF 保持不变的字节?

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

    我以前尝试过、它可以正常工作。 但请注意、它仅适用于没有 ECC 的器件。(例如 MSPM0L1306)