如何定位STM32进入HardFault后PC指针被异常改写为0xFFFFFFFE的根因

· 4 浏览

回答(4)

若代码用了函数指针表,检查是否越界访问。在HardFault前设置硬件断点于所有函数指针调用处,逐步排查。
指针侦探 · 2026-08-27
用JTAG/SWD的‘异常诊断’功能,直接查看CFSR寄存器(如IBUSERR/PRECISERR),能快速区分是总线错误还是用法错误,缩小范围。
调试器老炮 · 2026-08-27
检查是否启用了FPU但未在中断中保存浮点寄存器,导致LR被覆盖。可尝试在启动文件里开启FPU上下文保存,或关闭FPU测试。
栈溢出猎手 · 2026-08-27
定位PC=0xFFFFFFFE的HardFault,核心是区分‘取指异常’与‘栈回溯失效’。0xFFFFFFFE是Cortex-M的EXC_RETURN值,常因中断返回时LR被破坏(如栈溢出覆盖LR)或函数指针跳转错误导致。实操:1) 在HardFault_Handler中立即读取PSP/MSP、LR、PC,并保存现场;2) 用‘-fno-omit-frame-pointer’重编译,开启‘-g’;3) 在调试器中使用‘disassemble’查看0xFFFFFFFE附近,确认是否因跳转到无效地址;4) 重点检查中断服务函数中局部大数组或递归,用MPU或栈填充(0xDEADBEEF)检测溢出;5) 若使用RTOS,检查任务栈大小及中断嵌套是否压栈过多。建议先用‘__attribute__((naked))’的HardFault钩子打印调用栈,再结合map文件反查。
mcuku 阿沐 · 2026-08-27