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.

[参考译文] MSPM0G3507:BIM 与辅助 BSL 一起使用

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1656611/mspm0g3507-bim-together-with-secondary-bsl

器件型号: MSPM0G3507

您好!

我目前正在集成 BIM 和辅助 BSL、合并所有组件后会遇到问题。

存储器布局

我的内存分配如下所示。

memory.png

软件流程

  1. 使用 BIM 演示执行 DFU 以管理引导过程。
  2. BIM 在上电后正确启动。
  3. BIM 成功选择并启动最新的应用程序映像。
  4. 应用程序正常运行。
  5. 然后、应用程序调用辅助 BSL。

在集成之前、每个元件都经过独立测试并正常工作:

  • BIM
  • 应用程序映像
  • 辅助 BSL
  • BSL 主机通信

问题

将所有内容集成在一起后:

  • MCUboot 正确引导。
  • 应用程序正常启动。
  • 应用程序跳转到辅助 BSL。
  • 但是、与 BSL 主机的通信不再正常工作。

为了进行调试、我在没有专用工程的情况下将辅助 BSL 符号加载到调试器中。 调试器在以下情况下停止:

  • Default_Handler
  • NMI_Handler
  • Bild.png

这表明跳转到辅助 BSL 后正在发生异常或中断。

问题

  1. 什么可能导致辅助 BSL 进入 Default_Handler NMI_Handler 应用程序或从应用程序调用后进入?  
  2. 将 MCUboot 与辅助 BSL 集成时、是否有人遇到类似的问题?

如果您对接下来要检查的内容有任何建议、我们将不胜感激。

