STM32L452RET6P从Bootloader跳转至应用后中断失效问题排查
STM32L452 Bootloader跳转后应用中断无法触发的排查方向
- NVIC状态未清理:Bootloader启用的TIMER6、UART2中断,跳转前未关闭中断使能、清除中断挂起位。即便应用初始化时重新配置优先级,遗留的挂起状态会导致NVIC无法响应新的中断请求。需在跳转前执行
NVIC_DisableIRQ(TIM6_IRQn)、NVIC_ClearPendingIRQ(TIM6_IRQn),UART2中断做同样处理。 - 全局中断被意外关闭:Bootloader跳转时可能未确保全局中断处于开启状态,或上下文切换导致
PRIMASK/FAULTMASK寄存器置位。应用启动后必须调用__enable_irq()重新开启全局中断,否则所有中断会被屏蔽,仅主循环能正常执行(如LED闪烁)。 - 中断优先级分组不统一:STM32的中断优先级分组由
SCB->AIRCR寄存器控制,若Bootloader与应用使用不同分组(比如Bootloader用分组2,应用用分组3),会导致实际优先级计算混乱,引发中断无法触发或抢占逻辑异常。要么Bootloader跳转前将分组设置为与应用一致,要么应用初始化时先重配分组,再重新设置所有中断优先级。 - 外设中断标志残留:Bootloader运行时若触发过TIM6或UART2中断,但未清除外设自身的中断标志(比如TIM6的
TIM_SR_UIF、UART2的USART_ISR_RXNE),跳转后这些标志仍处于置位状态,会阻塞新的中断请求。应用初始化阶段需先清除对应外设的所有中断标志。 - 系统状态未重置:跳转前未禁用Bootloader用过的外设时钟、未重置外设寄存器,导致外设处于异常状态。比如TIM6仍在运行,即便应用重新初始化,也可能无法正常触发中断。跳转流程中需添加外设时钟禁用、寄存器重置步骤。
- 应用中断初始化顺序错误:若应用先开启全局中断,再配置中断优先级和外设中断,可能导致配置过程中收到中断请求,引发异常挂起。正确顺序应为:配置外设→配置NVIC优先级→清除挂起标志→开启外设中断→开启全局中断。
内容的提问来源于stack exchange,提问作者Suhaib Saiyde
相关产品推荐
相关产品推荐

