在STM32 HAL库中,回调函数(如HAL_UART_RxCpltCallback)在stm32fxxx_hal_uart.c里以__weak定义。用户重定义后,链接器按“强符号优先”选择用户版本,正常情况下不会调用原函数。所谓“仍调用原函数”的陷阱通常来自:1)用户函数签名与原型不一致(如参数类型/const修饰不同),C编译器视为不同符号,链接器仍用weak版本;2)用户实现放在未被编译进工程的源文件,或放在静态库中且该库未被链接器按需拉取;3)多个同名强符号导致链接器报错或按链接顺序选择;4)在C++中未加extern "C"导致名字修饰不同。验证方法:用arm-none-eabi-nm -C查看最终elf中该符号是W(weak)还是T(强),用objdump -d反汇编确认调用目标地址;在用户函数入口加GPIO翻转或打印,确认是否执行;也可临时删除weak定义或加-fno-common排查。实操建议:确保签名与HAL原型完全一致,实现文件加入编译,C++工程加extern "C",并用map文件确认符号归属。