器件型号: 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>

(放大图为 1 和 2)



_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>“ “
}