STM32 BootLoader跳转APP跑飞 可能是因为找不到某些中断函数入口

在做嵌入式产品时,有时为方便更新设备程序(如远程更新或者只更新模块程序等原因),就要用到bootloader对设备进行必要的初始化,引导下载APP等。

STM官网下载的bootloader程序中并没有用到定时器等,很可能遇不到下面的问题。但是小猿猴如我等,会迫不及待的对其进行“魔改”,再经过二手三手,再加上运气不好,下面的问题就很容易暴露出来了:

现象: 

bootloader 下载并跳转某些 app 程序时,app运行正常;

对于某些app来说,却根本跑不起来;  app本身运行没有问题;  bootlaoder+app运行,J-Link在线仿真时,发现报硬件错误;

原因之一:  

bootloader 中开启了某些中断(并编写了中断函数),bootloader结束时未关闭该中断;

但是app程序中没有使用,也没有定义相关中断函数;

 这时系统就会因为找不到中断函数入口而报硬件错误,即app跑飞了.

根源: 

       函数被调用时,系统根据其入口指针,将指令从ROM中加载到RAM中,函数执行完毕后就会释放这一块RAM。即全局变量定义后是存放在RAM中的,但是"函数"是存放在ROM中的,其入口地址(ROM地址)在编程的时候就确定了。

程序下载时,bootloader和app的二进制代码存放在ROM中不同的区域,彼此互不干扰,不会存在函数重定义的问题。作为app来说,会对系统的向量表进行重定位(可搜索查询“向量表重定位”的含义,这里就不说远了),并且是不直接调用bootloader中的某个函数的;但是这时系统已经被初始化了。

典型的如bootlaoder开启了定时器中断(Timer),但是app中没有用到定时器(Timer)更没有定义其中断函数,而已经被初始化了的系统在定时器中断时,会根据已经被重定位了的向量表去查找Timer中断函数,找不到的结果就是报硬件错误了。

当然,bootloader不稳定的原因有很多,如以太网、USB等app更新方式不同,可能的原因也会不尽相同。如果上述方法不能解决您的问题,那么哪天您解决了此问题时,还请分享出来,大家一起进步^^

### STM32 Bootloader 跳转App 的实现方式及注意事项 #### 1. 配置内存布局 为了确保BootLoader能够顺利跳转至应用程序,需合理规划闪存分配。通常情况下,BootLoader占用前16KB的空间(即0x0800_0000~0x0800_4000),而应用代码则放置于其后的区域,例如从0x0800_4000开始[^1]。 #### 2. 设置启动参数 当准备切换执行流给用户程序时,应先调整栈指针(SP)指向目标位置处定义的新堆栈顶部,并设置PC寄存器等于入口函数地址。这些操作可通过读取位于APP区首部的两个字(word)完成——第一个代表初始SP值;第二个则是RESET_Handler的位置,也就是main()之前的重置处理例程起点。 ```c // 假设APP起始于0x08004000 #define APP_START_ADDRESS ((uint32_t)0x08004000) void JumpToApplication(void){ uint32_t jumpAddress; void (*jumpFunction)(void); /* 获取应用程序的初始SP */ __set_MSP(*(__IO uint32_t*)APP_START_ADDRESS); /* 获取应用程序的Reset Handler地址 */ jumpAddress = *(__IO uint32_t*)(APP_START_ADDRESS + 4); jumpFunction = (void(*)(void))jumpAddress; /* 执行跳转 */ jumpFunction(); } ``` #### 3. 关闭所有外设和中断 在进行实际跳跃之前,建议关闭除必要的UART通信接口之外的所有其他硬件资源和服务,尤其是那些可能触发异常响应机制的部分,比如定时器、DMA控制器等。这一步骤有助于减少潜在冲突并提高稳定性[^3]。 #### 4. 使用开发工具辅助下载 对于采用Keil MDK作为IDE环境的情况来说,在各自独立项目里通过菜单选项“Flash->Download”或者快捷键F8来进行固件刷写是一种简便有效的方法[^2]。不过需要注意的是,如果遇到无法自动转入App的问题,则可能是由于某些特定条件未满足所致,此时可尝试手动控制流程或借助仿真器逐步排查原因所在。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值