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.
工具与软件:
请参阅 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");
}
默认演示代码是否适用于 bsl_software_invoke_app_demo_uart_lp_MSPM0G3507_nortos_ticlang?
通常、在 MCU 生成复位后、您将失去与 MSPM0的调试器连接。 您如何知道"不能像图示那样保持在 BSL"等待命令"状态?
您正在使用哪个引导加载程序? 默认引导加载程序?
此处是包含引导加载程序简介的文档:https://www.ti.com/lit/an/slaae88c/slaae88c.pdf
尊敬的 EASON:
1.我们使用默认的引导加载程序(基于 ROM 的 BSL)
2.默认演示代码"bsl_software_invoke_app_demo_uart_LP_MSPM0G3507_nortos_ticlang"适用于我们的目标、可通过按键进入 BSL 模式。
3.我们在目标上实现 UART 接口。 因此,我们使用 UART 命令输入 BSL(假定 invokeBSLAsm () works ), 1~2秒
之后、启动消息显示在 UART 控制台上、这就是我认为 MSPM0无法保持在 BSL 状态的原因。
UART 命令代码:
if (strcmp (command、"bsl")=0){
log ("进入 BSL 模式!");
vTaskDelay( pdms_to_ticks( 1000u ));
//DL_SYSCTL_resetDevice (DL_SYSCTL_RESET_BOOTLOADER_ENTRY);
invokeBSLAsm();
while (1){
__ WFI();
}
}
谢谢。
尊敬的 EASON:
我们将在目标上运行 FreeRTOS (freertos_builds_LP_MSPM0G3507_RELEASE_ticlang_2_00_00_03)、这是可行的
不处于 BSL 模式的问题?
谢谢。
不太确定。 下面是一个可以为您提供一些帮助的示例: https://www.ti.com/lit/an/slaaec9/slaaec9.pdf
是否可以在调用 invokeBSLAsm()之前禁用所有中断?
您好、伊森
我尝试使用另一个演示"uart_echo_lp_MSPM0G3507_freertos_ticlang"来检查 BSL 更新是否可以在 FreeRTOS 上运行。
它可以在 LP-MSPM0G3507 EV 套件上使用、但在我们的目标上仍然不起作用。 好消息是系统无法重置、但仍有一些错误消息
加密 Uniflash、如下所示
这意味着什么: {63}{00}?
谢谢。
成功日志:
[2024/9/25下午5:41:12][信息] Cortex_M0P:调用引导加载程序...
[2024/9/25下午5:41:15][INFO] Cortex_M0P:
[2024/9/25下午5:41:15][INFO] Cortex_M0P:BSL 已连接
[2024/9/25下午5:41:15][INFO] Cortex_M0P:命令解释器版本:[0x0100]内部版本 ID:[0x0100]应用版本:[0x000000000000]主动插件接口版本:[0x0001] BSL 最大缓冲区大小:[0x3EC0] BSL 缓冲区起始地址:[0x20000160] BCR 配置 ID:[0x00000x0001] BSL 配置 ID:[0x000001]]
[2024/9/25下午5:41:15][INFO] Cortex_M0P:[80][01][00][19][B2][B8][96][49]
[2d/9/25下午5:41:15][INF] Cortex_M0P:{00}{08}{19}{00}{31}{00}{01}{00}{00}{00}{00}{00}{01}{00}{0}{C0}{60}{01}{00}{20}{00}{00}{00}{00}{00}
错误日志:
1.您可以通过什么操作来使其保持 BSL 模式?
2.您能否使用数字分析器捕捉波形,并将其与正确的波形进行比较? 它比读取 Uniflash 日志更清晰。 这个文档 https://www.ti.com/lit/ug/slau887/slau887.pdf?ts = 1727431097313 将描述该协议。
尊敬的 EASON:
演示应用: bsl_software_invoke_app_demo_uart_lp_MSPM0G3507_nortos_ticlang
我尝试 TI 工具- BSL_GUI_EXE、位置为\ti\mspm0_sdk_2_02_00_05\tools\bsl\
有一个 UART 命令0xbb 我找不到在任何文档@MSPM0_BSL_GUI.py #line321
有没有文档介绍了这些 UART 命令?
UART_S.send_data(ser_port、b"\xbb")
response01 = UART_S.READ_DATA (SER_PORT、1)
问题是、如果我通过按 S2进入 BSL 并在之后执行更新、则它将返回"51"(更新正常)
日志:
找到 MSP COM 端口:COM7
配置 UART:9600波特率、8个数据位(首先是 LSB)、无奇偶校验、1个停止位。
[测试]发送连接包:B'\x80\x01\x00\x12:AD\xde'
[测试]获取响应
[TEST]Get response 51.
MSPM0处于 BSL 模式。
获取器件 ID ...
但如果我等待5秒钟或更长时间、则不会有响应(更新失败)
我认为 BSL 处于"睡眠"状态、并且我尝试重新发送连接包但不起作用(请参阅 TI 文档 slau887 3.1.1.2)
我从 BSL 唤醒器件的方法是否不正确?
谢谢。
我试图发送0xAA ,但仍然无法从设备获得任何响应。
请参阅第11页的 TI 文档 slaaec9:
在开始固件升级过程之前、需要执行以下两个步骤:
1.发送单字节命令0x55来检查应用程序代码执行状态、以便您知道是哪个
应用程序代码需要升级。
2.发送一字节命令0x11以检查引导加载程序状态、如果器件响应0x51、则表示引导加载程序为
处于活动状态、已准备好进行固件升级。 否则、您需要向发送一字节命令0xAA
首先强制引导加载程序从挂起状态进入活动状态
尊敬的 EASON:
FreeRTOS 切换到 BSL 模式的另一个问题似乎无法正常工作
演示应用:uart_echo_lp_MSPM0G3507_freertos_ticlang
NRST-KIT:移除 EV 的 J101跳线
按如下方式修改 TI BSL_GUI、以发送"0x22"进入 BSL、
并修改 UART_ECHO_LP_MSPM0G3507_FreeRTOS 以接收"0x22"、从而执行 invokeBSLAsm ()以进入 BSL
1) 1) EV 套件对 bsl_software_invoke_app_demo_uart 进行了编程后、 可以通过 bsl_gui 更新 FW
2) 2) 当 UART_ECHO_LP_MSPM0G3507_freertos 已编程后、EV 套件即 nOK
diff --git a/MSPM0_BSL_GUI.py b/MSPM0_BSL_GUI.py index 1890657..f8401c6 100644 --- a/MSPM0_BSL_GUI.py +++ b/MSPM0_BSL_GUI.py @@ -29,6 +29,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ +import codecs^M import tkinter from tkinter import * from tkinter.filedialog import * @@ -113,6 +114,14 @@ class Tkinter_app: self.label3 = Label(frame3, text="(Download: Just support UART with XDS110)") self.label3.pack() + ^M + self.button4 = Button(text="Reboot", command=self.reboot_thread)^M + self.button4.pack(side="left")^M + self.button4.place(relx=0.05, rely=0.21)^M +^M + self.label4 = Label(text="(Reboot: Exit BSL mode)")^M + self.label4.pack(side="left")^M + self.label4.place(relx=0, rely=0.26)^M self.rad_button = Radiobutton( frame3, @@ -240,6 +249,8 @@ class Tkinter_app: # print(self.passwordfile) self.textlog.see(END) self.textlog.config(state=DISABLED) + def reboot_thread(self):^M + self.textlog.insert(INSERT, "Device reboot.\n", "normal")^M def downlaod_thread(self): T = threading.Thread(target=self.download, args=()) T.start() @@ -306,8 +317,16 @@ class Tkinter_app: "normal", ) self.textlog.see(END) + UART_S.send_data(ser_port, b"\x22")^M + response_ = UART_S.read_data(ser_port, 10)^M + response_str = codecs.decode(response_, 'hex').decode('utf-8')^M + self.textlog.insert(INSERT, '[test] ' + str(response_str) + '\n', "normal")^M + self.textlog.see(END)^M + ^M UART_S.send_data(ser_port, self.connection_pack) response_ = UART_S.read_data(ser_port, 1) + self.textlog.insert(INSERT, '[test]send connection pack: ' + str(self.connection_pack) + '\n', "normal")^M + self.textlog.insert(INSERT, '[test]get response' + str(response_) + '\n', "normal")^M if self.xds_v.get() == "a": subprocess.run( self.path @@ -325,8 +344,36 @@ class Tkinter_app: encoding='utf-8') # print(type(response)) # print(response) - UART_S.send_data(ser_port, b"\xbb") - response01 = UART_S.read_data(ser_port, 1) + retry = 0^M + retry_times = 1^M + while retry < retry_times:^M + UART_S.send_data(ser_port, b"\x55")^M + response013 = UART_S.read_data(ser_port, 1)^M + self.textlog.insert(INSERT, '[test]get response01(0x55)' + str(response013) + '\n', "normal")^M + UART_S.send_data(ser_port, b"\xbb")^M + response01 = UART_S.read_data(ser_port, 1)^M + self.textlog.insert(INSERT, '[test]get response01(0xbb)' + str(response01) + '\n', "normal")^M + UART_S.send_data(ser_port, b"\x11")^M + response012 = UART_S.read_data(ser_port, 1)^M + self.textlog.insert(INSERT, '[test]get response01(0x11)' + str(response012) + '\n', "normal")^M + if response01 == "51":^M + retry = 0^M + break;^M + else:^M + if retry == retry_times:^M + retry = 0^M + self.textlog.insert(INSERT, "[test] Err: No response<EF><BC><81>\n", "error")^M + self.textlog.see(END)^M + break;^M + retry += 1^M + time.sleep(1)^M + UART_S.send_data(ser_port, self.connection_pack)^M + response_ = UART_S.read_data(ser_port, 1)^M + #self.textlog.insert(INSERT, '[test]send connection pack: ' + str(self.connection_pack) + '\n', "normal")^M + #self.textlog.insert(INSERT, '[test]get response' + str(response_) + '\n', "normal")^M + self.textlog.insert(INSERT, '[test]send uart: 0xaa\n', "normal")^M + UART_S.send_data(ser_port, b"\xaa")^M + ^M # print(response) if response01 == "51": self.textlog.insert( @@ -335,10 +382,12 @@ class Tkinter_app: self.textlog.see(END) UART_S.send_data(ser_port, self.get_ID_pack) response1 = UART_S.read_data(ser_port, 33) + self.textlog.insert(INSERT, '[test]get response1 ' + str(response1) + '\n', "normal")^M self.textlog.insert(INSERT, "Send the password...\n", "normal") self.textlog.see(END) UART_S.send_data(ser_port, self.password_pack) response2 = UART_S.read_data(ser_port, 1) + self.textlog.insert(INSERT, '[test]get response2 ' + str(response2) + '\n', "normal")^M check = self.check_pack(response2) if check: response2 = UART_S.read_data(ser_port, 9) (END)
看起来像是 invokeBSLAsm()在 FreeRTOS 中不起作用、您能帮我们检查一下吗?
谢谢。
有一个 UART 命令0xbb 我找不到在任何文档@MSPM0_BSL_GUI.py #line321
有没有文档介绍了这些 UART 命令?
[报价]很抱歉没有在这样的登录时间内回复您。 对于此问题、请参阅此应用手册:https://www.ti.com/lit/an/slaae88c/slaae88c.pdf?ts = 1730252803725。 它是一个在应用程序代码中调用 BSL 的命令。
重新生成代码时、是否调试了代码并检查它是否执行了 invokeBSLAsm ()?
尊敬的 EASON:
1.可以、我知道"0x22"是一个在 BSL_software_invoke_app_demo_uart 中调用 BSL 的添加命令
但我感到困惑的是 MSPM0_BSL_GUI.py #line321中显示的命令"0xbb"
UART_S.send_data(ser_port, b"\xbb") response01 = UART_S.read_data(ser_port, 1)
2.我的调试日志"ENTER BSL!" 在 BSL_GUI 已发送命令"0x22"时显示、但在 BSL 模式下、BSL_GUI 查询器件没有响应
通过命令 "0xbb"
uart_echo_lp_MSPM0G3507_freertos 我更改了:
a.波特率配置更改为9600
b. uartecho.c 添加命令"0x22"以进入 BSL 模式
--- a/uartecho.c +++ b/uartecho.c @@ -45,6 +45,46 @@ /* * ======== mainThread ======== */ +__STATIC_INLINE 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"); +} + void mainThread(void *arg0) { size_t rdCount = 0; @@ -82,6 +122,17 @@ void mainThread(void *arg0) } } + if (input == 0x22) { + UART_write(uart, "enter BSL!", 10, &bytesWritten); + //vTaskDelay( pdMS_TO_TICKS( 100U ) ); + delay_cycles(1000000); + //DL_SYSCTL_resetDevice(DL_SYSCTL_RESET_BOOTLOADER_ENTRY); + invokeBSLAsm(); + while (1) { + __WFI(); + } + } + bytesWritten = 0; while (bytesWritten == 0) { status = UART_write(uart, &input, 1, &bytesWritten);
谢谢。
中显示的命令"0xbb"但我感到困惑的是 MSPM0_BSL_GUI.py #line321
这只是为了发送一个不是 BSL 封装标头0x80的字节来触发 MSPM0的标头错误(0x51)响应(如果在发送0xbb 后来自 MSPM0的字节0x51响应)、这意味着器件处于 BSL 模式、以便我们稍后可以进行 BSL 操作。
2. 我的调试日志"Enter BSL!" 在 BSL_GUI 已发送命令"0x22"时显示、但在 B 中的 BSL_GUI 查询器件时无响应[/QUOT]我认为您应该对 GUI 进行一些修改、对吧?
原始 GUI 不支持通过软件触发器发送0x22。 但您可以在发送0xbb 之前进行该操作、最好等待一段时间来发送0xbb、该延迟时间可以设置大约300ms。 您身边是否有像 Seleae 这样的逻辑分析仪? 如果需要、最好将 UART 信号直接与我共享以进行分析。
您好、Gary、
感谢您发送0xbb 命令来解释该用途。
是的、我在 GUI 上进行了一些修改、以发送0x22进入 BSL 模式。 只是为了使非 RTOS 和 FreeRTOS 之间的测试条件几乎相同。
我已尝试在发送0xbb 之前添加延迟时间、但仍然没有任何响应。 (0x22 -> 0.5s 延迟->连接包-> 0.5s 延迟-> 0xbb)
我的测试是非 RTOS 和 FreeRTOS、具有相同的 GUI 并在 LP-3507目标板上开发票 BSL 代码
好的:非 RTOS (bsl_software_invoke_app_demo_uart)+ GUI + LP-3507
NG:FreeRTOS (UART_ECHO_LP_MSPM0G3507_freertOS、 使用9600bps 和0x22命令进行修改)+ GUI + LP-3507
谢谢。
您意味着、如果没有 FreeRTOS、您就可以毫无问题地执行该操作。 使用 FreeRTOS 时只会出现问题、对吧?
如果是、您可以参阅 适用于 MSPM0C 的4.3.2.1基于闪存的0x0地址 BSL 演示一节
https://www.ti.com/lit/an/slaae88c/slaae88c.pdf
尤其是下面的评论
您好、Gary、
是、FreeRTOS 刚刚发生软件调用问题(可以进行硬件调用)
请参阅4.3.2.1、但本节看起来适用于 C 系列 MCU (无 ROM)、但不适用于我们用于 MSPM0G3507的 G 系列 MCU (具有 ROM)。
我在 注释中添加了禁用 IRQ 命令、以便在进入 BSL 之前清除 IRQ、但此命令不起作用。
NVIC_ClearPendingIRQ(UART0_INT_IRQn); invokeBSLAsm(); while (1) { __WFI(); }
谢谢。
但本节内容适用于 C 系列 MCU (无 ROM)、但不适用于我们用于 MSPM0G3507
无关紧要、还需要与其他 MSPM0器件一起使用。
它不仅可以清除挂起的 IRQ、还需要禁用所有中断以避免跳转期间出现任何中断。
您好、Gary、
谢谢、它现在可以工作了!