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.

[参考译文] MSPM0G3519:MSPM0G3519 BSL 调用问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1628507/mspm0g3519-mspm0g3519-bsl-invoke-problem

器件型号: MSPM0G3519

大家好!

我尝试做一些看起来非常简单的事情、那就是调用 ROM BSL、然后与其进行通信 UART0 @9600 波特率。  我将按以下步骤执行此操作:

修改用于配置 NVM 的 SYSCFG(通过空工程)以进行以下设置:
启用 BSL
禁用 BSL 调用引脚检查
通过擦除 MAIN 和 NONMAIN 存储器刷写这个空的 SYSCFG 项目
通过擦除主内存刷新我的业务逻辑固件
在固件中调用 BSL 以进行固件更新
通过固件更新软件与调用的 ROM BSL 交互

我遇到的问题是 UART BSL 调用示例在上述步骤中可以正常工作。  我可以通过 Windows 测试 BSL 软件连接和解锁引导加载程序。  但是、将调用函数(下图所示的 invokeBSLAsm)复制到实际固件中似乎会调用 BSL、但它不会响应任何命令。  我真的可以在这里使用一些帮助、因为我完全陷入困境、不知道如何继续。  我已研究 TI MSPM0 引导加载程序文档 (slau887a.pdf)。  我还将分析器捕获的 UART 数据附加到 BSL 中/从 BSL 捕获的工作 TI 示例和失败应用程序。 提示:“来自 BSL“行在工作示例中的 BSL 调用时变为低电平、而在我无法正常工作的固件中保持高电平。  奇怪的是、在工作的 TI 示例中、似乎需要两次连接尝试(标记为 1 和 2)来连接到 BSL、第一次尝试“唤醒“BSL、第二次尝试 BSL 连接命令来获得响应。  请帮助、因为我完全陷入困境。

(缩小视图以显示调用,连接 1 和连接 2>

image.png

(放大图为 1 和 2)

image.png

image.png

image.png

_static_inline void invokeBSLAsm (void)


  /*在跳转到 BSL 之前完全擦除 SRAM */
  _asm (
#if defined (__GNUC__)
    “.syntax unified\n“/*加载 SRAMFLASH 寄存器*/
#endif
    “LDR  R4、= 0x41C40018\n“/*加载 SRAMFLASH 寄存器*/
    “LDR  R4、[R4]\n“
    “LDR  R1、= 0x03FF0000\n“/* SRAMFLASH.SRAM_SZ MASK */
    “和  R4、r1\n“      /*获取 SRAMFLASH.SRAM_SZ */
    “LSR  R4、R4、#6\n“/*   SRAMFLASH.SRAM_SZ 至 KB *
#if SRAM_ECC_PRESENT
    “LDR  R1、= 0x20300000\n“/* ECC 代码的起始*/
    “添加  R2、R4、r1\n“/*   ECC 代码结尾*/
    “MOV  r3、#0\n“
    “init_ecc_loop:\n“/*循环以清除 ECC 代码*/
    “STR  R3、[R1]\n“
    “添加  R1、R1、#4\n“
    “CMP  R1、R2\n“
    “Blo  init_ecc_loop\n“
    “LDR  R1、= 0x20200000\n“/*非 ECC-DATA 的开始*/
    “添加  R2、R4、r1\n“/*   非 ECC-data 的末尾*/
    “MOV  r3、#0\n“
    “init_data_loop:\n“/*循环清除 ECC-data */
    “STR  R3、[R1]\n“
    “添加  R1、R1、#4\n“
    “CMP  R1、R2\n“
    “Blo  init_data_loop\n“
#endif
    /*在清除 SRAM 后强制调用 BSL */
    “str  %[resetLvl]、[%[resetLvlAddr]、#0x00]\n“
    “STR  %[resetCmdVal]、[%[resetCmdAddr]、#0x00]“
    :/*无输出*/
    :[ resetLvlAddr ]“r"(&Sysctl->SOCLOCK.RESETLEVEL),“,</s>、
    [ resetLval ]“r"(“(DL_SYSCTL_RESET_Bootloader_entry)、
    [ resetCmdAddr ]“r"(“(&SysCtl->SOCLOCK.RESETCMD)、
    [ resetCmdVal ]“r"(</s>“
      SYSCTL_RESETCMD_KEY_VALUE | SYSCTL_RESETCMD_GO_TRUE)
    :“R1",“,"R2"、"R2",“,"R3"“"R3",、,"R4"“"R4")“);、;</s>“ “
}

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

    更新:

    我可以成功使用 TI BSL 调用示例项目中的 invokeBSLAsm () 函数*但它附带了一些我想了解的奇怪限制/限制。  首先,我必须将它作为我在 main() 中所做的绝对第一件事。  如果我调用任何其他函数或事件、像局部变量那样将某些内容推到堆栈上、引导加载程序会调用但不会响应任何命令、甚至不会响应诸如 connect 等未解锁的命令  第二个问题是我必须在固件从 START_APP BSL 命令启动后进行 POR 复位、否则系统中似乎有一些奇怪的东西在发生、例如 UART RX 不工作等  

    内部 main (void)
    {    
      静态 uint8_t reason = static_cast (sysctl->SOCLOCK.RSTCAUSE 和 SysCtl_RSTCAUSE_ID_MASK);
      IF(原因== SYSCTL_RSTCAUSE_ID_SYSBSLENTRY)
      {
           invokeBSLAsm();
      }
    ...