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.

[参考译文] MSPM0G3507-Q1:MSPM0G3507Qptr XDS110 和 Promik 闪烁问题

Guru**** 2943400 points

Other Parts Discussed in Thread: MSPM0G3507, UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1652127/mspm0g3507-q1-mspm0g3507qptr-xds110-and-promik-flashing-issue

器件型号: MSPM0G3507-Q1
Thread 中讨论的其他器件: MSPM0G3507UNIFLASH

当 MSPM0G3507 以 Promik 刷写时、第一个正常写入周期(通过 I2C)会损坏我们的 NVM 区域。 使用 Lauterbach 工具时、不会发生该问题。 再往前走、我尝试使用 XDS110 刷写一些样本、结果与 Promik 工具的结果非常相似:第一次写入时 NVM 损坏。
另一个实验是:使用 Promik 工具创建完整的闪存、确认 NVM 损坏、然后使用 Lauterbach 仅擦除 NVM 区域。 结果是 NVM 恢复、不存在故障、并且写入后周期未产生损坏条件。

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

    尊敬的 Cesar:

    编译工程时、NVM 区域可能在源代码中定义为未初始化的数据数组或空白数据数组(用 0xFF 填充)。

    • Promik/XDS110 行为:这些编程器会读取您的二进制映像并在刷写前执行“批量擦除“或“扇区擦除“。 当他们看到一个除 0xFFFFFFFF 以外不包含的块时、标准生产优化决定他们完全跳过对这些扇区的编程、因为已擦除的闪存单元已经自然地为 0xFF。 物理硬件擦除会强制将数据数组设置为 0xFF、但不会计算有效的 ECC 位或将其编程到这些跳过地址的隐藏 ECC 存储空间中。 ECC 位保持未配置状态。
    • Lauterbach 行为:默认情况下、Lauterbach 工具使用专用的闪存编程脚本、这些脚本可以在计算有效 ECC 的情况下显式写入 0xFF、或者强制执行“写入时擦除“策略、以便与扇区同步干净地清除 ECC 奇偶校验矩阵。
    • ",="" roboto,="" arial,="" sans-serif;="" font-size:="" 16px;="" font-weight:="" 600;="" margin:="" 0px;="" text-decoration:="" none;="" border-bottom:="" 0px="" rgb(230,="" 232,="" 240);"="">第一个写入失败: 当应用程序启动并尝试对该未编程的 NVM 空间进行第一次有效 I2C 驱动写入时、MSPM0 闪存控制器执行读取 — 修改-写入或尝试对脏的 ECC 槽位进行编程。 由于底层 ECC 位与预期的 0xFF 奇偶校验配置文件不匹配、因此它会触发即时硬件 ",="" roboto,="" arial,="" sans-serif;="" font-size:="" 16px;="" font-weight:="" 600;="" margin:="" 0px;="" text-decoration:="" none;="" border-bottom:="" 0px="" rgb(230,="" 232,="" 240);"="">ECC 双位错误 (DED)",="" roboto,="" arial,="" sans-serif;="" font-size:="" 16px;="" font-weight:="" 600;="" margin:="" 0px;="" text-decoration:="" none;="" border-bottom:="" 0px="" rgb(230,="" 232,="" 240);"="">一位错误 (SEC)。 这会锁定闪存控制器、导致第一个写入循环出现数据损坏或中止

    您的第二个实验完全证实了这是根本问题。 当您使用 Lauterbach 明确地仅以 NVM 区域为目标并擦除时、Lauterbach 驱动程序会初始化该扇区的闪存状态并正确匹配 ECC 奇偶校验字段、从而使应用程序的写入后周期能够在不引发 ECC 故障的情况下执行

    希望这对您有所帮助!

    -布赖恩

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

    您好、Brian、

    你的解释是非常有帮助的,对我来说是完全有意义的。 由于问题出在我的生产线上、而我在开发方面、因此我的工具限制是只能使用 XDS 调试器。 如何缓解这种优化? XDS 能否配置为避免跳过 0xFFFFFFFF 器件?

    以下是 UniFlash 中的当前设置:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ",="" roboto,="" arial,="" sans-serif;="" font-size:="" 16px;="" font-weight:="" 400;="" margin:="" 12px="" 0px="" text-decoration:="" none;="" border-bottom:="" rgb(230,="" 232,="" 240);"="">由于您在开发方面,您对生产环境如何使用 Promik 工具的控制可能有限。 最强大的生产防护措施是更改二进制映像的编译方式。 通过强制编译器/链接器显式插入实际的数据块而不是“空洞“或未分配的空间、您可以防止任何智能编程器绕过优化。
    ",="" roboto,="" arial,="" sans-serif;="" font-size:="" 16px;="" font-weight:="" 400;="" margin:="" 12px="" 0px="" text-decoration:="" none;="" border-bottom:="" rgb(230,="" 232,="" 240);"="">
    ",="" roboto,="" arial,="" sans-serif;="" font-size:="" 16px;="" font-weight:="" 400;="" margin:="" 12px="" 0px="" text-decoration:="" none;="" border-bottom:="" rgb(230,="" 232,="" 240);"="">如果使用 ti-arm-clang 编译应用程序、则可以修改编译后步骤或配置文件以使用映像填充模式:
    1. ",="" roboto,="" arial,="" sans-serif;="" font-size:="" 16px;="" font-weight:="" 400;="" margin:="" 12px="" 0px="" text-decoration:="" none;="" border-bottom:="" rgb(230,="" 232,="" 240);"="">打开工程属性并找到 TI-ARM Linker 或 Hex Utility 选项。
    2. ",="" roboto,="" arial,="" sans-serif;="" font-size:="" 16px;="" font-weight:="" 400;="" margin:="" 12px="" 0px="" text-decoration:="" none;="" border-bottom:="" rgb(230,="" 232,="" 240);"="">启用十六进制实用程序并传递以下参数以强制其输出连续的图像数组:
      1. ",="" roboto,="" arial,="" sans-serif;="" font-size:="" 16px;="" font-weight:="" 400;="" margin:="" 12px="" 0px="" text-decoration:="" none;="" border-bottom:="" rgb(230,="" 232,="" 240);"="">--图像
      2. ",="" roboto,="" arial,="" sans-serif;="" font-size:="" 16px;="" font-weight:="" 400;="" margin:="" 12px="" 0px="" text-decoration:="" none;="" border-bottom:="" rgb(230,="" 232,="" 240);"="">-- fill=0xFFFFFFFF
    3. 确保 ROMS 指令明确封装了 NVM 存储阵列的确切边界

    通过以这种方式编译二进制文件、生成的生产文件实际上包含有效载荷块。 XDS110 和生产线的 Promik 工具都将其视为结构化代码数据、按顺序写入、并自然地计算正确的 ECC 状态、而不会产生任何硬件副作用。 希望这对您有所帮助!

    -布赖恩

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

    感谢您的回答。

    我注意到我做了一大块 S19,所以我做的是创建分区:

    并调整了我的编译后操作: