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.

[参考译文] MSP-EXP430F5438:闪存组擦除问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/647587/msp-exp430f5438-flash-bank-erase-issue

器件型号:MSP-EXP430F5438

您好!

我目前正在进行一个项目,我们在 MSP430上使用 TI 双模 BluetoothRegistered协议栈(v1.5 R2)(www.ti.com/.../CC256XMSPBTBLESW)。

对于器件的功能操作、我们有时需要擦除完整的闪存组。 在调试过程中、我多次在 IDE 中看到不必要的行为(器件复位或结束地址0x4)。 由于我在项目中找不到/调试问题、我尝试构建一些简单的应用来测试 MSP-EXP430F5438开发板上的闪存组擦除功能。

闪存组擦除函数来自 MSPWare 库(www.ti.com/.../MSPWare)、使用的应用是蓝牙堆栈的默认 SPPDemo。 我只添加了几个代码行(主要是我嵌入了闪存组擦除函数、以简化任何人的重建过程)来测试闪存组擦除函数。 附加的文件(SPPDemo.c)应在 SPPDemo 项目中替换、并将在 IAR Embedded Workbench 7.11.1 (文件位置类似于:[蓝牙堆栈安装文件夹]\MSP430_Experimentor\samples\SPPDemo\SPPDemo.c)

当应用程序运行时、您必须键入"client"或"server"才能进入其中一个菜单。 之后、可以通过键入"flash 1"来测试组擦除、此时会显示"Flash tested 1乘以 ok"。 为了验证操作、测试以100作为参数("FLASH 100")运行、因此闪存组应擦除100次。 虽然我们可以从该测试中预期闪存组擦除函数运行100次并显示"Flash Tested 100次正常"、但器件会复位并重新启动。

请帮我解决这个问题、因为我找不到这个问题的根源。

此致、提前感谢您、
Leon

