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.

[参考译文] MSP430F5526:RAM BSL 未将应用程序代码写入闪存

Guru**** 2538950 points
Other Parts Discussed in Thread: MSP430F5526, MSPBSL

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/679783/msp430f5526-ram-bsl-is-not-writing-application-code-to-flash

器件型号:MSP430F5526
主题中讨论的其他器件: MSPWAREMSPBSL

我们有一个使用 MSP430F5526的小型 USB 传感器。 我们依靠引导加载程序对新电路板进行编程、并在需要时更新固件。 我们的程序使用引导加载程序示例代码中提供的 python 源代码(通过一些修改来修复一些时序问题)。 我们已将这些产品投入生产大约3年、没有任何问题。 最近、应用程序未成功写入闪存。 初始化出厂 BSL 有效、写入 RAM BSL 有效、重新枚举到 RAM BSL 有效、RAM BSL 似乎接受发送给它的命令、没有问题。 如果我发送不受支持的命令、例如 TX_DATA_BLOCK、它会针对未知命令使用正确的错误代码7进行响应。但是出于任何原因、闪存存储器都不会被写入。 是否有人曾看过或知道如何解决此问题?

了解 MSP430 USB 固件升级示例 v1.3.1输出如下可能会有所帮助:

发送 RAM BSL v00.07.08.38
已完成 RAM BSL v00.07.08.38
USB 设备已拔下!
启动 BSL 失败。 正在重新启动。
USB 设备已拔下!

