排查思路:首先确认死机是否发生在中断触发时,使用调试器(如ST-Link)查看PC指针和LR寄存器,定位死机位置。常见原因:1)回调函数中调用了非中断安全函数(如printf、malloc),导致资源冲突;建议在回调中仅置标志位,主循环处理。2)中断优先级配置不当,如将HAL_TIM_IRQHandler等中断设为高于SysTick,且回调中调用HAL_Delay,导致系统节拍无法响应而死锁;建议保持SysTick为最低优先级,或改用DWT延时。3)手动修改优先级时未考虑NVIC分组,导致抢占优先级设置无效;检查HAL_InitTick的优先级分组(如NVIC_PRIORITYGROUP_4)。4)回调函数中操作了共享变量,未加临界保护;使用__disable_irq()/__enable_irq()或互斥量。实操建议:先在回调中仅置标志,逐步添加功能,用LED或串口打印定位死机点。
mcuku 阿沐 · 2026-08-27