我有多套适配不同 STM32 系列的工程,全部用了自己写的 Bootloader:
Bootloader 存放起始地址 0x08000000,应用程序放在更高地址,常规为 0x08010000。
Bootloader 与应用运行功能均正常:Bootloader 可以正常跳转启动应用,应用也能指令跳转回 Bootloader,这部分无任何问题。
唯一异常是使用 STM32CubeProgrammer 配合 ST-LINK V3 烧录新版应用。
即便勾选Run after programming,烧录完毕单片机也无法正常启动应用。
调试跟踪发现程序卡死在应用代码的无限循环内。
程序卡死的代码位置如下:
0801c444 <HAL_GetTick>:
* implementations in user file.
* @retval tick value
*/
__weak uint32_t HAL_GetTick(void)
{
return uwTick;
801c444: 4b01 ldr r3, [pc, #4] @ (801c44c <HAL_GetTick+0x8>)
801c446: 6818 ldr r0, [r3, #0]
}
801c448: 4770 bx lr
801c44a: bf00 nop
801c44c: 200013f0 .word 0x200013f0
0801c450 <HAL_Delay>:
* implementations in user file.
* @param Delay specifies the delay time length, in milliseconds.
* @retval None
*/
__weak void HAL_Delay(uint32_t Delay)
{
801c450: b538 push {r3, r4, r5, lr}
801c452: 4604 mov r4, r0
uint32_t tickstart = HAL_GetTick();
801c454: f7ff fff6 bl 801c444 <HAL_GetTick>
uint32_t wait = Delay;
/* Add a period to guaranty minimum wait */
if (wait < HAL_MAX_DELAY)
801c458: 1c63 adds r3, r4, #1
{
wait += (uint32_t)uwTickFreq;
801c45a: bf1c itt ne
801c45c: 4b05 ldrne r3, [pc, #20] @ (801c474 <HAL_Delay+0x24>)
801c45e: 781b ldrbne r3, [r3, #0]
uint32_t tickstart = HAL_GetTick();
801c460: 4605 mov r5, r0
wait += (uint32_t)uwTickFreq;
801c462: bf18 it ne
801c464: 18e4 addne r4, r4, r3
}
while ((HAL_GetTick() - tickstart) < wait)
801c466: f7ff ffed bl 801c444 <HAL_GetTick>
801c46a: 1b43 subs r3, r0, r5
801c46c: 42a3 cmp r3, r4
801c46e: d3fa bcc.n 801c466 <HAL_Delay+0x16>
{
}
}
|
|