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.

[参考译文] MSP430FR2311:从应用程序进入时、无法通过 UART 与 BSL 通信

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/992435/msp430fr2311-unable-to-communicate-with-bsl-over-uart-when-entering-from-application

器件型号:MSP430FR2311
主题中讨论的其他器件: Energia

我正在尝试通过 BSL 使 UART 闪存正常工作。 正在使用 MSP430FR2311 Launchpad 执行当前测试。

如果我使用 platformIO/Energia 刷写程序、板载 USB 调试(使用默认 dslite)一切都很好。

如果 I Flash 使用连接到 RX、TX 的 FTDI 转换器、并将 DTS/RTS 连接到 TEST/RST 线路、则使用位于 https://github.com/parezj/BSL430.NET 的实用程序进行刷写操作即可

当我尝试从我的软件应用程序启动 BSL 时、会出现问题。 在主循环(在 Energia/platformIO 中)中、我执行:  

_disable_interrupt (); // 禁用 中断

((void (*)() 0x1000)(); // 跳转 至 BSL
这会终止正在运行的程序、我认为它会跳转到 BSL。 除了闪烁 LED 以告知我应用程序是否正在运行(在执行上述命令后停止)之外、程序中没有发生任何情况。
但是、当我尝试通过 UART 发送 Mass 擦除等简单的 BSL 命令时、我不会从 MSP 获得任何响应。
我在示波器上验证了我的发送数据包是否与 BSL430.NET 实用程序通过 FTDI 发送的数据包相匹配(也可通过 Wireshark 检查)。 但我看不到任何关于我的范围的回复。
我是否遗漏了什么?
我真的不想只为了进入 BSL 而额外运行2行。
我尝试过的内容:
  • 使用 PC 上的终端程序向 BSL 发送命令-无回复
  • 使用微控制器向 BSL 发送命令-有时、我会得到51或54个回复、以发送0x80或完整序列、而不会出现任何问题或原因。
  • 将 CPU 频率从16MHz 更改为8MHz (我在 BSL 用户指南中看到的内容)-无变化
  • 以各种方式更换电线
  • 接地/拉高 TEST 引脚
  • 多台计算机
  • 多个 FTDI 适配器
我没有办法尝试!
谢谢、
Matt

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

    经过大量搜索后、我找到了缺失的部分。  

    我意识到如果我没有启用 Serial.begin (),那么一旦我处于该模式,BSL 将响应串行命令。

    我在这里执行了代码: forum.43oh.com/.../

    它可以正常工作(也可以粘贴在下面、供任何需要答案的人使用。

    现在、我可以使用上面链接的 BSL430.NET 工具通过 UART 上传 FW  

    我还没有弄清楚如何在没有硬复位的情况下跳转到应用程序、但我将在新线程中询问这一点。

        SFRIE1 &= ~OFIE; /* Disable oscillator fault enable interrupt */
        delay(500);
        SYSBSLC &= ~(SYSBSLPE | SYSBSLOFF);
        
        //Playing with clearing timer B to enable timout
        //TBCTL |= TBCLR;

        __disable_interrupt(); /* Ensure no application interrupts occur while in BSL */
        /*
         * This sends execution to the BSL. When execution returns
         * to the user app, it will be via the reset vector, meaning
         * execution will re-start.
         */
         ((void (*)())0x1000)();