先确认覆盖是否真正生效:__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