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.

[参考译文] MSPM0G1506:使用 UART BSL 时应用程序更新失败

Guru**** 2386600 points
Other Parts Discussed in Thread: LP-MSPM0G3507, UNIFLASH, MSPM0G1506, MSPM0G3507
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1458627/mspm0g1506-application-update-fails-using-uart-bsl

器件型号:MSPM0G1506
主题中讨论的其他器件:LP-MSPM0G3507UNIFLASH、、 MSPM0G3507

工具与软件:

您好!

我尝试通过 UART 更新 MSPM0G 控制器。 作为闪存主设备、我使用 TI 评估板 LP-MSPM0G3507、它已通过 USB 连接到我的 PC。

我使用了 SDK mspm0_SDK_2_03_00_07中的 BSL_GUI_EXE V1_2。  

此过程以前没有错误、但现在我发现某些应用程序未完全刷写。 GUI 显示固件 已成功发送、但会显示一个错误:

在失败的更新之后、我通过调试器读取目标控制器的存储器、并且看到前16个字节和后32个字节没有写入。

所以、我尝试比较了可以无错误刷写的固件映像与未完全刷写的固件映像之间的差异。

我从软件中删除了一些无法刷写的随机代码、因此稍微小一点。 映像越小、则映像越大。

较小图像的末尾:

更大图像的结尾:

是否可能不能写入存储器的某些部分? (也许当超过地址0x6400时? 一些与对齐相关的内容??)

或者 GUI 中是否存在错误/超时?

我假设此问题与固件大小有关、这可能是完全错误的、但我非常确定我在软件中删除的代码不应导致闪存故障。

请告诉我、问题的根本原因可能是什么以及解决方法。

提前感谢、此致、  

