[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