这是典型的链接顺序/符号解析问题。HAL库中__weak函数(如HAL_GPIO_EXTI_Callback)在stm32xxx_hal_xxx.c中以__weak定义,用户重定义后仍走默认实现,通常原因是:1)用户重定义函数写在未被编译进工程的.c文件里,或该文件未加入Keil/IAR/Makefile的源文件列表;2)用户函数声明与HAL原型签名不一致(参数类型、const、返回值),导致编译器视为不同符号,链接器仍选弱符号;3)链接顺序问题:若用户实现放在静态库(.a/.lib)中,链接器只在已解析的未定义符号处拉取库成员,而弱符号已满足引用,不会从库中拉取强符号,需把用户实现放工程源文件或用--whole-archive/-u强制引入;4)C++工程未加extern "C"导致名字修饰不匹配。排查:用arm-none-eabi-nm或Keil的.map文件查看符号,确认用户符号是否被链接、是否出现两个同名符号;检查编译输出是否包含该目标文件;确认函数签名与HAL头文件完全一致。实操建议:把重定义函数放在main.c或独立.c并确保加入工程;用map文件搜索函数名,看地址是否指向HAL默认实现;必要时在用户函数内加断点或GPIO翻转验证是否执行。