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.

[参考译文] MSP432P401R:软件 BSL 调用不响应主机

Guru**** 2535250 points
Other Parts Discussed in Thread: MSP432WARE

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/627354/msp432p401r-software-bsl-invocation-not-responding-to-host

器件型号:MSP432P401R
主题中讨论的其他器件: MSP432WARE

现在,我正在尝试测试软件 BSL 调用,它似乎无法正常工作(使用 MSP432P401R 红色开发板)。 我使用的配置与本文中的配置完全相同: https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/495521 

SLAU622E 文档的第4.3节 BSL 调用中、介绍了如何通过三种不同的方式调用 BSL。 我可以告诉大家、第一种方法(当存储器被擦除时)起作用。 我正在使用 BSL-Scripter.exe 和 P4xx_UART 来闪烁 LED 指示灯,它可以正常工作。  

现在,对于第二种方法(使用软件 BSL 调用),我想使用 GPIO 中断调用 BSL:

BSL_Invoke (((uint32_t) BSL_default_param);//使用给定的 BSL 参数调用 BSL

然后,我尝试使用相同的应用程序(BSL-Scripter.exe)与相同的脚本,但失败(UART 通信失败)

我添加了逻辑分析仪、以查看 UART 通信发生了什么情况。 当我使用 BSL 并擦除存储器时、我可以看到两者之间的通信。 但是、当我使用软件 BSL 调用时、uC 没有响应识别波特率的请求(主机正在发送0xFF 消息、但器件没有响应)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我目前正在使用开发板上的 LED 对其进行调试。

    到目前为止、我发现我产生的 SysTick 中断(切换蓝色 LED)仅适用于已擦除的存储器部分 BSL 调用、而不适用于软件 BSL 调用。

    通过查看 SysTick 寄存器、我可以看到 SysTick 正在计数、但从未发生中断。 我认为在软件 BSL 期间、所有外设中断都无法启用? 中断矢量是否正确放置?

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

    您是否正在尝试从 TI RTOS 中的任务内部调用软件 BSL?

    如果是这种情况、请查看以下文章 :e2e.ti.com/.../2243461

    如果没有、您能否告诉我您正在运行的是哪个版本的 BSL?? 您可以使用命令"TX_BSL_VERSION_32"

    谢谢、

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

    我从闪烁 LED 示例开始,并在端口1 PIN1上添加了一个 GPIO 中断,以调用软件 BSL:

    /* GPIO ISR */
    空 Port1_IRQHandler (空)

      uint32_t status;

      STATUS = MAP_GPIO_getEnabledInterruptStatus (GPIO_PORT_P1);
      MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、状态);

      /*切换 LED 上的输出*/
      IF (STATUS & GPIO_PIN1)
      {
        MAP_Interrupt_disableMaster();
        BSL_Invoke (BSL_DEFAULT_Param);//使用给定的 BSL 参数调用 BSL

      }

     

    `m BSL `m、I θ 使用 MSP432BSL_1_00_01_00中的版本0000.0003.0007.0205.000A、我修改了一个位以便能够使用 LED 进行调试(例如:I θ 使用 RGB LED (P2.0/2.1/2.2)来了解内存擦除 BSL 调用和软件 BSL 调用之间的差异)。 我`m MSP432Ware_3_50_00_02中提供的 Program_MSP432_BSL.bat 来刷写 BSL、该 MSP432Ware_3_50_00_02使用 DSLite.exe 进行刷写。

    我还尝试将 NVIC 寄存器复位为0xFFFF 并添加延迟、但仍然无法正常工作。

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

    您好!

     请尝试以下操作:

    /* GPIO ISR */
    void Port1_IRQHandler (void)
    {
    uint32_t status;
    
    STATUS = MAP_GPIO_getEnabledInterruptStatus (GPIO_PORT_P1);
    MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、状态);
    
    /*切换 LED 上的输出*/
    IF (STATUS & GPIO_PIN1)
    {
    MAP_Interrupt_disableMaster();
    
    NVIC->icer[0]= 0xFFFF;
    NVIC->ICPR[0]= 0xFFFF;
    
    NVIC->icer[1]= 0xFFFF;
    NVIC->ICPR[1]= 0xFFFF;
    
    BSL_Invoke (BSL_DEFAULT_Param);//使用给定的 BSL 参数调用 BSL
    }
    }
    

    希望这对您有所帮助。

     David

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

    正如我在前一篇文章中所说的、我尝试了该代码、但它 仍然不起作用。

    为了确保您了解我在之前的帖子中所说的内容,我将重新解释一下:

    在 BSL 源代码项目(BSL432_MSP432P401x 版本0000.0003.0007.0205.000A)中,我添加了一个 SysTick 中断函数,以便在每次调用中断时使蓝色 LED 闪烁(使用 MAP_SysTK_registerInterrupt 函数)。 此外、我激活了_debug 预定义以激活 P1.0红色 LED、在我可以使用 BSL-scripter.exe 向闪存发送新代码的时间内、它会在10秒内亮起。

    当存储器被擦除时、BSL 随后被载入我所做的"修改的" BSL。 我可以看到 P1.0红色 LED 亮起10秒 此外、由于我添加了 SysTick 中断、蓝色 LED 闪烁。 然后、我使用 BSL-Scripter 来刷写新代码(使用 GPIO 中断 P1.1来调用 BSL 软件、如上一帖子中所示)。 BSL-Scripter 会成功进入"Rx_data_block_32 .\GPIO_toggle_output.txt"。 然后、我可以看到红色 LED 闪烁、表示软件已清楚地刷写到器件中。 下图显示了主机 PC 和 MSP432之间的通信。

    然后、我按下 P1.1按钮来调用软件 BSL。 我可以看到 P1.0红色 LED 停止闪烁、并将打开10秒 但是、由于 SysTick 中断、我看不到蓝色 LED 切换(正如我在前面的文章中所说的、中断似乎未正确启用或被调用)。 我使用调试器来查看 SysTick 计数寄存器是否发生了变化(这意味着 SysTick 确实在计数还是没有计数)、它是否正常工作。 我仍然尝试启动相同的 BSL-scripter.exe 以发送相同的新代码、但器件不响应"模式 P4xx UART 115200 COM3奇偶校验"命令。 然后、P1.0红色 LED 关闭(10秒后)。 如下图所示、主机 PC 发送命令0xFF (用于器件的自动波特率检测)、但器件不对其做出n`t μ s 的响应。

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

    这是由于存储器被擦除而调用 BSL 时 BSL-scripter.exe 的结果:

    现在,这是我使用完全相同的 BSL-scripter.exe 所得到的,但当软件调用 BSL 时:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    目前是否有解决方案?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否看到工厂 BSL 的行为相同?

    请您与我分享您的项目(修改的 BSL 和带有软件调用的应用)、以便我可以尝试重现问题。

    谢谢、

    David
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于 BSL0000.0003.0007.0205.000A 和 BSL0000.0003.0006.0203.0008版本、与 Factory BSL 行为相同

    我n`t 弗兰克·沃尔泽向您发送项目、因为我无法通过论坛了解如何共享项目。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此时不需要您的项目、我能够在我的身边重现此问题、并且正在进行调试。 我会在找到解决方法后立即将其发布。

    谢谢、

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

    调用 BSL 时、NVIC IABR 寄存器(在 ISR 执行期间处于活动状态)不会被清除、它会导致此行为、因此 您需要在 ISR 上下文之外调用 BSL、如下所示:

    volatile bool jumpToBsl = false;
    
    int main (void)
    {
    /*停止看门狗*/
    MAP_WDT_A_HOLDTimer();
    
    MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);
    
    /*将 P6.7配置为输入并启用中断*/
    MAP_GPIO_setAsInputPinWithPullDownResistor (GPIO_PORT_P6、GPIO_PIN7);
    MAP_GPIO_interruptEdgeSelect (GPIO_PORT_P6、GPIO_PIN7、GPIO_HIGH_TO_LOW_TRANSITION);
    MAP_GPIO_clearInterruptFlag (GPIO_PORT_P6、GPIO_PIN7);
    MAP_GPIO_enableInterrupt (GPIO_PORT_P6、GPIO_PIN7);
    MAP_Interrupt_enableInterrupt (INT_PORT6);
    MAP_Interrupt_enableMaster();
    
    while (1)
    {
    MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);
    _DELAY_CYCLES (2000000);
    
    IF (跳转至 Bsl)
    {
    jumpToBsl = false;
    
    MAP_Interrupt_disableMaster();
    
    NVIC->icer[0]= 0xFFFF;
    NVIC->ICPR[0]= 0xFFFF;
    NVIC->icer[1]= 0xFFFF;
    NVIC->ICPR[1]= 0xFFFF;
    
    (((void (*)()) BSL_Entry_function)((uint32_t) BSL_Param);//使用给定的 BSL 参数调用 BSL
    }
    }
    
    
    void PORT6_IRQHandler (void)
    {
    uint32_t status;
    
    STATUS = MAP_GPIO_getEnabledInterruptStatus (GPIO_PORT_P6);
    MAP_GPIO_clearInterruptFlag (GPIO_PORT_P6、状态);
    
    /*切换 LED 上的输出*/
    IF (STATUS & GPIO_PIN7)
    {
    jumpToBsl = true;
    }
    } 

    我们将更新文档以反映这一点。

     感谢您的耐心等待。

      David

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