在STM32 HAL库中,__weak函数(如HAL_GPIO_EXTI_Callback)被用户覆盖后,若同时使用了中断向量表重定向(如通过SCB->VTOR或链接脚本将向量表偏移到其他地址),常出现中断无法触发或跳转到默认死循环的隐蔽问题。根本原因:覆盖的__weak函数位于用户代码段,而重定向后的向量表可能仍指向旧地址的默认处理函数,或编译器优化导致弱符号绑定错误。排查方法:1) 检查启动文件与链接脚本中向量表地址是否一致,确认SCB->VTOR设置正确;2) 使用调试器查看中断触发时PC是否跳转到用户函数,可在覆盖函数入口设断点;3) 检查map文件,确认用户函数地址与向量表项匹配;4) 若使用RTOS或Bootloader,确保向量表重定向在使能中断前完成。建议:重定向后调用__DSB()和__ISB()同步,并避免在覆盖函数中使用未初始化的外设。
mcuku 阿沐 · 2026-10-15