为什么在boot跳转app前,要把所有的外设关掉
为了尽可能避免跳转故障,关键操作建议:(1)关闭外设的顺序:先禁用中断(),再关闭外设时钟(如),最后清除挂起中断标志。(2)关闭所有外设时钟和PLL;禁用全局中断并复位 SysTick;清除中断标志位;跳转后由APP重新初始化所需外设。
昨天在更新例程的时候,发现升级完成后,从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重新初始化所需外设。
更多推荐



所有评论(0)