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.

[参考译文] MSP430F5358:无法写入闪存

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1252066/msp430f5358-unable-to-write-flash-memory

器件型号:MSP430F5358

大家好、

在我们的设计中、我们使用自定义引导加载程序通过 I2C 进行 MSP 固件升级。 在中、MSP 的闪存分为下载分区、应用分区和应用管理器分区。 二进制文件从主器件发送到配置为从器件的 MSP430、并复制到下载分区。 进一步从主设备和复制的数据检查 CRC ,在匹配 CRC 时,它复制到应用分区,同样检查 CRC。 在成功进行 CRC 匹配时、MCU 会重新启动、该操作将加载新固件。

我们在此面临一个问题、即当映像大小约为65KB 时、上述步骤可以正常执行。 当图像大小超过时、从主站到下载区域的副本很好、CRC 是匹配的。 但从下载分区到应用分区的复制失败。 仅当映像大小超过65KB 时才会发生此情况、否则副本将被传递。 背后的原因可能是什么? 在这里帮我

此致、

Kokila K

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

    您好、Kokila、

    我想您的问题是、您所执行的代码仅编译为"小内存"模型。 这只使用标准 MSP430指令集。 您需要在"大内存"模型中进行编译、以使用扩展指令集来寻址大于64KB 的内存(20位寻址)。  

    另一种可能是、如果图像要跨过64KB 的行、可能需要从链接器的角度将其拆分。 如果看一下链接器文件、通常会看到闪存区域分为闪存(低64KB)和 FLASH2 (>64KB)。  

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

    Jace、您好!

    感谢您的回复。 这是闪存的当前闪存分区。

    在上述分区中、引导加载程序将位于应用管理器中、并且主站的映像将复制到下载分区。 一旦 CRC 校验匹配、相同的映像就会复制到应用分区。  

    这是链接器脚本中的闪存分区

    如果表达方式错误、则小于64kb 的映像尺寸不应起作用。 但只有大于64kb 的映像不会从下载分区复制到应用分区。  

    如果我们要在更大的存储器模型中进行编译、是否要在链接器脚本中进行任何特定的更改?

    此致

    科基拉

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

    大小大于64K 的故障表明您在应该使用较长某个位置的地方使用了 size int 变量。 创建索引并添加到其中一个程序空间中。

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

    尊敬的 David:

    但我在所有地方都使用了 uint32_t 变量。 还有其他可能吗?

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

    没有什么像你的代码要看,我只能做的是猜测。 并非最佳方法。

    当然、您还有一个调试器。 您可以设置一个断点、并详细检查当您到达该64K 边界时会发生什么。 变量的作用等。

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

    我明白、现在是通过 i2c 方法刷写的、幸运的是调试器不工作。 由于映像下载完毕后、iam 进行软件重置。 MCU 从头开始启动、调试器会导致无法使用。

    这是我的相应代码片段。

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

    与使用编辑器的"Insert: code"功能相比,代码的图片更难阅读。

    从我能够读取的内容来看、没有任何东西会因为问题而跳出。 即使它被奇怪地写着。 但缺少的是被调用的各种辅助函数,当然有问题是传递给它的参数是否正确。

    有一些调试 print 语句。 在写入正常和写入失败的情况下、该输出有何不同。

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

    您好、Kokila、

    请仔细检查编译器设置、并确保各个图像是在"大内存模型"中编译的。 您还可以仔细检查反汇编以及指令是否正在使用扩展指令集。 如果您正在尝试寻址64KB 存储器边界以上的存储器位置、则需要扩展指令集才能这样做。  

    如果您需要一个应用示例、请参阅 MSPBOOT、因为它是一个跨存储器模型支持双映像的应用端引导加载程序。 您可以将您的代码与此代码进行比较以进行进一步调试。 有关文档、请参阅 www.ti.com/tool/mspbsl 第3步:定制引导加载程序。 您可以 在此处下载示例软件。  

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

    这似乎没有帮助。 数据被下载并存储在闪存的一个区域中。 然后在验证后(我假设此操作是在闪存中的映像上完成、而不是在接收到数据时完成。)、数据会从上部闪存的一个区域复制到另一个区域。 这是导致问题的最后一步。

    由于我认为对闪存的初始写入工作正常、所以问题在复制之前/复制期间发生。 由于首次写入上部闪存生效、因此似乎不太可能出现内存模型故障。

    我想我不会在验证后复制数据、而是将其结构化以便保留下来。 两个区域之间切换、从而减少闪存的一些磨损。