硬汉嵌入式论坛

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

[硬件异常黑盒子] H7-TOOL硬件异常黑盒子功能V2.0版完成,支持在线和离线实时检测,也可以方便检测出错源码行号(2025-09-22)

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
发表于 4 天前 | 显示全部楼层 |阅读模式
【应用场景】

上电后一段时间进入硬件异常,或执行某个功能就进入硬件异常,我们可以方便的通过IDE软件或者嵌入的异常分析代码来锁定问题位置。

而运行比较长的时间或者没有电脑环境的场景,比如两周,一个月等,这就不方便挂个电脑分析了。

挂个TOOL就比较方便,可以长时间检测跟踪芯片的运行,出问题的时候可以关键信息导出来。简单的可以TOOL自带显示屏直接分析出结果,复杂的可以电脑端上位机软件分析。

【离线版】

前几天完成了离线版

完成H7-TOOL硬件异常黑盒子的离线脱机实时检测,并存储所有异常信息到eMMC磁盘功能(2025-09-18)
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=129730

【在新版】

这几天在线版也完成了. 将在下个2.32版固件正式上线。

1、可以实时检测是否有硬件异常

1.png

2、检测到异常后可以做硬件异常分析

2.png

纯中文解析内容:

[C] 纯文本查看 复制代码
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

124.png

125.png

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
 楼主| 发表于 4 天前 | 显示全部楼层
V2.0版正式完工
回复

使用道具 举报

1

主题

150

回帖

153

积分

初级会员

积分
153
发表于 4 天前 | 显示全部楼层
niubility 白哥,牛逼,硬件异常分析更加完善了
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 3 天前 | 显示全部楼层
1.可以出现异常的时候再连接,读取状态吗?
2.低功耗stop模式下,能读取吗?会不会引起复位呀
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
 楼主| 发表于 3 天前 | 显示全部楼层
Hackerpro 发表于 2025-9-23 12:35
1.可以出现异常的时候再连接,读取状态吗?
2.低功耗stop模式下,能读取吗?会不会引起复位呀

1、没问题,怎么用都可以。可以随时连接,也可以TOOL检测。
2、低功耗后,调试接口将无法使用,相关时钟也将被关闭来降低功耗。除非你程序里面配置DBGMCU,低功耗模式可以实现使用SWD接口
3、这个功能基本不影响程序运行,不会复位芯片
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 09:11 , Processed in 0.042824 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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