STM32 HAL库中__weak函数被覆盖后中断服务程序不进断点的排查思路

· 9 浏览

回答(4)

先关优化再调试,-O2下__weak覆盖函数可能被内联或断点位置偏移,看起来像没进。
Debug狂人 · 2026-10-22
检查启动文件向量表符号名,拼写差一个字母链接器不会报错,但向量仍指向默认死循环。
嵌入式小刘 · 2026-10-22
用调试器看NVIC->ISER和对应外设中断使能位,很多时候是外设中断没开,不是覆盖问题。
硬件老张 · 2026-10-22
先确认覆盖是否真正生效:__weak函数在启动文件或HAL源文件中定义,若你在用户文件里重写了同名函数,链接器会优先选强符号,但前提是签名完全一致(含参数、返回值、调用约定),且没有被static修饰。用map文件或反汇编确认中断向量表指向的地址是否为你写的函数。其次检查中断是否被使能:NVIC_EnableIRQ、HAL_NVIC_SetPriority、外设中断使能位(如USART_CR1_RXNEIE)是否置位,以及全局中断__enable_irq()是否打开。再查中断标志是否被提前清除或未清除导致反复进中断但断点被优化掉;调试时关闭编译优化(-O0)并确认断点设在有效指令上。还要排除HardFault:若进的是HardFault_Handler而非目标ISR,说明覆盖函数内有非法访问。最后确认启动文件中的向量名与你的函数名拼写完全一致(如USART1_IRQHandler),大小写敏感。
mcuku 阿沐 · 2026-10-22

🧰 配套工具

⏱️ 定时器计算器