Files
pdf-to-md-test/output-v3/2.1.6_UFSR_Usage_Fault_Status_Register_p238.md
T

3.5 KiB
Raw Blame History

2.1.6 Usage Fault Status Register (UFSR)

寄存器名称Usage Fault Status Register
偏移地址UFSR(位于 SCB 内)
访问权限:读/写(软件可写入 1 清除对应位)
初始复位值0x0000_0000
说明UFSR 指示发生了何种 Usage Fault 错误。写 1 到对应位可清除该位。


位域定义

位号 位域名称 类型 复位值 描述
31:26 Reserved 0 保留位,必须保持清零
25 DIVBYZERO RW 0 Divide by zero usage fault。当该位被置 1 时,堆栈保存的 PC 值指向执行了 SDIV 或 UDIV 指令且除数为 0 的那条指令。需通过 CCR 的 DIV_0_TRP 位使能除零错误捕获。0 = 无除零错误,或未使能捕获;1 = 处理器执行了除数为 0 的 SDIV/UDIV 指令
24 UNALIGNED RW 0 Unaligned access usage fault。通过 CCR 的 UNALIGN_TRP 位使能未对齐访问捕获。注意:未对齐的 LDM、STM、LDRD、STRD 指令无论 UNALIGN_TRP 设置如何均会触发错误。0 = 无未对齐访问错误,或未使能捕获;1 = 处理器执行了未对齐内存访问
23:20 Reserved 0 保留位,必须保持清零
19 NOCP RW 0 No coprocessor usage fault。处理器不支持协处理器指令。0 = 未因访问协处理器而触发 usage fault;1 = 处理器尝试访问了协处理器
18 INVPC RW 0 Invalid PC load usage fault(由无效的 EXC_RETURN 加载 PC 导致)。当该位置 1 时,堆栈保存的 PC 值指向那条试图非法加载 PC 的指令。0 = 无无效 PC 加载错误;1 = 处理器尝试将非法 EXC_RETURN 加载到 PC(因无效上下文或无效 EXC_RETURN 值)
17 INVSTATE RW 0 Invalid state usage fault。当该位置 1 时,堆栈保存的 PC 值指向那条非法使用 EPSR 的指令。若某未定义指令使用了 EPSR,不会置 1。0 = 无无效状态错误;1 = 处理器尝试执行了非法使用 EPSR 的指令
16 UNDEFINSTR RW 0 Undefined instruction usage fault。当该位置 1 时,堆栈保存的 PC 值指向该未定义指令。未定义指令是指处理器无法解码的指令。0 = 无未定义指令错误;1 = 处理器尝试执行了未定义指令

字段值摘要

位域 = 0 = 1
DIVBYZERO 无除零 fault,或未使能捕获 执行了除数为 0 的 SDIV/UDIV
UNALIGNED 无未对齐 fault,或未使能捕获 执行了未对齐内存访问
NOCP 未因访问协处理器触发 fault 尝试访问了协处理器
INVPC 无无效 PC 加载 fault 尝试非法加载 EXC_RETURN 到 PC
INVSTATE 无无效状态 fault 尝试执行了 EPSR 非法使用
UNDEFINSTR 无未定义指令 fault 尝试执行了未定义指令

异常返回与 PC 堆栈值

当 UFSR 中任意位被置 1 时,异常返回时堆栈保存的 PC 值指向触发该 fault 的那条指令(用于调试定位)。


相关寄存器

  • CCR (Configuration and Control Register):控制 DIV_0_TRP 和 UNALIGN_TRP 位的使能(第 231 页)
  • HFSR (HardFault Status Register)HardFault 状态寄存器
  • MMFAR (MemManage Fault Address Register)MemManage 错误地址寄存器

设计说明

  • UFSR 为粘滞 sticky 设计:写入 1 清除对应位,写入 0 保持不变
  • 所有 Reserved 位写入 1 会产生不可预测行为
  • 复位后所有位清零,表示无 Usage Fault