硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7151|回复: 15
收起左侧

[硬件异常黑盒子] 基于H7-TOOL的硬件异常黑盒子功能V2.0版本操作说明,支持在线和离线实时检测,持续更新(2026-07-11)

  [复制链接]

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
123555
QQ
发表于 2022-8-17 00:25:20 | 显示全部楼层 |阅读模式

在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、根据分析结果锁定处于的源码行号

123.png





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




回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
123555
QQ
 楼主| 发表于 2022-8-17 03:10:13 | 显示全部楼层
更新完毕
回复

使用道具 举报

11

主题

772

回帖

805

积分

金牌会员

积分
805
发表于 2022-8-17 09:38:33 | 显示全部楼层
这个功能实用,强大。

回复

使用道具 举报

5

主题

116

回帖

131

积分

初级会员

积分
131
发表于 2022-8-17 10:40:28 | 显示全部楼层
非常强大。晚上试试。
回复

使用道具 举报

60

主题

694

回帖

879

积分

金牌会员

积分
879
发表于 2022-8-17 10:44:03 | 显示全部楼层
有时间研究研究,这个着实很实用,
回复

使用道具 举报

36

主题

2051

回帖

2159

积分

至尊会员

积分
2159
发表于 2022-8-17 10:55:56 | 显示全部楼层
上位机把elf文件解析也加上,可以直接打开查看,这样就不用MDK或者IAR查看了
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
123555
QQ
 楼主| 发表于 2022-8-17 11:19:19 | 显示全部楼层
byccc 发表于 2022-8-17 10:55
上位机把elf文件解析也加上,可以直接打开查看,这样就不用MDK或者IAR查看了

如果工程代码是基于Embedded Studio创建的,支持打开elf文件,可以方便的查看出错位置。

image.png
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
123555
QQ
 楼主| 发表于 2022-8-17 12:20:18 | 显示全部楼层
更新脱机运行说明。
回复

使用道具 举报

36

主题

2051

回帖

2159

积分

至尊会员

积分
2159
发表于 2022-8-17 14:26:59 | 显示全部楼层
eric2013 发表于 2022-8-17 11:19
如果工程代码是基于Embedded Studio创建的,支持打开elf文件,可以方便的查看出错位置。

其实上位机能支持的话,效果更好,客户使用也方便
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
123555
QQ
 楼主| 发表于 2022-8-17 14:27:58 | 显示全部楼层
byccc 发表于 2022-8-17 14:26
其实上位机能支持的话,效果更好,客户使用也方便

这个确实是的。
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
123555
QQ
 楼主| 发表于 2022-8-24 02:30:00 | 显示全部楼层
客户提议增加时间戳,方便检测出问题时间,非常好,这两天升级下。
回复

使用道具 举报

0

主题

130

回帖

130

积分

初级会员

积分
130
发表于 2023-8-1 10:21:17 | 显示全部楼层
https://github.com/armink/CmBacktrace/blob/master/README_ZH.md
CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:

    支持的错误包括:
        断言(assert)
        故障(Hard Fault, Memory Management Fault, Bus Fault, Usage Fault, Debug Fault)
    故障原因 自动诊断 :可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器;
    输出错误现场的 函数调用栈(需配合 addr2line 工具进行精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、精准。也可以在正常状态下使用该库,获取当前的函数调用栈;
    支持 裸机 及以下操作系统平台:
        RT-Thread
        UCOS
        FreeRTOS(需修改源码)
    根据错误现场状态,输出对应的 线程栈 或 C 主栈;
    故障诊断信息支持多国语言(目前:简体中文、英文);
    适配 Cortex-M0/M3/M4/M7 MCU;
    支持 IAR、KEIL、GCC 编译器;
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
123555
QQ
 楼主| 发表于 2023-8-1 10:28:30 | 显示全部楼层
ilcvm 发表于 2023-8-1 10:21
https://github.com/armink/CmBacktrace/blob/master/README_ZH.md
CmBacktrace (Cortex Microcontroller ...

不一样的,TOOL工具的实现是不需要目标板嵌入任何代码的。
回复

使用道具 举报

5

主题

76

回帖

91

积分

初级会员

积分
91
发表于 2024-10-10 15:27:23 | 显示全部楼层
这个功能支持STM8吗?
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
123555
QQ
 楼主| 发表于 2024-10-10 15:34:19 | 显示全部楼层
Blake 发表于 2024-10-10 15:27
这个功能支持STM8吗?

STM8还不行,STM8的异常机制还没研究过。
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
123555
QQ
 楼主| 发表于 2026-7-11 16:40:00 | 显示全部楼层
2026-07-11
更新新版操作说明
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-7-26 21:44 , Processed in 0.393267 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表