在STM32 HAL库中,__weak函数被覆盖后仍进入默认实现,常见原因有:1)覆盖函数签名与原型不一致(参数类型、const、返回值),编译器视为不同函数;2)覆盖函数未参与链接,如所在.c文件未加入工程、被条件编译屏蔽;3)链接顺序或库文件优先,静态库中的weak符号被先解析;4)使用了C++编译,因name mangling导致符号名不匹配,需extern "C";5)覆盖函数定义在头文件中被多次包含或未加static导致ODR问题;6)启动文件或旧目标文件残留。排查方法:用nm/objdump查看符号表,确认覆盖函数为T、默认实现为W;检查map文件确认最终链接的是哪个目标文件;核对函数原型完全一致;确保覆盖文件参与编译且未被优化掉;C++工程加extern "C";清理后全量重编译。