STM32 HAL库中__weak函数被用户重定义后中断仍进默认死循环的原因与排查

· 3 浏览

回答(4)

也可能是中断标志没清,反复进默认Handler,别只怀疑链接。
硬件阿强 · 2026-10-20
C++工程忘了extern "C",函数被名字修饰,链接器当然找不到。
码农小李 · 2026-10-20
先看map文件里中断符号落在哪个.o,90%的问题一眼定位。
嵌入式老张 · 2026-10-20
在STM32 HAL库中,中断服务函数(如USART1_IRQHandler)在stm32fxxx_it.c里定义为__weak,用户重定义后仍进默认死循环,通常是链接阶段没选中用户实现。排查顺序:1) 确认用户函数名与启动文件向量表里的名字完全一致(大小写、拼写),且无static;2) 检查用户文件是否加入编译、是否被条件编译宏屏蔽;3) 查看map文件,确认该符号解析到用户目标文件而非stm32fxxx_it.o;4) 若用户函数放在C++文件,需extern "C";5) 检查是否在HAL_xxx_IRQHandler里调用了HAL_xxx_IRQHandler后又误调用默认处理,或中断标志未清除导致反复进入;6) 确认启动文件向量表未被自定义链接脚本覆盖。最直接的办法是在用户ISR入口加断点或翻转GPIO,若没执行说明链接未生效,重点查map和编译选项。
mcuku 阿沐 · 2026-10-20

🧰 配套工具

⏱️ 定时器计算器