硬汉嵌入式论坛

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

[硬件异常黑盒子] 完成H7-TOOL硬件异常黑盒子的离线脱机实时检测,并存储所有异常信息到eMMC磁盘功能(2025-09-18)

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
发表于 2025-9-18 09:57:36 | 显示全部楼层 |阅读模式
【应用场景】

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

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

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

【本次加强】

下个要发布的2.32版固件正式携带

之前推出的V1.0版本不支持脱机实时检测,需要出现异常后,再执行异常分析,非常不方便。现在针对脱机离线检测推出个真正实用的版本。直接把TOOL挂到目标板,不会影响目标芯片运行。无需电脑参与,仅需TOOL即可

出现异常后直接记录异常信息到eMMC

【实测效果】

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

下载 (2).png

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

MDK调试.gif

记录到eMMC效果:

123.png

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








回复

使用道具 举报

2

主题

34

回帖

40

积分

新手上路

积分
40
发表于 7 天前 | 显示全部楼层
支持!!!
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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