e2e.ti.com/.../SPPDemo.c

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

    您好、Leon、

    您能否在闪存擦除测试期间使用示波器测量电路板上的 VCC? 反复调用 FlashEraseBank 函数有可能导致 VCC 下降至足够低的水平来引起一个复位。

    您还可以在代码主函数的开头添加以下代码结构、并在调试期间添加断点以测试到底是什么导致复位:

    switch (__evo_in_range (SYSRSTIV、SYSRSTIV_PMMKEY)){
    案例 SYSRSTIV_NONE: /*无中断挂起*/
    _no_operation();
    中断;
    案例 SYSRSTIV_BOR: /* SYSRSTIV:BOR */
    _no_operation();
    中断;
    案例 SYSRSTIV_RSTNMI: /* SYSRSTIV:RST/NMI */
    _no_operation();
    中断;
    案例 SYSRSTIV_DOBOR: /* SYSRSTIV:执行 BOR */
    _no_operation();
    中断;
    案例 SYSRSTIV_LPM5WU: /* SYSRSTIV:端口 LPM5唤醒*/
    _no_operation();
    中断;
    案例 SYSRSTIV_SECYV: /* SYSRSTIV:安全违规*/
    _no_operation();
    中断;
    案例 SYSRSTIV_SVSL: /* SYSRSTIV:SVSL */
    _no_operation();
    中断;
    案例 SYSRSTIV_SVSH: /* SYSRSTIV:SVSH */
    _no_operation();
    中断;
    案例 SYSRSTIV_SVML_OVP: /* SYSRSTIV:SVML_OVP */
    _no_operation();
    中断;
    案例 SYSRSTIV_SVMH_OVP: /* SYSRSTIV:SVMH_OVP */
    _no_operation();
    中断;
    案例 SYSRSTIV_DOPOR: /* SYSRSTIV:执行 POR */
    _no_operation();
    中断;
    案例 SYSRSTIV_WDTTO: /* SYSRSTIV:WDT 超时*/
    _no_operation();
    中断;
    案例 SYSRSTIV_WDTKEY: /* SYSRSTIV:WDTKEY 违反*/
    _no_operation();
    中断;
    案例 SYSRSTIV_KEYV: /* SYSRSTIV:闪存密钥违反*/
    _no_operation();
    中断;
    案例 SYSRSTIV_PLLUL: /* SYSRSTIV:PLL 解锁*/
    _no_operation();
    中断;
    案例 SYSRSTIV_PERF: /* SYSRSTIV:外设/配置区域获取*/
    _no_operation();
    中断;
    案例 SYSRSTIV_PMMKEY: /* SYSRSTIV:PMMKEY 违规*/
    _no_operation();
    中断;
    默认值:break;
    } 

    此致、

    Ryan

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

    感谢您的回复。 您必须知道、我花了相当多的时间来找出此问题的根本原因。 电压也是我关注的问题之一。 我在自己的目标板上(以1.9V 运行)测量了这个值、并且电压根本没有下降。 由于在使用自己的硬件时与同行开发人员一起调试这些问题很困难、因此我切换到了一个"了解"开发板。

    我没有在这个开发板上测量电路板电压、但是由于电压要高得多(3.3V)并且最小电压的裕度远高于我自己的电路板、所以我不再怀疑电压源。

    您关于捕获 NMI 触发中断的建议确实非常有用。 当我开始这个问题时、我已经使用 UNMI 和 SNMI 来找到复位源。 然而、令我惊讶的是、我触发了不同的复位源、具体取决于只编译稍微不同的源。 有时、调试器会在0x4处结束(暂停时)、甚至不会传递或触发 SNMI/ UNMI 中断服务例程。

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

    您好、Leon、

    您是否有机会查看 F5438勘误表 、以查看已知问题之一是否与您看到的行为类似? 其中一个闪存勘误表编号可能会影响性能、或者如果仅在 F5438连接到调试器时出现该行为、则可能是其中一个 JTAG 勘误表编号造成的。

    此致、

    Ryan

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

    我知道闪存控制器上的勘误表。 但是、在我自己的电路板上发现了该问题、并填充了 MSP43F5359、似乎没有此勘误表。 此外、我在没有控制台交互的情况下执行了相同的测试、但在循环闪存组擦除时进行 GPIO 引脚切换。 GPIO 被连接至我的示波器来监控闪存组擦除功能。

    GPIO、以便我可以断开调试器。 测试结果相同。 随机次数、它运行正常。 然后、存在完全冻结/挂起。

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

    您好、Leon、

    是否已修改工程的.cmd 文件(链接器文件)以防止闪存组中意外放置的任何代码被擦除? 为了安全起见、您可能还需要在擦除闪存组之前禁用中断、并在闪存库函数中重新启用中断。

    此致、
    Ryan

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

    是的、我的普通应用程序链接器文件已修改、因此无法将应用程序代码放入此部分。 尽管 MSP430用户指南规定"在任何闪存操作期间自动禁用中断。" 正如您所描述的、我自己禁用并重新启用了它们、但它不会改变情况。

    正如我在第一个问题中所述、我使用了所有标准组件:开发板、蓝牙堆栈、演示应用和 mspware 库函数。 为了加快根本原因分析、最好检查您是否可以获得这样一个外交电路板。 这应该可以是 TI 员工:-),也可以是您团队中有人可以为您执行此测试。

    希望很快收到您的表格。
    此致、
    Leon
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Leon、

    我跟踪了 F5438实验板、并将尝试复制您今天看到的内容。 您能否发布更新后的链接器文件以及更新后可用于闪存测试的任何其他文件?

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

    只能对蓝牙堆栈中的默认应用程序执行测试(仅修改了 sppdemo.c)。 其他所有内容都只是默认值。 您可以通过存储器查找、映射文件等方式验证要擦除的存储器组、确保在最后一个闪存组中未放置应用代码。 对于此测试、我没有更改链接器文件、但问题完全相同。

    此致、
    Leon

    P.S.很高兴听到您已经跟踪了实验板。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Leon、

    我还没有幸运地复制到目前为止您看到的行为。 您能否在代码执行期间、在闪存测试运行之前发布以下寄存器值:
    PMMCTL0
    SVSMHCTL
    SVSMLCTL
    PMMRIE

    您能否创建一个在没有蓝牙堆栈的情况下停止看门狗计时器后仅运行 FlashEraseBank 功能的简化应用、并查看器件是否仍然复位?

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

    寄存器值必须等待、因为我目前在另一个位置、但这个问题的关键在于、它与这个堆栈相关、或者至少在闪存中放置代码。 (虽然我不知道原因)。 我已经尝试构建一个简单的应用程序、只需执行组擦除、没有堆栈、我也无法复制行为。

    我认为您也拥有蓝牙模块和开发板。 但是、您也可以安排这个、因为需要运行蓝牙堆栈。

    希望很快收到您的回复、
    此致、
    Leon
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ryan、

    您可以尝试运行随附的代码。 它不需要蓝牙模块、但会保持堆栈就位(很难、我不想返回有效的蓝牙堆栈 ID、但它无效)。 它允许您输入控制台并键入"server"、而不是"flash 100"。 结果是相同的结果。 因此、您只需安装上述蓝牙堆栈、并将 samples"目录中的 SPPDemo.c 文件替换为该文件。 打开 IAR 项目、然后生成并运行。

    此致、

    Leon

    e2e.ti.com/.../3173.SPPDemo.c

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

    您好、Leon、

    由于您提供的代码和测试设置、我能够复制您看到的行为。 在测试了许多可能的根本原因之后、我认为问题是由于反复擦除闪存组所需的电源要求导致的电源线不稳定。 如 MSP430F5438A 数据表中所述、在闪存组擦除期间需要高达11mA 的电流、这会导致 DVCC 上的噪声、从而错误地设置 SVM 低侧标志。

    根据设置了 SVM 低侧标志的勘误表 Flash37、可能会导致闪存读取损坏。 根据对 《MSP430x5xx 和 MSP430x6xx 系列用户指南》的读取、在这些情况下、从闪存中获取0x3FFF 损坏的指令似乎很常见、因为它将从损坏的闪存读取返回或尝试访问无效的存储器地址。 0x3FFF 对应于地址0x4的跳转命令、该命令本身包含0x3FFF、从而导致无限循环。 如果 DVCC 上的噪声足够严重、它也可能会产生您看到的复位。  

    在闪存组擦除之前和之后执行代码以确保电源电压稳定似乎已经解决了这个问题。 随附更新的代码。 请在您的系统中对其进行测试、并告诉我它是否纠正了该行为。

    谢谢、

    Ryan

    e2e.ti.com/.../0250.SPPDemo.c

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

    Ryan、

    感谢您发送给我的代码。 我在开发板上测试了代码、运行正常。 因此、下一步是用这个替换我自己平台中的代码、它不起作用。 它仍然像以前一样崩溃。

    因此、我回到了您在开发板上运行的代码、并进行了一些简单的经验测试。 现在、根据您的电压问题、闪存擦除的进入和退出代码应涵盖电压问题。 但是、这种现象的行为非常奇怪(您可能已经在自己执行的测试中看到)。 在测试期间、对代码进行了一些小改动、而开发板上的代码再次失败。

    我真的不明白为什么、但也许您可以帮我解决问题。 我附加了我在代码中所做的修改、令人惊讶的是、我只添加了一些通常不会造成任何损害的"nop"指令。 我认为,这一问题往往是与缔约国会议的正常行为不一致的问题。

    请告诉我您对它的看法、也许您对这种行为仍有很好的解释。

    此致、
    Leon

    e2e.ti.com/.../4544.SPPDemo.c

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

     Leon、

    当我重新测试您发送的代码时、我确实看到它再次复位。 在代码执行期间获取损坏的闪存指令可能仍会解释这一点、因为用于查看电压电源是否稳定的代码检查仍在闪存中执行、因此我发送的代码可能并非所有情况下都是修复的。

    另一个要尝试的操作是从 RAM 中运行闪存擦除函数、以确保代码在组擦除期间无法从闪存中提取损坏的指令。 附加的代码将组擦除函数从闪存复制到 RAM 并从 RAM 执行。 还有一个更新的链接器文件、用于在闪存和 RAM 的起始地址为函数分配空间、并移动要存储在其上面的地址的其余代码。 文件的更新部分位于代码和常量数据部分的底部。

    可在此 e2e 线程上找到更多从 RAM 运行代码的示例。

    如果这不能纠正系统中的行为、我将开始研究其他根本原因。

    此致、

    Ryan

    e2e.ti.com/.../8055.SPPDemo.c

    e2e.ti.com/.../lnk430f5438a.xcl

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

    您好、Ryan、

    我测试了您发送给我的代码。 首先、我为 IAR 制作了一个链接器文件、因为附加到您的帖子中的链接器文件是来自 CCS 的链接器文件、因为我不会进行错误处理。 将代码复制到 RAM 执行、我以前从未使用过、但似乎可以正常运行、而不会崩溃。

    我采用的代码在我自己的平台上运行、令人惊讶的是、它似乎也运行良好。 所以我们在这里有了很大的胜利:-) 感谢迄今所做的努力。

    然而、我一直在想什么、为什么我在用户手册中或者可能在 MSP Ware 库中没有找到任何这样的内容、因为它没有规定"FlashCtl_eraseBank"函数驻留在 RAM 中? 那么、您能更详细地告诉我、从 RAM 执行代码的具体原因是什么、MSP 获取损坏的闪存指令的原因是什么?

    从我看来、代码也应该能够从闪存运行。 也许您可以告诉我我缺少什么?

    为了完成该帖子、我附加了用于测试的代码。 我回到了原来的情况、唯一的区别是代码被复制到 RAM 中。 此外、为了完成此帖子、还附加了 IAR 链接器文件。

    希望很快收到您的回复、
    此致、Leon

    e2e.ti.com/.../3288.SPPDemo.c

    e2e.ti.com/.../lnk430f5438aRamCopy.zip

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

    我很高兴听到代码修复了该问题! 我在上一篇文章中不小心发布了错误的链接器文件、现在对其进行了编辑、以包含 IAR 的正确链接器文件。

    您看到的行为似乎由勘误表 Flash34详细解释、该勘误表指出组擦除期间的并发闪存读取失败、并通过将代码执行移至 RAM 来修复。 但是、此勘误表适用于系统中的 F5438A、而不是 F5359。 F5359架构已实施修复、以消除此勘误表。

    我们现在正努力在 F5359上重现此问题、以确保出现的问题相同、并且在我们取得更多进展时、我将提供详细信息。

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

    感谢您对此问题所做的努力。 我标记了您的帖子、并将代码放入 RAM 中作为问题的解决方案。 很高兴听到您也在研究 MSP430F5359的问题。

    对于 MSP430F5359设置、知道我以1.8V 的电压运行 MSP 可能很有价值。虽然在我的测试中、我尝试解决此问题、但我也将电路板电压升高到2.0V (由于连接的组件、可能会变得更高)。

    让我与您取得的进展保持联系。 我们对此表示赞赏

    此致、
    Leon