昨天在更新例程的时候,发现升级完成后,从BOOT跳转到APP过程指示灯异常,升级代码完全没有改动,怎么会跳转失败???我想或许是跳转前的操作有什么问题,直接去看了跳转前的代码,发现跳转前把在上电时开启的外设都关闭了,而我在更新例程的时候确实多开了一个模块。由于升级代码之前由其他人编写,所以对升级流程认知欠缺,一点点积累吧 *-*   *-* 

       在嵌入式系统中,Bootloader(引导程序)跳转至应用程序(App)前关闭所有外设,是为了确保应用程序能够稳定、可靠地启动和运行,避免因外设状态混乱或资源冲突导致系统异常。具体原因如下:

1、避免外设状态残留导致冲突

(1)Bootloader 在运行过程中可能会初始化或使用部分外设(如UART、SPI、GPIO、定时器等),并修改了外设的寄存器配置(如时钟频率、工作模式、中断使能)。

(2)如果状态未清除,APP启动后会继承错误的配置(例如bootloader只用过的uart波特率和APP所需不同),导致外设无法正常工作(通信失败、数据错误)。

2、防止中断和异常干扰APP启动

(1)Bootloader可能开启了某些外设的中断(如timer),若跳转前未关闭,这些中断可能在APP初始化完成前触发,导致程序执行流程被意外打断。

(2)未处理的中断可能导致APP的初始化代码(如全局变量初始化、堆栈配置)执行不完整,最终引发系统崩溃(如HardFault)

3、避免中断冲突导致卡死

     boot中开启的中断(如定时器或串口中断)若未关闭,跳转到app后中断向量表重置,可能导致中断重复触发或无法处理,引发硬件错误或程序卡死在循环中。例如,boot遗留的未清中断标志可能触发app的弱定义中断函数,使系统无法响应。

4、减少初始化逻辑冲突

    app依赖特定硬件初始顺序,若boot的外设未完全失能,app可能跳过关键配置步骤(如中断优先级设置),导致运行时行为混乱。

总结

为了尽可能避免跳转故障,关键操作建议:

(1)关闭外设的顺序:先禁用中断(__disable_irq()),再关闭外设时钟(如RCC_DeInit()),最后清除挂起中断标志。

(2)关闭所有外设时钟和PLL;禁用全局中断并复位 SysTick;清除中断标志位;跳转后由APP重新初始化所需外设。

 

 

 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