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:通过 I2C BSL 编程的应用程序无法正常执行

Guru**** 2419530 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/1503953/mspm0g3507-application-programmed-via-i2c-bsl-fails-to-execute-properly

器件型号:MSPM0G3507
Thread 中讨论的其他器件: UNIFLASH

工具/软件:

我正在使用基于 TI AM62的 SoM 和 MSPM0G3507 MCU 来开发载板。  使用示例工程 bsl_host_mcu_to_mspm0g1x0x_g3x0x_target_i2c (SDK 2.04.00.06)作为指南、我开发了一个"BSL 主机" 程序以在 SoM 上运行、从而通过 I2C BSL 更新 MCU 上的应用程序固件。  因此、SoM 上的两条 GPIO 线分别连接到 MCU 上的 NRST 和 PA18 (默认 BSL_invoke)、而 SoM 上的 I2C 总线连接到 MCU 的 I2C0。  所需的 MCU 固件映像在 Code Composer Studio v20.1.1中使用 TI Clang v4.0.2.LTS 工具链构建;Arm 十六进制实用程序配置为生成 TI-TXT 格式的目标文件、我使用 MSPM0_BSL_GUI 实用程序将 后者转换为头文件 、以便包含在主机程序中。

主机程序 将执行以下操作:

  • 通过 GPIO 调用 BSL
  • 打开 I2C 接口并发送"Connection"命令
  • 发送使用默认密码的"Unlock Bootloader"命令以允许执行受保护的命令
  • 发送"批量擦除"命令以擦除 MCU 的 MAIN 闪存
  • 使用多个"Program Data"命令将新应用程序写入 MCU
  • 发送"Start Application"命令

执行时、程序运行至完成、没有错误。  但是、MCU 似乎不会执行更新后的映像:其功耗低于预期、并且不会响应从 SoM 通过单独的 UART 通道发送的不相关(非 BSL)命令。

我相信程序正在正确地发送命令和处理响应。  在调试时、如果自发送"解锁引导加载程序"以来经过太长时间、我会在发送受保护命令时收到"BSL 锁定"错误、以及在尝试写入固件应用程序之前出现"地址或长度对齐无效"错误、然后才意识到目标地址和数据长度必须是8字节对齐。

随后、 当我将 XDS110调试探针连接到 MCU 并尝试使用 CCS 调试器加载固件应用时、收到以下错误:

连接到目标时出错: 连接到 MSPM0内核失败。  可能的根本原因:1)使用密码禁用或启用了 NONMAIN 内的调试访问。 2)外设配置错误(例如看门狗或时钟不正确)。  要查看问题的更详细诊断、请按下"读取引导诊断"按钮。

调查了该怎么做后、我启动了 MSPM0_RTOS 并执行了批量擦除操作、然后我能够成功加载并执行 Factory_Reset_Tool 应用程序。  请注意、调试器加载的文件已用于生成相应的.txt 文件、该文件又转换为主机程序中包含的头文件。