但是、我们的自定义脚本在启动 RAM BSL 时似乎没有问题。 我认为这是因为我们在 RAM BSL 被写入后为重新枚举分配了额外的时间。 我还尝试了较新版本的 RAM BSL v00.08.08.38、结果相同。

 

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

    您好 Jason、

    您是否确实通过在更新后读回内容来验证闪存是否未被写入?   您可以使用 MSP430Flasher 工具读回存储器内容。

    为了澄清一下、MSP430 USB 固件升级示例 v1.3.1工具是定制的还是 基于 python 的工具?   从 TI 网站下载的 MSP430 USB 固件升级示例 v1.3.1不是基于 Python 的、因此我在这里有点困惑。  

    还可以发送 MSP430 USB 固件升级示例 v1.3.1工具中列出的整个输出吗?  它应该具有如下内容:

    启动

    发生批量擦除!

    密码发送成功

    发送 RAM BSL v00.07.08.38

    已完成 RAM BSL v00.07.08.38

    发送闪烁 LED 代码

    固件已发送

    已成功验证内存

    总编程时间为93ms

    如果您没有看到写入的闪存、您可以检查以下几项:

    1) 1)您是否发送了正确的密码?

    2) 2)您是否写入了字节边界?  这可能不会导致您指出的问题、但可能值得检查。

    此致、

    Arthi

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

    感谢您的回复 Arthi

    [引用 user="Arthi Bhat1">为了澄清一下、MSP430 USB 固件升级示例 v1.3.1工具是自定义的 还是基于 Python 的工具?   [/报价]

    它是对基于 Python 的工具的定制、我在 MSPWare_3_20_00_37\usblib430\Host_USB_Software\PYTHON_Firmware_Upgradeer\python MSP430-tools 中找到了该工具

    [引用 user="Arthi Bhat1">]您是否确实验证了闪存是否在更新后读回内容而未被写入?   [/报价]

    是的、我已经使用 Lite FET-Pro430 工具读回存储器、它全部为0xFF、除了信息存储器段和引导加载程序区域中的几个字节、从0x1000开始。  

    [引用 user="Arthi Bhat1"]是否还可以发送 MSP430 USB 固件升级示例 v1.3.1工具中列出的整个输出?\

    这是整个输出。

    启动
    密码发送成功
    发送 RAM BSL v00.07.08.38
    已完成 RAM BSL v00.07.08.38
    USB 设备已拔下!
    启动 BSL 失败。 正在重新启动。
    USB 设备已拔下!

    它也针对 Blinky 示例代码执行此操作。

    1)您是否发送了正确的密码?

    密码最初发送不正确、为30字节的0xff 和2字节的0x00、以触发闪存的整体擦除。 之后、发送32个字节的0xff 密码并接受该密码、不会出现错误。

    2)您是否正在写入字节边界?  [/报价]

    我不知道写入字节边界意味着什么。 但我要写入的起始地址是0x4400、并且有19898字节的应用程序代码。 我还在向地址0xcd2写入46个字节的数据、我认为这是复位矢量。

    其他要添加的内容。 我们遇到的问题并非始终存在/每个电路板都存在。 事实上,上星期我们建立了25个,其中没有一个有任何问题。 本周我们又累积了25个、每一个都有问题。 使用了相同的制造员工、工作站、程序、批量电路板、甚至 USB 端口。 它已经关闭了一个月了,虽然它并不总是一个批次好,一个批次坏了。 有时、小组成员中有10-15件事情是不好的。 换言之、问题是相互交织的、但仅在过去的一个月左右的制造时间中才开始出现。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Jason、
    我不确定发生了什么。 因此、如果工具正确列出了消息、则您在下载固件的过程中拔下了 USB 电缆的工具就像这样。 这是否会导致电路板中出现任何问题、如吸毛? 在出现故障的电路板上、您是否可以再次尝试下载 BSL、它是否可以第二次运行?

    您表示您已更改或添加了一些计时参数。 您可以尝试调整工具下载固件的时间点或发送重新启动命令之前的时间。

    此致、
    Arthi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我仍然可以反复使用相同的电路板、但结果相同。 我们还在编程期间检查了电压电平、以监控电路板是否断电、从而模拟断开连接、但电压电平在整个过程中保持恒定。

    在 python 工具中、我在代码发送加载 PC 0x2504命令后增加了5秒的延迟、在它关闭连接后增加了2秒、然后再次重新打开(大概此时在 RAM BSL 中)。

    我想知道是否是 RAM BSL 未正确启动。 在 slau319中、它表示"闪存中编程且通过 USB 通信的 BSL 只包含命令的子集"、"RX 数据黑色快速、RX 密码和加载 PC"。 如果发送了任何其他命令、BSL 会发回错误代码7、因此结果为 true。 但是、它还指出 RAM BSL 是"全功能 BSL"。 我是否正确地假设 RAM BSL 应响应所有 BSL 内核命令? 如果是这样、则 RAM BSL 要么未正确启动、要么从未实际写入 RAM、因为除了 USB 闪存 BSL 支持的3个命令之外、我无法发送任何命令。 实际上、在提供的 python 工具中、我不得不注释掉请求 BSL_version 的行、因为它返回 unkown 命令错误代码。 由于闪存 BSL 仅为 RAM 写入、因此它与我看到的问题是一致的。

    是否有任何可能导致闪存 BSL 无法正确写入 RAM 的东西?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jason、

    USB RAM BSL 功能齐全、而器件上的 USB BSL 基本上用于加载 RAM 版本。 我想说、您在正确启动 RAM BSL 时遇到问题。 您能否尝试将 BSLScripter 与其中一个 USB BSL 示例结合使用来测试结果?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它似乎起了作用...? 这是日志文件的输出。 我的板没有 LED 可与 Blinky 程序闪烁、但它不再响应 BSL-Scriptor、因此我假设它运行的代码正确。 使用 FET Pro430工具读回存储器确实有新代码写入闪存。


    BSL Scripter 3.3.0
    用于 BSL 编程的 PC 软件
    2018年4月12日13:16:19
    --------------------------------------
    输入文件脚本为:C:/ti/msp430/MSPBSL_Scripter_win/Example/5xx_usb/script_5xx_usb.txt
    ////////////////////////////////////////////////////////////////////////////
    //将 RAM USB BSL 写入器件
    ////////////////////////////////////////////////////////////////////////////
    模式5xx USB
    //提供错误的密码
    //内存中的批量擦除
    RX_PASSWORD pass32_wrong.txt
    阅读 txt 文件:C:\ti\MSP430\MSPBSL_Scripter_win\examples\5xx_USB\pass32_wrong.txt
    [ERROR_MESSAGE]BSL 密码错误!
    RX_PASSWORD pass32_default.txt
    阅读 txt 文件:C:\ti\MSP430\MSPBSL_Scripter_win\examples\5xx_USB\pass32_default.txt
    BSL 密码正确!
    RX_DATA_BLOCK_FAST RAM_BSL_USB.txt
    阅读 txt 文件:C:\ti\MSP430\MSPBSL_Scripter_win\examples\5xx_USB\RAM_BSL_USB.txt
    写入3328字节所需的时间:0.109秒
    数据写入速度:29.81(kb/s)
    SET_PC 0x2504
    延迟3000
    延迟3000ms
    ////////////////////////////////////////////////////////////////////////////
    //启动 RAM USB BSL 应用程序
    //下载闪烁应用程序
    ////////////////////////////////////////////////////////////////////////////
    模式5xx USB
    RX_PASSWORD .\pass32_default.txt
    阅读 txt 文件:C:\ti\MSP430\MSPBSL_Scripter_win\examples\5xx_USB\pass32_default.txt
    BSL 密码正确!
    RX_DATA_BLOCK .\blinkLED_f5529.txt
    阅读 txt 文件:C:\ti\MSP430\MSPBSL_Scripter_win\examples\5xx_USB\blinkLED_f5529.txt
    写入230字节所用的时间:0.023秒
    数据写入速度:9.765(kb/s)
    SET_PC 0x4400

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

    如果您有能力、我会确认是否可以使用逻辑分析仪或示波器切换 P1.0。 话虽如此、如果下载正确、我们可以得出结论、您的硬件和 PC 连接正常。

    您能否在不进行任何修改的情况下重新安装 Python FW 更新器、并查看示例是否也起作用?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    成功! 种类... 我确实能够使用全新安装的 Python FW Updater 来刷写应用程序代码。 我还对其进行了修改、以适应我的 PC 软件、并在那里成功刷写了应用程序代码。 现在、当我尝试从应用程序代码跳转到引导加载程序时、就会出现问题。 同样、以前能够完美地工作的东西不再如此。 这是我用于执行跳转的代码。

    空跳转至 BSL (空)

    TB0CCR0 = 0;
    TB0CTL = 0;

    _disable_interrupt ();
    USBKEYPID = 0x9628; //set key and PID to 0x9628 -> access to
    USBCNF &=~PUR_EN; //断开上拉电阻器-逻辑
    //从主机断开连接
    USBPWRCTL &=~VBOFFIE; //禁用中断 VUSBoff
    USBKEYPID = 0x9600;

    _DELAY_CYCLES (50000);
    (((void (*)() 0x1000)();//调用 BSL


    器件确实会正确断开连接、但随后会使用我的应用程序代码重新枚举、而不是在 BSL 中进行枚举。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jason、

    您能否用以下代码替换函数 jumpToBSL()中的整个代码并查看其是否适合您:

        USB_DISCONNECT ();  //将 PUR 引脚设置为高阻抗(在 USBCNF 中清除 PUR_EN)、禁用
                             // VBUS"要关闭"中断(清除 USBPWRCTL 中的 BVOFFIE)
       USB_disable();      //禁用 USB 模块(在 USBCNF 中清除 USB_EN)和禁用 PLL (清除
                             USBPLLCTL 中的//UPLLEN)。
        //__delay_cycles (2);//如果需要延迟。

        ((void (*)() 0x1000)();  //跳转到 BSL

    此致、

    Arthi

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

    运气差。 它始终在应用程序代码中启动、而不是在 BSL 中启动。 在我调用 BSL 之前、延迟的时间是多少并不重要。 我已经尝试了1个周期、长达5秒、但仍然在应用程序代码中启动。  在 Using_the_BSL.pdf 的第3.8.1节中、它说:

    "TI 建议清除 BSL 应用中使用的任何模块寄存器的配置、
    因为外部应用程序的配置可以中断 BSL 应用程序并产生原因
    意外行为。 一个示例是在 USB BSL 中、Timer_B 模块用于时钟
    初始化。 如果 Timer_B 也在外部应用中使用、这可能会导致 BSL 出现故障
    初始化。 "

    我们使用 Timer A 和 Timer B (我在原始 jumpToBSL 函数中清除它)以及 UCB0进行 SPI 通信。  我们在 XT2上使用一个4MHz 晶振、并且时钟被在8MHz 上初始化。

    此外还提到:

    "存储器位置0x1002包含一个到"BSL 操作"函数的跳转。 调用操作函数、请执行三
    参数。 第一个参数是描述函数的数字、第二个参数是
    简单的已知值、以指示该函数被有意调用。
    R12:函数编号
    R13:0xDEAD
    R14:0xBEEF"

    我认为这不适用于我的情况、但我尝试加载 R13和 R14、但仍然不幸运。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jason、应用代码中的什么启动而不是 BSL? 这是否意味着您无法从主应用程序跳转至位置0x1000?

    应用代码跳转到 BSL 后、器件应处于 BSL 模式、然后您可以使用 Python 固件升级工具下载固件。 下载 FW 后、Python 固件升级工具将对器件进行复位、主应用程序将开始运行。

    此致、
    Arthi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我无法跳转至位置0x1000。 器件与 USB 正确断开连接、但一旦我尝试执行对 BSL 的调用、它会在我的应用程序的 main 中重新启动。 Windows 设备管理器使用我的 USB VID 和 PID 而不是 BSL 0x2047和0x200来识别器件。 我的软件与器件连接并开始正常读取数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的,那么如何从应用程序调用 jumpToBSL()函数呢? 理想情况下、当用户从终端窗口发送提示时、您应该调用它、因为 BSL 更新在更新可用时完成。 收到提示后、您的应用程序应在代码中检查该提示、然后跳转到 BSL。 如果没有该提示、则位于 while 循环中执行它的操作。

    如果没有提示,但 jumpToBSL()是主应用程序的一部分,我相信您会看到当前看到的内容。

    如果您需要一个有关如何与用户交互的示例、那么在 MSP430USBDevelopersPackage 中有一个名为'C1_LedOnOff 的 CDC 示例、您可以修改/浏览以了解这是如何完成的。

    该示例也可以从 CCS 菜单 View->Resource Explorer Classic 下载。

    此致、
    Arthi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我正在等待用户的提示。 如果当前软件检测到传感器固件已过期、则会通知用户并提示用户更新。 或者我们可以手动激活它。 无论采用哪种方式,命令0xAA 0x21都被发送到传感器,传感器随后调用 jumpToBSL();进入 BSL 模式后,我们加载 RAM BSL,然后加载最新的固件。

    该函数被正确调用、但它不会使其进入 BSL 模式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、那么、可能正如您所指出的、计时器是一个问题。 您能否注释掉主应用程序中的计时器、并查看这是否允许代码跳转到 BSL? 如果无法完成此操作、则可以使用 driverlib 中的 API 来停止计时器:

    定时器_A_STOP ()


    Timer B 也应该有一个。 也许您可以在断开并禁用 jumpToBSL()函数中的 USB 之前调用这些 API。

    此致、
    Arthi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我找到了! 计时器未导致问题。 我根本没有尝试初始化它们、尝试不初始化除 USB 之外的任何模块、问题仍然存在。 问题是该中断的最后一行:

    /**====== UNMI_ISR ==== *

    #pragma vector = UNMI_Vector
    _interrupt void UNMI_ISR (void)

    switch (__evo_in_range (SYSUNIV、SYSUNIV_BUSIFG))

    案例 SYSUNIV_NONE:
    __no_operation();
    中断;
    SYSUNIV_NMIIFG 案例:
    __no_operation();
    中断;
    SYSUNIV_OFIFG 案例:
    UCS_clearFaultFlag (UCS_XT2OFFG);
    UCS_clearFaultFlag (UCS_DCOFFG);
    SFR_clearInterrupt (SFR_oscillator_FAULT_INTERRUPT);
    中断;
    案例 SYSUNIV_ACCVIFG:
    __no_operation();
    中断;
    案例 SYSUNIV_BUSIFG:
    //如果 CPU 在 USB 模块的同时访问 USB 内存
    //挂起,可能会出现“总线错误”。 这会生成 NMI。 如果
    // USB 在您的软件中自动断开连接,请设置 a
    //在这里断点并查看执行是否成功。 请参阅
    //编程人员指南以了解更多信息。
    SYSBERRIV = 0;//清除总线错误标志
    USB_disable();//Disable
    USB_enable();
    USB_connect();
    //WDTCTL = 0x1;//无密码的有意写入。 生成 PUC 以复位器件。



    在注释掉这一点后、引导加载程序启动良好! 必须在中断被禁用前调用此函数。 如果这里发生任何情况、我在那里安装它只是为了重置传感器。 我不知道为什么它以前不是问题(可能是、只是没有进行足够彻底的测试)。


    非常感谢您的帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我要感谢您的帮助、因此我将您的最后一个回复标记为"这解决了我的问题"。 再次感谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很快就跟他谈了。 它在 CCS 中调试时起作用,但在其它情况下不起作用。。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在浏览论坛寻找更多想法后、我发现了以下帖子:

    e2e.ti.com/.../2420855

    在将3V3去耦电容器增加到22uF 后、它们现在已从应用代码成功跳转到 BSL。