ST意法半导体
直播中

陈燕

7年用户 1084经验值
私信 关注
[问答]

在IAP引导加载程序中使用Jump_To_Application() 时MCU不再位于引导加载程序代码中怎么处理?

ST社区您好!
我正在使用 STM32F417VGT6 在 Keil IDE 中执行 IAP。
在引导加载程序中,使用 SD 卡上的二进制文件,我读取执行的二进制程序并将其写入闪存。然后我使用 Jump_To_Application() 启动新应用程序。一切正常,我们没有遇到任何问题。
这个过程对于 4KB 和 25KB 的二进制文件都没有问题。但是当我尝试加载更重的二进制文件(如 112KB 或 500KB)时,MCU 会重置并且不会发生跳转。重置后,我们从引导加载程序开始。
我用 ST-LINK Utility 仔细检查了 MCU 闪存,我的二进制文件已正确写入正确的地址。
遗憾的是,无法调试,因为 MCU 不再位于引导加载程序代码中。
您可能已经注意到,这是可疑的。据我所知,跳转到一个新程序与该程序的大小无关。
这是我用来执行跳跃的一组代码:
                  JumpAddress = *(uint32_t*) (FLASH_USER_START_ADDR + 4);
                  Jump_To_Application = (pFunction) JumpAddress;
                  跳转到应用程序();  
当然,我确实禁用了我在引导加载程序中启用的几乎所有外围设备和中断。
如果您分享您的解决方案,我将不胜感激。




回帖(1)

陈小红

2023-1-4 09:58:49
问题是由于bootloader的RCC配置和应用程序之间的冲突引起的。当然,在跳转到应用程序之前,您需要重置在引导加载程序中设置的每个 RCC 配置。
使用这些命令:
                  __HAL_RCC_PWR_CLK_DISABLE();
                  HAL_RCC_DeInit();
您可以重置在引导加载程序中设置的每个配置。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分