主题中讨论的其他器件:MSPM0G3507、 LP-MSPM0G3507、 UNIFLASH
工具与软件:
请参阅 bsl_software_invoke_app_demo_uart_lp_MSPM0G3507_nortos_ticlang、我们希望将相同的方法复制到
通过 在 G3107上开票 BSLAsm()进入 BSL 模式。 但 MCU 将始终在 G3107上复位(如图所示不能保持在 BSL"等待命令"状态)。
我还尝试 DL_SYSCTL_resetDevice (DL_SYSCTL_RESET_BOOTLOADER_ENTRY)、但也无法正常工作。
请帮助说明通过软件调用在 G3107上进入 BSL 模式的方法。
__static_inline void invokeBSLAsm (void)
{
/*在跳转到 BSL 之前完全擦除 SRAM */
_asm (
#if defined (__GNU__)
".syntax unified\n"/* Load SRAMFLASH register*/
#endif
"LDR R4、= 0x41C40018\n"/*加载 SRAMFLASH 寄存器*/
"LDR R4、[R4]\n"
"LDR R1、= 0x03FF0000\n"/* SRAMFLASH。 SRAM_SZ 掩码*/
"ANDS R4、R1\n"/*获取 SRAMFLASH。 SRAM_SZ */
"LSR R4、R4、#6\n"/* SRAMFLASH。 SRAM_SZ 到 KB */
"LDR R1、= 0x20300000\n"/* ECC-code 的起始*/
"将 R2、R4、R1\n"/* ECC-code 的结尾*/
"MOVs R3、#0\n"
"init_ecc_loop:\n"/*循环清除 ecc-code */
"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 的结束*/
"MOVs 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"
/*清除 SRAM 后强制复位调用 BSL */
"STR %[resetLvlVal]、[%[resetLvlAddr]、#0x00]\n"
"STR %[resetCmdVal]、[%[resetCmdAddr]、#0x00]"
:/*无输出*/
:[ 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");
}