|
|
在2.32及其以上版本支持V2.0版
【应用场景】
上电后一段时间进入硬件异常,或执行某个功能就进入硬件异常,我们可以方便的通过IDE软件或者嵌入的异常分析代码来锁定问题位置。
而运行比较长的时间,比如两周,一个月等,这就不方便挂个电脑分析了。
挂个TOOL就比较方便,可以长时间检测跟踪芯片的运行,出问题的时候可以关键信息导出来。简单的可以TOOL自带显示屏直接分析出结果,复杂的可以电脑端上位机软件分析。
【功能介绍】
1、Cortex-M内核均支持
2、支持在线实时检测,检测期间不影响芯片正常运行。
3、支持离线实时检测,检测期间不影响芯片正常运行,并存储所有异常信息到eMMC磁盘功能。直接把TOOL挂到目标板,无需电脑参与,仅需TOOL即可
4、可以给出错误类型,错误原因和错误位置。
5、除了非精确异常错误,大部分都可以锁定异常出错位置。
6、支持Cortex-M23,M33,M55和M85的SecureFault检测
7、采用SWD接口连接目标板
【在线版】
1、可以实时检测是否有硬件异常
(1)可以定时检测异常,设置定时时间。
(2)也可以手动点击检测按钮来检测。

2、检测到异常后可以做硬件异常分析
也可以没有检测到异常时点击这个按钮

解析内容支持中文和英文两个版本
[Lua] 纯文本查看 复制代码 2025-09-13 V2.0
============================================================
========================寄存器值读取========================
============================================================
R0 = cccccccc
R1 = 00000001
R2 = 200000dc
R3 = 60001000
R4 = 00000001
R5 = 0800512c
R6 = 00000000
R7 = 00000000
R8 = 00000000
R9 = 00000000
R10 = 00000000
R11 = 00000000
R12 = 00000014
R13(SP) = 20002110
R14(LR) = ffffffe9
R15(PC) = 080028ba
xPSR = 61000003
------------------------------------------------------------------
系统中断控制和状态寄存器 SHCSR = 0x00010000
------------------------------------------------------------------
MEMFAULTACT = 0, MemFault 内存管理中断未触发
MEMFAULTPENDED = 0, MemFault 内存管理中断未挂起
MEMFAULTENA = 1, MemFault 内存管理中断使能
BUSFAULTACT = 0, BusFault 总线错误中断未触发
BUSFAULTPENDED = 0, BusFault 总线错误中断未挂起
BUSFAULTENA = 0, BusFault 总线错误中断未使能
USGFAULTACT = 0, UsageFault 用法错误中断未触发
USGFAULTPENDED = 0, UsageFault 用法错误中断未挂起
USGFAULTENA = 0, UsageFault 用法错误中断未使能
MONITORACT = 0, Debug monitor 中断未触发
SVCALLACT = 0, SVC 中断未触发
SVCALLPENDED = 0, SVC 中断未挂起
PENDSVACT = 0, PendSV 中断未触发
SYSTICKACT = 0, SYSTICK 中断未触发
------------------------------------------------------------------
硬件异常状态寄存器 HSFR = 0x40000000
------------------------------------------------------------------
VECTBL = 0, 中断向量表无BusFault总线错误
FORCED = 1, 强制硬件异常
表示由可配置优先级异常升级成强制硬件异常,该异常因优先级问题或被禁用而无法处理
当此位置位时,硬件异常处理程序必须读取其他异常状态寄存器以确定异常原因
DEBUGEVT = 0, 保留用于调试
------------------------------------------------------------------
内存管理状态寄存器 MMFSR = 0x00
------------------------------------------------------------------
IACCVIOL = 0, 无指令访问冲突错误
DACCVIOL = 0, 无数据访问异常
MUNSTKERR = 0, 出栈正常
MSTKERR = 0, 入栈正常
MLSPERR = 0, 浮点lazy stacking特性保存期间未发生故障
MMARVALID = 0, SCB->MMFAR寄存器没有记录异常地址
------------------------------------------------------------------
内存地址寄存器 MemManage Address Register (MMFAR) = 0xcccccccc
------------------------------------------------------------------
MemFault 错误数据地址。
MMFSR 显示错误的原因,只有在 MMFSR.MMARVALID 被设置时,该字段才有效。
在没有独立 BFAR 和 MMFAR 寄存器的实现中,如果 BFSR.BFARVALID 被设置,
则该寄存器的值为 UNKNOWN。
------------------------------------------------------------------
总线异常状态寄存器 BusFault Status Register (BFSR) = 0x82
------------------------------------------------------------------
IBUSERR = 0, 指令总线正常
PRECISERR = 1, 精确的数据总线访问异常
发生了数据总线错误,并且异常返回堆栈保存的 PC 值指向引发故障的指令。
当处理器设置此位时,会将出错地址写入 BFAR。
IMPRECISERR = 0, 数据总线正常
UNSTKERR = 0, 中断出栈时正常
STKERR = 0, 中断入栈时正常
LSPERR = 0, 浮点lazy stacking特性保存期间未生故障
BFARVALID = 1, BFAR寄存器记录有效的异常地址
处理器在发生已知地址的 BusFault 后会设置此位。其他故障(如后续发生的 MemManage
错误)可能会将此位清零。如果 BusFault 由于优先级被升级为 HardFault,HardFault
处理程序必须将此位清零。这可以防止在返回BusFault异常时,出现BFAR值被覆盖的问题
------------------------------------------------------------------
总线异常地址寄存器 BusFault Address Register (BFAR) = 0xcccccccc
------------------------------------------------------------------
精确 BusFault 的数据地址。
BFSR 寄存器显示出错的原因。只有在 BFSR.BFARVALID 被设置时,该字段才
有效。在没有独立 BFAR 和 MMFAR 寄存器的实现中,如果 MMFSR.MMARVALID
被设置,则该寄存器的值为 UNKNOWN。
------------------------------------------------------------------
UsageFault Status Register (UFSR) = 0x0000
------------------------------------------------------------------
UNDEFINSTR = 0, 处理器访问指令正常
INVSTATE = 0, 没有无效状态
INVPC = 0, PC加载正常
NOCP = 0, 访问协处理正常
UNALIGNED = 0, 内存对齐访问正常
DIVBYZERO = 0, 无除数为0的异常, 或者没有使能除数为0的异常
============================================================
=========================异常进一步分析=====================
============================================================
进入和退出中断使用MSP, 返回线程模式, 进入中断前使用了硬件浮点单元
进入硬件异常前, 寄存器数值, 如果出现非精确异常, 这些值是不准确的:
R0 = cccccccc
R1 = 00000001
R2 = 200000dc
R3 = 60001000
R12 = 00000014
LR = 08004fb5
PC = 08004fc0
PSR = 61000000
3、根据分析结果锁定处于的源码行号