Fabian

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

    尊敬的 Fabian:

    我以前没有看到这个问题、您是否曾尝试将 Uniflash 工具用作 BSL 主机以查看这个闪存编程是否针对所有存储器位置成功?

    我认为您使用的存储器位置没有任何问题。 至于程序大小、该工具应支持涵盖整个器件闪存的程序、因此最多扩展到0x6400的程序不会是问题。  

    您能否尝试使用上面提到的 Uniflash 等另一个 BSL 主机并告知我结果? 这样、我们便能够了解 BSL GUI 工具中是否存在问题。

    此外、只是为了澄清一下、您是将 BSL GUI 与 LP-MSPM0G3507连接、对吗?

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

    尊敬的 Dylan:

    感谢您的答复! 是的、我将 BSL GUI 与 LP-MSPM0G3507配合使用、将 MSPM0G1506控制器闪存为目标。

    我必须承认、主机和目标并非直接通过 UART 连接。 相反、我们在每端都有一个 LIN 收发器 、用于通过 LIN 传输数据。 因此、我们必须在评估板上的 MSPM0G3507上实施一个滤波器、从而切断来自 LIN 收发器的回波。

    概念如下:

    如何在相同设置下使用此 Uniflash? 我尝试了以下配置、但不起作用:

    在更新前、我通过调试器擦除了目标。 因此、控制器应在下电上电后进入 BSL 并使用默认 UART 引脚 PA10/PA11。

    我在做什么错?

    此致、

    Fabian

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

    感谢您在此提供的信息。 我看到您的设置图对此很有帮助、但我不清楚您的实现。 如果 LP-MSPM0G3507的行为是将程序数据传输到 MSPM0G1506的 BSL 主机、这应该没有问题。 但如果是这种情况、我认为不需要在您的 PC 上运行 BSL GUI。 您是否使用 BSL GUI 通过另一个 BSL 主机程序刷写 LP-MSPM0G3507、然后使用 LP 刷写 MSPM0G1506?  

    我忽略了将 LP 用作 BSL 主机时需要使用 GUI 的原因。 也许您能告诉我 LP 上运行的软件是什么? 您使用的是一个示例吗?

    我对 BSL GUI 的期望是将 PC 连接到 launchpad、在这种情况下 launchpad 即 BSL 目标器件。 然后、通过使用 GUI 进行编程、您将刷写 LP。 GUI 在假设 Launchpad 随后连接到目标器件的情况下无法正常工作。
    很抱歉再次提出问题、我对您正在采取的步骤以及您打算采取的行为感到有点困惑。 在我看来、目前好像有2个 BSL 主机和1个目标。

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

    啊、我的解释可能有点混乱。 抱歉! 我重试:  

    我的 PC (运行 GUI)是用于在目标 PCB 上刷写 MSPM0G1506的 BSL 主机。

    在 LP 的 MSPM0G3507上运行我通过调试器刷写的应用程序。  该应用 在 UART RX/TX 上转发数据并切断 LIN 收发器的回波。 这是必要的、因为回波被主机解释为无效应答。 因此、我想说、LP 不是第二个 BSL 主机、而是 PC 上 BSL 主机的辅助器件和网关。

    我希望这有助于您了解我的设置。 如果没有、请告诉我。 或者您可能有建议如何更好地这样做。

    此设置工作正常、但正如我在最初的文章中所述:更新有时会失败、因为固件未完全写入。

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

    哦、我现在明白了、感谢您的澄清。

    我认为您可以以相同的方式使用 Uniflash 工具、因为您的 LP 只是将数据转发到目标器件。 可能目标的响应未返回 Uniflash 工具、导致了该错误。

    不管怎样、我在这里的问题是 LP 是否转发所有正确的数据、您是否尝试过在 LP 和目标之间探测 UART、并确保这些数据与 PC 与 LP 之间的数据相匹配? 这可能告诉我们错误是来自 LP 还是 GUI。

    我还想询问您是否已尝试使用替代实现-您可以将 Launchpad 上的 XDS110 UART 直接连接到目标器件、绕过 Launchpad 上的 MSPM0G3507。 然后 BSL GUI 直接与目标器件通信。 这将导致系统更简单、潜在故障点更少。 您是否尝试过此功能/这是否是一种可能性? 如果可能、我强烈建议使用这种更简单的设置。

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

    好消息:我找到了这个问题的原因。

    我仍然无法使 Uniflash 运行、而是继续使用 BSL GUI、我的方法是找出目标实际发送的错误代码。 所以、我在 LP 的 UART 上记录了 TX 和 RX 数据。

    GUI (主机)发送命令: 0x80 0x21 0x00 0x20 0x10 0x64 0x00 0x00 |闪存数据0..27 | CRC 0..3

    解释:0x80 =标头、0x0021 = 33个要跟随的 BSL 内核数据字节、0x20 = CMD 编程数据、0x00006410 =闪存地址

    BSL (目标)对该命令的响应: 0x00 0x08 0x02 0x00 0x3B 0x0A 0x26 0xEB 0x41 0x62

    解释:0x00 = BSL 确认、0x08 =标头、0x0002 = 2个待遵循的 BSL 内核数据字节、0x3B =响应消息、 0x0A =无效地址或长度对齐 、0x6241EB26 = CRC

    然后、我读入引导加载程序指南、指出闪存数据必须是必需的 8字节对齐 . 所以、这个错误是有道理的、因为这存在于之前的命令中 28个闪存数据字节 、它 不是8字节对齐的。 当我手动在映像(txt 文件)末尾添加4个字节0xFF 时、此函数是有效的。 更新运行时没有错误。 现在、我只需要一个很好的解决方案来在链接器脚本或从 hex 文件生成此 txt 文件的批处理文件中添加这些对齐字节。

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

    Fabian、感谢您在此处发布该问题的解决方案。

    至于填充图像以正确对齐-您将使用哪些工具来构建要刷写的图像? 从我们的 SDK 导入到 CCS、IAR、Keil 的示例的默认设置应该已经配置为8字节对齐。

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

    我使用 Keil 构建 hex 文件。 对于转换为 txt 文件(这是 BSL GUI 的输入要求)、我将 srec_cat 与以下命令搭配使用:

    srec_cat.exe %InputFile%-Intel -fill 0xff -within %InputFile%-Intel -range-padding 8 -o %outputFile%-TI-TXT

    执行此命令会生成 TI-TXT 格式的8字节对齐图像。

     在 Keil 中可在哪里配置对齐? 我在 Keil 项目设置中找不到选项。

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

    该参数将在您的 Keil Scatter 文件中指定。 看起来您可以仅使用:

    对齐8  

    操作数、以指定8字节对齐。