打印
[技术问答]

MCU HardFault排查

[复制链接]
172|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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将要执行的下一条指令地址,在汇编里输入该地址。

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



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

1573

帖子

1

粉丝