Cortex-M23,M33,M55和M85有个额外的SecureFault,这个是与M0,M3,M4,M7不同的地方


查看位置

【离线版】
TOOL连接目标板,然后操作显示屏,选择hardfault离线小程序。

实时检测动态效果,平时就是打印log信息来展示是否检测到异常,检测到后开始记录到eMMC

记录到eMMC效果:

[Lua] 纯文本查看 复制代码 2025-09-13 V2.0
============================================================
========================寄存器值读取========================
============================================================
R0 = 20002150
R1 = 00000000
R2 = 20000038
R3 = 00000029
R4 = 40011000
R5 = 08005240
R6 = 00000000
R7 = 00000000
R8 = 00000000
R9 = 00000000
R10 = 00000000
R11 = 00000000
R12 = 00000014
R13(SP) = 20002148
R14(LR) = ffffffe9
R15(PC) = 08002954
xPSR = 61000003
------------------------------------------------------------------
系统中断控制和状态寄存器 SHCSR = 0x00010000
------------------------------------------------------------------
MEMFAULTACT = 0, MemFault 内存管理中断未触发
MEMFAULTPENDED = 0, MemFault 内存管理中断未挂起
MEMFAULTENA = 1, MemFault 内存管理中断使能
BUSFAULTACT = 0, BusFault 总线错误中断未触发
BUSFAULTPENDED = 0, BusFault 总线错误中断未挂起
BUSFAULTENA = 0, BusFault 总线错误中断未使能
USGFAULTACT = 0, UsageFault 用法错误中断未触发
USGFAULTPENDED = 0, UsageFault 用法错误中断未挂起
USGFAULTENA = 0, UsageFault 用法错误中断未使能
MONITORACT = 0, Debug monitor 中断未触发
SVCALLACT = 0, SVC 中断未触发
SVCALLPENDED = 0, SVC 中断未挂起
PENDSVACT = 0, PendSV 中断未触发
SYSTICKACT = 0, SYSTICK 中断未触发
------------------------------------------------------------------
硬件异常状态寄存器 HSFR = 0x40000000
------------------------------------------------------------------
VECTBL = 0, 中断向量表无BusFault总线错误
FORCED = 1, 强制硬件异常
表示由可配置优先级异常升级成强制硬件异常,该异常因优先级问题或被禁用而无法处理
当此位置位时,硬件异常处理程序必须读取其他异常状态寄存器以确定异常原因
DEBUGEVT = 0, 保留用于调试
------------------------------------------------------------------
内存管理状态寄存器 MMFSR = 0x00
------------------------------------------------------------------
IACCVIOL = 0, 无指令访问冲突错误
DACCVIOL = 0, 无数据访问异常
MUNSTKERR = 0, 出栈正常
MSTKERR = 0, 入栈正常
MLSPERR = 0, 浮点lazy stacking特性保存期间未发生故障
MMARVALID = 0, SCB->MMFAR寄存器没有记录异常地址
------------------------------------------------------------------
内存地址寄存器 MemManage Address Register (MMFAR) = 0xcccccccc
------------------------------------------------------------------
MemFault 错误数据地址。
MMFSR 显示错误的原因,只有在 MMFSR.MMARVALID 被设置时,该字段才有效。
在没有独立 BFAR 和 MMFAR 寄存器的实现中,如果 BFSR.BFARVALID 被设置,
则该寄存器的值为 UNKNOWN。
------------------------------------------------------------------
总线异常状态寄存器 BusFault Status Register (BFSR) = 0x82
------------------------------------------------------------------
IBUSERR = 0, 指令总线正常
PRECISERR = 1, 精确的数据总线访问异常
发生了数据总线错误,并且异常返回堆栈保存的 PC 值指向引发故障的指令。
当处理器设置此位时,会将出错地址写入 BFAR。
IMPRECISERR = 0, 数据总线正常
UNSTKERR = 0, 中断出栈时正常
STKERR = 0, 中断入栈时正常
LSPERR = 0, 浮点lazy stacking特性保存期间未生故障
BFARVALID = 1, BFAR寄存器记录有效的异常地址
处理器在发生已知地址的 BusFault 后会设置此位。其他故障(如后续发生的 MemManage
错误)可能会将此位清零。如果 BusFault 由于优先级被升级为 HardFault,HardFault
处理程序必须将此位清零。这可以防止在返回BusFault异常时,出现BFAR值被覆盖的问题
------------------------------------------------------------------
总线异常地址寄存器 BusFault Address Register (BFAR) = 0xcccccccc
------------------------------------------------------------------
精确 BusFault 的数据地址。
BFSR 寄存器显示出错的原因。只有在 BFSR.BFARVALID 被设置时,该字段才
有效。在没有独立 BFAR 和 MMFAR 寄存器的实现中,如果 MMFSR.MMARVALID
被设置,则该寄存器的值为 UNKNOWN。
------------------------------------------------------------------
UsageFault Status Register (UFSR) = 0x0000
------------------------------------------------------------------
UNDEFINSTR = 0, 处理器访问指令正常
INVSTATE = 0, 没有无效状态
INVPC = 0, PC加载正常
NOCP = 0, 访问协处理正常
UNALIGNED = 0, 内存对齐访问正常
DIVBYZERO = 0, 无除数为0的异常, 或者没有使能除数为0的异常
============================================================
=========================异常进一步分析=====================
============================================================
进入和退出中断使用MSP, 返回线程模式, 进入中断前使用了硬件浮点单元
进入硬件异常前, 寄存器数值, 如果出现非精确异常, 这些值是不准确的:
R0 = 00000001
R1 = ffffffe9
R2 = cccccccc
R3 = 00000001
R12 = 200000e0
LR = 60001000
PC = 00000014
PSR = 080050c9
【参考资料】
帖子里面有个各种异常展示案例
视频教程第6期:MDK专题进阶,Cortex-M内核芯片Hardfault硬件异常调试分析定位(2022-02-17)
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=110982
H7-TOOL硬件异常黑盒子功能,使用addr2line小软件可以方便锁定出错的源文件位置(2024-05-27)
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=117878
|
|