谢谢。

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

    您好 zq、

    从应用程序调用辅助引导加载程序时、是否考虑了 MSPM0G3507 勘误表中的 BSL_ERR_01?

    此致、
    Brian

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

    您好、Brian、

    我检查了 BSL_ERR_01、它似乎与我的用例不匹配。 在这种情况下、BSL 调用失败、因为汇编代码未完全清除 SRAM。

    我已经添加了基于 MSPM0 SDK 2.10.00.04 的 SRAM 清除例程。

    以下是我的软件调用代码:

    #ifndef BSL_INVOKE_H
    #define BSL_INVOKE_H
    
    #include "ti_msp_dl_config.h"
    
    /**
     * @brief Invoke BSL (Bootstrap Loader).
     * @note This function erases SRAM and triggers a system reset to enter BSL mode.
     * @warning This function does not return; the system will reset.
     */
    static inline void invokeBSLAsm(void)
    {
        /* Erase SRAM completely before jumping to BSL */
        __asm volatile(
    #if defined(__GNUC__)
            ".syntax unified\n" /* Load SRAMFLASH register*/
    #endif
            "ldr     r4, = 0x41C40018\n" /* Load SRAMFLASH register*/
            "ldr     r4, [r4]\n"
            "ldr     r1, = 0x03FF0000\n" /* SRAMFLASH.SRAM_SZ mask */
            "ands    r4, r1\n"           /* Get SRAMFLASH.SRAM_SZ */
            "lsrs    r4, r4, #6\n"       /* SRAMFLASH.SRAM_SZ to kB */
            "ldr     r1, = 0x20300000\n" /* Start of ECC-code */
            "adds    r2, r4, r1\n"       /* End of ECC-code */
            "movs    r3, #0\n"
            "init_ecc_loop: \n" /* Loop to clear ECC-code */
            "str     r3, [r1]\n"
            "adds    r1, r1, #4\n"
            "cmp     r1, r2\n"
            "blo     init_ecc_loop\n"
            "ldr     r1, = 0x20200000\n" /* Start of NON-ECC-data */
            "adds    r2, r4, r1\n"       /* End of NON-ECC-data */
            "movs    r3, #0\n"
            "init_data_loop:\n" /* Loop to clear ECC-data */
            "str     r3, [r1]\n"
            "adds    r1, r1, #4\n"
            "cmp     r1, r2\n"
            "blo     init_data_loop\n"
            /* Force a reset calling BSL after clearing SRAM */
            "str     %[resetLvlVal], [%[resetLvlAddr], #0x00]\n"
            "str     %[resetCmdVal], [%[resetCmdAddr], #0x00]"
            : /* No outputs */
            : [ resetLvlAddr ] "r"(&SYSCTL->SOCLOCK.RESETLEVEL),
              [ resetLvlVal ] "r"(DL_SYSCTL_RESET_BOOTLOADER_ENTRY),
              [ resetCmdAddr ] "r"(&SYSCTL->SOCLOCK.RESETCMD),
              [ resetCmdVal ] "r"(SYSCTL_RESETCMD_KEY_VALUE | SYSCTL_RESETCMD_GO_TRUE)
            : "r1", "r2", "r3", "r4");
    }
    
    #endif /* BSL_INVOKE_H */

    在我的情况下、软件调用似乎成功。 但是、在跳转到 BSL 之后、设备最终会进入 Default_Handler 或 NMI_Handler。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 zq、


    由于调试器在 Default_Handler 和 NMI_Handler 中都会停止、因此了解哪一个会有所帮助
    实际上,被捕捉到 — 它们指向不同的根本原因。

    对于 NMI_Handler:SYSCTL IIDX 寄存器将指示触发了哪个 NMI 源。 下面的两个图显示了
    可能的源 — 根据这些检查 SYSCTL IIDX、以确定触发它的事件。

    对于 Default_Handler:您已在辅助 BSL 中启用哪些外设、以及您是否有处理程序
    每个人? 如果应用在跳转到 BSL 和之前留下任何外设存在挂起的中断
    BSL 的矢量表不涵盖这些内容、执行将进入 Default_Handler。 逐个讲解每个外设
    用于查找未处理的中断的 IIDX 寄存器。

    此致、
    Brian

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

    您好、Brian、

    感谢您的有用提示。
    问题是 NMI SRAM ECC 错误;我在下面附上了屏幕截图。

    但是、我在进入 BSL 之前已经清除 SRAM。 在调试过程中、我检查了 0x20200000、并且 清除了 20300000 ist。 这是我的 BSL 调用代码

    #ifndef BSL_INVOKE_H
    #define BSL_INVOKE_H
    
    #include "ti_msp_dl_config.h"
    
    /**
     * @brief Invoke BSL (Bootstrap Loader).
     * @note This function erases SRAM and triggers a system reset to enter BSL mode.
     * @warning This function does not return; the system will reset.
     */
    __attribute__((optnone, noinline))
    static void invokeBSLAsm(void)
    {
        /* Erase SRAM completely before jumping to BSL */
        __asm(
    #if defined(__GNUC__)
            ".syntax unified\n" /* Load SRAMFLASH register*/
    #endif
            "ldr     r4, = 0x41C40018\n" /* Load SRAMFLASH register*/
            "ldr     r4, [r4]\n"
            "ldr     r1, = 0x03FF0000\n" /* SRAMFLASH.SRAM_SZ mask */
            "ands    r4, r1\n"           /* Get SRAMFLASH.SRAM_SZ */
            "lsrs    r4, r4, #6\n"       /* SRAMFLASH.SRAM_SZ to kB */
            "ldr     r1, = 0x20300000\n" /* Start of ECC-code */
            "adds    r2, r4, r1\n"       /* End of ECC-code */
            "movs    r3, #0\n"
            "init_ecc_loop: \n" /* Loop to clear ECC-code */
            "str     r3, [r1]\n"
            "adds    r1, r1, #4\n"
            "cmp     r1, r2\n"
            "blo     init_ecc_loop\n"
            "ldr     r1, = 0x20200000\n" /* Start of NON-ECC-data */
            "adds    r2, r4, r1\n"       /* End of NON-ECC-data */
            "movs    r3, #0\n"
            "init_data_loop:\n" /* Loop to clear ECC-data */
            "str     r3, [r1]\n"
            "adds    r1, r1, #4\n"
            "cmp     r1, r2\n"
            "blo     init_data_loop\n"
            /* Force a reset calling BSL after clearing SRAM */
            "str     %[resetLvlVal], [%[resetLvlAddr], #0x00]\n"
            "str     %[resetCmdVal], [%[resetCmdAddr], #0x00]"
            : /* No outputs */
            : [ resetLvlAddr ] "r"(&SYSCTL->SOCLOCK.RESETLEVEL),
            [ resetLvlVal ] "r"(DL_SYSCTL_RESET_BOOTLOADER_ENTRY),
            [ resetCmdAddr ] "r"(&SYSCTL->SOCLOCK.RESETCMD),
            [ resetCmdVal ] "r"(
                SYSCTL_RESETCMD_KEY_VALUE | SYSCTL_RESETCMD_GO_TRUE)
            : "r1", "r2", "r3", "r4");
    }
    
    #endif /* BSL_INVOKE_H */
    

    我怀疑它可能与编译器优化相关(例如,-Oz)、因此我添加了一些更改、以防止编译器优化 SRAM 清除例程。 不幸的是、问题仍然存在。  

    是否有其他可能导致此问题的原因可能会导致我忽视?

    此致、
    zq

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

    您好 zq、

    BSL 调用代码正确。 在我们的辅助 BSL 示例中、发现 SRAM 起始地址为 0x20000000、但应该为 0x20200000:

    能否检查所有工程的链接器以确保 SRAM 从 0x20200000 开始?

    此致、
    Brian

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

    您好、Brian、

    感谢您的答复。

    我昨天也找到了这个问题。 我想我从演示中错误地复制了链接器文件。  现在一切都正常。  Grinningμ s

    谢谢、

    zq