# 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