对可能有什么问题有什么想法?  谢谢。

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

    尊敬的 Dave:

    这个过程对我来说很好。 要确定发生了什么、您只能处理以下流程:

    [引述 userid="621613" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1503953/mspm0g3507-application-programd-via-i2c-bsl-fails-to-execute-properly
    • 通过 GPIO 调用 BSL
    • 打开 I2C 接口并发送"Connection"命令
    • 发送使用默认密码的"Unlock Bootloader"命令以允许执行受保护的命令
    • 发送"批量擦除"命令以擦除 MCU 的 MAIN 闪存
    • 使用多个"Program Data"命令将新应用程序写入 MCU
    [/报价]

    然后、您可以使用 UNIFLASH 读取闪存、并将其与原始闪存进行比较、以查看任何差异:

    检查 MAIN 闪存区域(0x0000.0000)和 NONMAIN 闪存区域(0x41C0.0000。

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

    尊敬的 Sal:

    感谢您的快速响应。  我使用 XDS110探针将有效的应用程序加载到闪存中、并启动 UniFlash 以显示存储器内容。  应用程序(从地址0x00000000开始)和 NONMAIN 寄存器(从0x41C00000开始)看起来都有效。  然后、我执行了上述更新序列、并尝试从位置0x00000000开始刷新闪存内容的显示、但收到以下错误:

    [错误] Cortex-M0P:连接到目标时出错:(错误-614 @ 0x0)目标指示前一个 SWD 请求存在错误条件。 清除错误条件、然后再次尝试 SWD 请求。 (仿真包20.0.0.3298)

    我对目标器件进行了下电上电并重试、但收到了相同的错误。  我还对 XDS110进行了下电上电、但没有任何乐趣。  我认为可能需要批量擦除、使用 UniFlash 执行"批量擦除自动"操作。  成功完成后、对目标进行下电上电并重新启动 UniFlash。  从0x00000000开始的闪存全部为 F、而 NONMAIN 寄存器看起来正常。

    有什么想法吗?

    Dave L.

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

    尊敬的 Dave:

    我假设您将 BOM BSL 用于 I2C 接口。

    然后我执行了上述更新序列、并尝试从位置0x00000000开始刷新闪存内容的显示、但收到以下错误:

    当遇到此错误时、您可以按照以下方法检查其应用程序代码、而不执行批量擦除:

    1.将 PA18连接到 VCC

    2.然后 强制 NRST 为低电平超过1秒、或重新为 MCU 供电(将 PA18连接到 VCC)

    3.使用 Uniflash 读取固件、现在应该连接。

    我怀疑应用程序代码未完全 集成、这会导致问题。

    B.R.

    Sal

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

    尊敬的 Sal:

    在将 BSL_invoke 置为有效并复位 MCU 后、我在尝试刷新闪存读出时遇到以下错误:

    [错误] CORTEX_M0P:连接到目标时出错:(错误-6305) PRSC 模块无法写入路由器寄存器。 (仿真包20.0.0.3298)

    谢谢、

    Dave L.

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

    尊敬的 Dave:

    看起来异常。 如果批量擦除可以成功、BSL 调用也应该起作用。 NRST 是否从外部连接?

    您能否在此处共享该 txt 文件以供我参考?

    B.R.

    Sal

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

    尊敬的 Sal:

    BSL_invoke 和 NRST 信号都连接到 SoM 上的 GPIO 线路、因此我一直使用 SoM 中的 Linux"gpioset"命令来操作其电平。  我 在一个 shell 中将 BSL_invoke (即设置为高电平)置为有效30秒、在另一个 shell 中将 NRST (即设置为低电平)置为有效2秒、然后在 UniFlash 中刷新存储器读出。

    回想一下 PCB 上有一个按钮也可以将 NRST 驱动为低电平、我尝试通过 gpioset 将 BSL_invoke 置为有效30秒、按住 NRST 按钮2秒、然后刷新 UniFlash。  这次、读出成功。  简单的目视检查表明、 图像的起始看起来是正确的、但末端似乎已损坏。

    为便于直接比较、我导出了 正确编程的 MCU 的存储器内容从0x0000导出到0x7240 (包含整个映像)、然后在尝试更新后导出 MCU 内容。  从偏移0x0000到0x1FFF 看来、存储器内容相同;从0x2000开始、它们完全不同。  (图像在偏移0x722F 处结束。)

    我已经附加了.txt 文件;我试图附加两个二进制文件,但似乎论坛上传器不允许它。

    谢谢、e2e.ti.com/.../abx_5F00_auto_5F00_pmic.txt

    Dave L.

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

    尊敬的 Dave:

    为了进行直接比较、我将 经过正确编程的 MCU 的存储器内容从0x0000导出到0x7240 (涵盖整个映像)、然后在尝试更新后导出 MCU 的内容。  从偏移0x0000到0x1FFF 看来、存储器内容相同;从0x2000开始、它们完全不同。  (图像在偏移0x722F 处结束。)

    这看起来好像主机命令加载固件已损坏。 则 M0G 中的图像不正确。

    当 MCU 运行至错误的闪存地址时、它将进入一些故障条件、使 M0G 断开连接。

    顺便说一下、CCS 中还有额外的脚本、当 MCU 进入故障情况时、这些脚本可能有助于连接器件:

    建议您检查主机如何发送固件、并使用逻辑分析仪检查您发送到 M0G 的数据。

    更新:我可以尝试使用两个 LP 格式的 txt、并连接 I2C 接口以查看任何问题。

    B.R.

    Sal

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

    尊敬的 Sal:

    您的怀疑是真实存在的。  在重新检查了我从 bsl_host_mcu_to_mspm0g1x0x_g3x0x_target_i2c  项目对 Host_bsl_write_memory()的适应之后、我意识到、每次循环迭代后、我都在正确递增目标地址并递减剩余的字节计数、但我没有在递增数据指针。  添加此选项可修复问题:我现在可以成功更新 MCU 应用程序。

    谢谢你 数值 请寻求您的帮助。  我很尴尬、因为我之前没有发现这个问题。

    Dave L.