3.5 KiB
3.5 KiB
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