[技术问答] MCU HardFault排查

[复制链接]
1661|2
 楼主| timfordlare 发表于 2025-6-24 09:15 | 显示全部楼层 |阅读模式
Cortex-M内核具有一个不可以关闭的硬件错误中断(Hard fault),这个中断的功能就是当内核运行到了错误的代码会导致产生硬件故障,进而引发中断,用于指示程序出现了重大不可修复的异常,需要程序员去重点关注与处理。

程序产生Hard fault故障常见的有以下几种:
(1)除法除数为0故障;
需要注意的是M0不是硬件除法器,是软件库处理的除法,所以不会进入进入HardFault 。
(2)非对齐访问故障;
(3)无效的PC指针故障。

这些故障是编写程序时经常会遇到代码编写错误产生的故障。还有一些其他故障,如指令总线错误,数据总线错误,执行未定义的指令等,这些一般由于芯片故障产生。


本文以Nuvoton的M4 ISD94XX故障代码来带你分析一下硬件故障产生的种类及如何根据异常的现象寄存器信息来分析找到出现故障问题的代码位置。
排查问题使用到的工具:   Nu Link, Keil MDK,ISD94XX EVK板。

首先在 ISD94XX BSP下的GPIO_INT里的main.c的主函数里添加如下子函数:
void StackFlow(void){
int a[3],i;
for(i=0; i<100000; i++)
{
a=1;
}
}


在主循环里调用函数就会出现HardFault。
DEBUG如下图,SP值为0x20001008,查看堆栈里面的值依次为R0~R3、R12、Return address、PSR、LR, 例如R0(1027 00 00), 显然堆栈后第21个字节到24字节即为Returnaddress,该地址0x00000E7D即为异常前PC将要执行的下一条指令地址,在汇编里输入该地址。

可以看到出现错误的下一条语句。



神明祷告 发表于 2025-9-14 15:07 | 显示全部楼层
MCU HardFault 排查:1. 使能 HardFault 中断,在中断服务程序中记录栈顶信息、寄存器值;2. 检查是否有数组越界、空指针访问等内存错误;3. 排查程序跳转地址是否合法,是否有非法指令;4. 确认堆栈大小是否足够,避免栈溢出;5. 逐步注释代码定位触发点,结合调试器单步分析。
葡萄又绿江南岸 发表于 2025-9-23 18:03 | 显示全部楼层
MCU HardFault 排查可按以下步骤:先检查程序是否有数组越界、空指针访问等内存错误;查看中断向量表,定位 HardFault_Handler 函数获取故障状态寄存器信息;使用调试器单步调试定位触发点;检查外设配置及时钟、电源是否异常,逐步缩小故障范围。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

1675

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部