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:由于空 NONMAIN、MCU 已锁定 (0x0036)–我们的权变措施是否正确?

Guru**** 2981470 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1662807/mspm0g3507-mcu-locked-0x0036-due-to-empty-nonmain-is-our-workaround-correct

器件型号: MSPM0G3507
主题: SysConfig 中讨论的其他器件

最近、在开发过程中、我们的 MCU 被锁定并显示 0x0036。 NONMAIN 区域似乎已空、因此器件无法再引导。

为防止再次发生这种情况、我们正在考虑以下权变措施。 您能否检查一下我们的理解是否正确?

  1. 禁用 BSL
    默认情况下、BSL GPIO 调用引脚为 PA18。 我们还将该引脚用作 UART RX、因此可能会意外触发 BSL 模式。

    一个问题:如果 取消选中“Enable BSL“、为什么 GPIO 调用 选项仍然可用?nvm.png

     

    是否最好:

    • 取消选中 Enable BSL complete、或
    • 继续 选中 Enable BSL(启用 BSL)、但 仅禁用 GPIO 调用? 比如下面的屏幕截图。 nvm2.png
  2. 闪存擦除选项
    对于调试、我们选择 “Erase main and NONMAIN Necessary Sectors Only“ 、而不是 “Erase main and NONMAIN “。

    我们的理解是、如果选择了“Erase main and NONMAIN(擦除 MAIN 和 NONMAIN)“、调试器将首先擦除 MAIN 和 NONMAIN。 如果在对新的 NONMAIN 配置进行编程之前发生错误、则 NONMAIN 区域保持为空。 由于没有有效的 NONMAIN 配置、器件无法引导、因此可能会永久锁定。

    这种理解是否正确?

  3. boot_config.c 首次成功编程后不要进行编程
    在初始编程之后、我们 boot_config.c 从后续调试下载中排除。 这样、有效的 NONMAIN 配置会保留、并且不会在后续调试会话期间被覆盖。

 是否可以避免该问题?

提前感谢:)

此致
zq




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

    您好!

    是否有任何更新?  

    提前致谢:)

    此致
    zq

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

    您好 zq、

    你的理解基本上是正确的,但有几个重要的区别。

    首先、请确认完整的 32 位诊断值:

    • 0x00000036 表示 NONMAIN 配置无效或已擦除。 器件启动进入此状态后、它将永久不可恢复。
    • 0x00010136 指示 NONMAIN CRC 验证失败、与 0x00000036 不同。

    如果诊断恰好是 0x00000036、则必须更换 MCU。

    1. BSL 配置

    PA18 用作 UART RX、因此其正常空闲电平为高电平。 如果启用了默认 BSL 硬件调用检查、则 PA18 在 POR 期间处于高电平或复位时间足够长可能会意外调用 ROM BSL。 首选的配置取决于产品是否仍需要 BSL 功能:

    • 如果要保留软件 BSL 调用或可能的固件更新路径、但不希望在引导期间检查 PA18、请保持选中“Enable BSL“并禁用“BSL Invoke Pin Check“。
    • 仅当产品从不使用 ROM BSL 时、才完全禁用“启用 BSL“。 这会禁用硬件和软件 BSL 调用。

    即使 BSL 被禁用、GPIO 调用设置也可以在 SysConfig 中保持可见、因为底层的引脚配置字段仍然存在。 但是、全局 BSL 启用设置优先、因此在禁用 BSL 模式时、这些字段不会产生功能效果。 对于此应用、我建议使 BSL 保持启用状态、但禁用 BSL 调用引脚检查、除非有完全禁用 BSL 的安全性或产品要求。

    2.闪存擦除选项

    您对完全擦除风险的理解是正确的。

    “擦除 MAIN 和 NONMAIN 存储器“擦除两个区域。 如果编程在 NONMAIN 被擦除后但在恢复完整、有效的 NONMAIN 映像和 CRC 之前中断,下一次引导会产生诊断 0x00000036。 TI 明确警告、未编程的已擦除 NONMAIN 区域会永久锁定器件。 “仅擦除 MAIN 和 NONMAIN 必要扇区“更为安全、因为它仅擦除输出映像中表示的扇区。 但是、它 并不能完全消除以下风险:

    • 如果输出文件包含生成的 NONMAIN 部分、则 NONMAIN 扇区仍将被擦除和重新写入。
    • 在该操作期间断电、复位、调试器断开连接或编程失败仍然可能导致 NONMAIN 无效。

    CCS 闪存加载程序文档确认“仅必要扇区“选项擦除正在更新的任何 MAIN 或 NONMAIN 扇区。

    更安全的开发工作流程如下:

    1. 使用稳定的目标功率在受控条件下对所需的 NONMAIN 配置进行一次编程。
    2. 验证器件启动是否正确、并在可能的情况下读回配置。
    3. 从正常开发映像中删除 NONMAIN 内容。
    4. 将仅 main 擦除选项用于后续应用程序调试。
    5. 在对 NONMAIN 进行擦除或编程时、请勿复位或断电。

    避免使用“擦除 MAIN 和 NONMAIN 存储器“进行正常的应用程序下载。

    3.不包括 boot_config.c

    是、 boot_config.c 在初始成功 NONMAIN 编程之后除外、这样可以防止后续调试下载重新写入 NONMAIN。 但是、只有在满足以下所有条件时、这才是安全的:

    • 链接器输出不包含位于 NONMAIN 中的其他段。
    • 所选的闪存加载程序擦除选项不会单独擦除 NONMAIN。
    • 现有 NONMAIN 配置已有效。
    • 将来重新生成 SysConfig 不会自动 boot_config.c 重新添加到构建中。

    不要只依赖源文件排除复选框。 检查链接器映射或生成的 TI-TXT/HEX 文件、并确认正常应用程序映像不包含 NONMAIN 地址。

    建议的工程组织方式是创建两种编译配置:

    • 配置构建: 包括 boot_config.c 由 SysConfig 生成的完整 NONMAIN 映像并对其进行编程。
    • 开发构建: 排除所有 NONMAIN 部分并仅对 main 进行擦除/编程。

    将已知良好的 boot_config.cSysConfig 文件和生成的 NONMAIN 编程映像保留在版本控制之下。 请勿删除它们、因为如果必须在另一台设备上复制配置、则需要使用它们。

    所以你的想法在这里基本上是正确的,我只想补充这些建议:

    • 如果仍需要软件 BSL 更新、请禁用硬件 BSL 调用引脚检查、而不是禁用整个 BSL。
    • 仅对 NONMAIN 的受控编程使用“仅限必要的扇区“。
    • 使用仅主存储器擦除配置进行正常调试。
    • boot_config.c 从正常的应用程序编译中排除、并验证生成的映像不包含 NONMAIN 数据。
    • 除非准备好立即进行编程、否则切勿擦除 NONMAIN。

    希望这有所帮助  

    -布赖恩