Skip to main content

使用 Keil 调试-内核调试

提示
  1. 并不是所有 Cortex-M 系列的内核的都有如下的演示寄存器,需要根据具体的内核以及芯片规格书确认。
  2. ARM-MDK 版本是 V5。

滴答定时器 Systick

包含四个:Systick、fault report、sys ctrl

系统节拍定时器 (SysTick) 对话框(适用于 Cortex-M3、Cortex-M4 和 Cortex-M7)显示系统定时器的控件。系统定时器是一项可选功能。如果未实现,则 SysTick 寄存器将被保留。

Control & Status

显示 SysTick 的控制和状态寄存器(SYST_CSR)的设置。

ST_CTRL_STAT

显示位于内存地址 0xE000E010 的 SYST_CSR 寄存器(十六进制)的内容。重置值为 0x00000000,或 0x00000004(如果您的设备未实现参考时钟)。

ENABLE

开启 SysTick

  • 0 (unchecked) = counter disabled.
  • 1 (checked) = counter enabled.

TICKINT

开启 SysTick 异常请求

  • 0 = 向下计数到 0 的时候不会产生 SysTick 异常请求。
  • 1 = 向下计数到 0 的时候产生 SysTick 异常请求。

    将计数器的值通过将零写入 SysTick 当前值寄存器更改为 0 从不会改变 SysTick 异常的状态。 解释:当 TICKINT 为 1 时,从计数器(SysTick->VAL)1->0 在个过程中,跳到 0 会产生异常,如果直接把计数器值从 100 设置为 0,也会发生 SysTick 异常。

验证程序:

#include "stm32f4xx.h"

void SysTick_Handler(void); // SysTick中断处理函数的声明

int main(void) {
// 初始化LED(假设你有一个LED连接到某个GPIO引脚)
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
GPIOD->MODER |= GPIO_MODER_MODER12_0;

// 配置SysTick
SysTick->LOAD = 1000 - 1; // 计数器初值
SysTick->VAL = 0; // 当前值寄存器
SysTick->CTRL = SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk; // 启用计时器和中断

while (1) {
// 在计数过程中重置计数器
if (SysTick->VAL < 500) {
SysTick->VAL = 0; // 重置计数器
}
}
}

// SysTick中断处理函数
void SysTick_Handler(void) {
GPIOD->ODR ^= GPIO_ODR_ODR_12; // 翻转LED状态
}

CLKSOURCE

选择 SysTick 时钟源

  • 0 = 外部参考时钟
  • 1 = 处理器时钟

    如果您的设备未实现参考时钟,则该位将读取为 1,并忽略写入操作。

COUNTFLAG

单击此字段可触发对寄存器的写入,并将值设置为 0x0。 如果自上次读取此寄存器以来计时器计数到 0,则返回 1。读取 SYST_CSR 寄存器或 COUNTFLAG 位会将该值设置为 0。写入 ST_CURRENT 也会将 COUNTFLAG 设置为 0。写入 ST_CURRENT 不会触发 SysTick 异常逻辑。 解释:

  1. 计数器到零检测: 这句话解释了一个寄存器的功能。如果自上次读取此寄存器以来,计时器的计数已经到了 0,那么寄存器的返回值为 1。
  2. 重置 COUNTFLAG: 读取 SYST_CSR 寄存器或者 COUNTFLAG 位,会将 COUNTFLAG 的值设置为 0。也就是说,当你读取这些寄存器时,系统会自动将 COUNTFLAG 重置为 0。
  3. 写入 ST_CURRENT 的效果: 写入 ST_CURRENT 寄存器同样会将 COUNTFLAG 设置为 0。也就是说,无论你是读取某些寄存器还是写入 ST_CURRENT 寄存器,都会导致 COUNTFLAG 被清零。
  4. 不触发 SysTick 异常逻辑: 写入 ST_CURRENT 不会触发 SysTick 异常逻辑。这意味着,虽然写入 ST_CURRENT 会改变 COUNTFLAG 的状态,但它不会导致系统触发任何与 SysTick 相关的中断或异常处理。

Reload & Current Value

显示 SysTick 的重装载寄存器(SYST_RVR)和当前值寄存器(SYST_CVR)的内容。

ST_RELOAD

保存计数器启用时以及计数器达到 0 时加载到 SYST_CVR 中的值。表示位于地址 0xE000E014 的 SYS_RVR 寄存器的十六进制完整内容。位 [31:24] 保留,读取为零。值的范围为 0x00000001-0x00FFFFFF。您可以编程一个 0 值,但这没有效果,因为 SysTick 异常请求和 COUNTFLAG 仅在从 1 计数到 0 时激活。

RELOAD

显示 ST_RELOAD 的有效位。

ST_CURRENT

包含 SysTick 计数器的当前值。此控件以十六进制显示位于 0xE000E018 的 SYS_CVR 寄存器的全部内容。位 [31:24] 被保留,读取时为零。对寄存器的任何写入都会将寄存器清除为 0。它还会将 COUNTFLAG 设置为零。

CURRENT

显示 CURRENT 的有效位。

Calibration

显示 SysTick 的校准值寄存器(SYST_CALIB) The reset value of this register is IMPLEMENTATION-DEFINED.

ST_CALIB

以十六进制形式显示位于地址 0xE000E01C 的 SYST_CALIB 寄存器的全部内容。

TENMS

10ms(100Hz)定时的重新加载值,受系统时钟偏差误差影响。如果值读为零,则校准值未知。

SKEW

指示 TENMS 值是否精确:

  • 0 = TENMS 的值是精确的
  • 1 = TENMS 值不准确或未给出。不准确的 TENMS 值会影响 SysTick 作为软件实时时钟的适用性。

NOREF

指示设备是否向处理器提供参考时钟:

  • 0 = 提供参考时钟。
  • 1 = 未提供参考时钟。如果您的设备未提供参考时钟,则 CLKSOURCE 位将读取为 1 并忽略写入。

参考资料

系统控制和配置

系统控制和配置对话框(针对 Cortex-M3、Cortex-M4 和 Cortex-M7)显示有关低功耗状态和处理器行为某些方面的控制。

System Control

系统控制寄存器 (SCR) 控制进入和退出低功耗状态的功能,位于内存地址 0xE000ED10。

SCB->SCR

SCR 寄存器的值(16 进制),复位值为 0x00000000.

SLEEPONEXIT

确定在退出 ISR 并返回到基本执行级别时,处理器是否进入睡眠状态。

SLEEPDEEP

控制处理器是否使用睡眠(sleep)或深度睡眠(deep sleep)作为低功耗模式:

  • 0 (unchecked) = 睡眠(sleep).
  • 1 (checked) = 深度睡眠(deep sleep.)

如果您的设备不支持两种睡眠模式,则改变此位的值的效果是由当前处理器定义的。

SEVONPEND

发送待定位事件:

  • 0 (unchecked) = 只有启用的中断或事件才能唤醒处理器,禁用的中断除外。
  • 1 (checked) = 启用的事件和所有中断(包括禁用的中断)都可以唤醒处理器。

当事件或中断进入待处理状态时,事件信号会将处理器从 WFE 中唤醒。如果处理器没有等待事件,则事件会被记录并影响下一个 WFE。执行 SEV 指令或外部事件时,处理器也会被唤醒。

Configuration Control

显示配置和控制寄存器 (CCR) 设置。CCR 是只读寄存器。

SCB->CCR

显示位于内存地址 0xE000ED14 的 CCR 寄存器的内容(十六进制)。重置值为 0x00000200,但它是由实现的处理器定义的。

NONBASETHRDENA

指示处理器如何进入线程模式:

  • 0 (unchecked) - 当前没有异常激活时,处理器才能进入线程模式。
  • 1 (checked) - 处理器可以在 EXC_RETURN 值的控制下从任何级别进入线程模式。当处理器处于 Handler 模式并执行以下指令之一试图将 PC 设置为 EXC_RETURN 值时,会发生异常返回 (EXC_RETURN):
    • 加载 PC 的 LDM 或 POP 指令。
    • 以 PC 为目标的 LDR 指令。
    • 使用任意寄存器的 BX 指令。

USERSETMPEND

启用(选中时)对软件触发中断寄存器 (STIR) 的非特权软件访问。另请参阅 NVIC,软件中断触发器部分。

UNALIGN_TRP

启用未对齐访问陷阱:

  • 0(未选中)- 不捕获未对齐的半字和字访问。
  • 1(选中)- 捕获未对齐的半字和字访问。未对齐的访问会生成 UsageFault。未对齐的 LDM、STM、LDRD 和 STRD 指令。

DIV_0_TRP

当处理器执行除数为 0 的 SDIV 或 UDIV 指令时启用故障或暂停:

  • 0(未选中)- 不捕获除以 0 的情况;除以零将返回商 0。
  • 1(选中)- 捕获除以 0 的情况。

BFHFNMIGN

启用优先级为 -1 或 -2 的处理程序以忽略由加载和存储指令引起的数据总线故障。这适用于 HardFault、NMI 和 FAULTMASK 升级的处理程序:

  • 0(未选中)- 由加载和存储指令引起的数据总线故障会导致锁定。
  • 1(选中)- 以优先级 -1 和 -2 运行的处理程序忽略由加载和存储指令引起的数据总线故障。仅当处理程序及其数据位于绝对安全的内存中时,才将此位设置为 1。此位的正常用途是探测系统设备和桥接器以检测控制路径问题并修复它们。

STKALIGN

指示异常入口处的堆栈对齐:

  • 0(未选中)- 4 字节对齐。
  • 1(选中)- 8 字节对齐。

在异常入口处,处理器使用堆栈 PSR 的位 [9] 来指示堆栈对齐。从异常返回时,它使用此堆栈位来恢复正确的堆栈对齐。

DC(Cortex-M7 only)

启用 L1 数据缓存。此位是可选的: 0(未选中)- L1 数据缓存已禁用。 1(选中)- L1 数据缓存已启用。

IC(Cortex-M7 only)

启用 L1 指令缓存。此位是可选的: 0(未选中)- L1 指令缓存已禁用。 1(选中)- L1 指令缓存已启用。

BP(Cortex-M7 only)

它表示已启用分支预测。始终以 1 的形式读取。

参考资料

有关 CMSIS 中可用函数集(特别是 **WFE 和 **SEV),请参阅 CPU 指令的内部函数

嵌套向量中断控制器(NVIC)

Selected Interrupt

显示和更改所选中断或异常源的值。

显示的寄存器是 NVIC->IPR(用于异常)或 SCB->SHPR(用于中断)。

Enable

是中断使能控件。此控件对应列表中的 E 列。

Pending

表示中断正在等待服务(对于某些异常,这是只写 1)。此控件对应于列表中的 P 列。

Active

表示此中断正在被服务。此控件对应于列表中的 A 列。

Priority

是中断优先级,格式为:<优先级值> = <组优先级> s<子优先级>。组优先级决定中断的抢占。此控件对应于列表中的优先级列。 异常状态

每个异常都处于下列状态之一: Inactive - 异常不处于活动状态且不待处理。 Pending - 异常正在等待处理器处理。来自外设或软件的中断请求可以将相应中断的状态更改为待处理。 Active - 处理器正在处理但尚未完成的异常。一个异常处理程序可以中断另一个异常处理程序的执行。在这种情况下,两个异常都处于活动状态。 Active and pending - 处理器正在处理该异常,并且存在来自同一来源的待处理异常。

Interrupt Control & State

内存地址 0xE000ED04 处的中断控制和状态寄存器 (ICSR):

  • 为不可屏蔽中断 (NMI) 异常提供设置挂起位。
  • 为 PENDSV 和 SYSYTICK 异常提供设置挂起和清除挂起位。
  • 显示最高优先级待处理异常的异常编号。

SCB->ICSR

ICSR 的内容(十六进制)。

RETTOBASE

表示是否存在被抢占的活动异常:

  • 0 (unchecked) - 有被抢占的活动异常需要执行
  • 1 (checked) - 没有活动异常,或者当前正在执行的异常是唯一的活动异常。

ISRPREEMPT

下一个待处理的异常将被激活。

VECTACTIVE

活动异常的编号。数字 0 表示线程模式。

VECTPENDING

显示处于挂起状态且优先级最高的已启用异常的数量,包括 NMI 和故障。

ISRPENDING

异常待处理标志。显示至少有一个异常待处理,不包括 NMI 和故障。

Application Interrupt & Reset Control

内存地址 0xE000ED0C 处的 AIRCR 为数据访问和系统复位控制提供字节序状态。

SCB->AIRC

AIRCR 的内容(十六进制)。默认值为 0xFA050000。

VECTRESET

单击执行矢量复位请求。此位[0]读为 0。写入寄存器时,必须将 0 写入此位,否则行为不可预测。

VECTCLRACTIVE

单击可清除状态信息。

PRIGROUP

中断优先级分组字段由实现定义。此字段决定组优先级与子优先级的划分。

SYSRESETREQ

单击可发出外部信号以进行重置,调试除外。始终读取为零。

ENDIANNESS

显示字的有效字节顺序。是只读的。未选中时 = little-endian(小端模式);选中时 = big-endian(大端模式)。

Vector Table Offset

向量表偏移是位于内存地址 0xE000ED08 的可选寄存器。

SCB->VTOR

包含向量表设置。默认值为 0x00000000。

TBLOFF

显示中断向量表的偏移(看是下面基于 RAM 还是代码)。

TBLBASE

指示中断向量表表是位于代码中还是 RAM 中。

Software Interrupt Trigger

软件触发中断寄存器(STIR)位于内存地址 0xE000EF00。 当系统控制和配置中的 USERSETMPEND 位设置为 1 时,非特权软件可以访问 STIR。

SCB->STIR

包含十六进制的 STIR 值。写入 STIR 可从软件生成中断。默认值为 0x00000000。

INTID

触发中断的中断 ID,范围为 [0-239]。例如,值 0x03 指定中断 IRQ3。

参考

NVIC 相关函数

错误报告(Fault Reports)

故障状态对话框显示捕获非法内存访问和非法程序行为的故障异常。故障异常处理程序会检测以下情况:

  • MemManage - 检测对内存管理单元 (MPU) 中定义的区域的内存访问违规;例如,从仅具有读/写访问权限的内存区域执行代码。
  • BusFault - 检测指令提取、数据读/写、中断向量提取和中断(进入/退出)时的寄存器堆叠(保存/恢复)时的内存访问错误。
  • UsageFault - 检测未定义指令的执行、加载/存储多个未对齐的内存访问。启用后,将检测除以零和其他未对齐的内存访问。
  • HardFault - 是默认异常,可能由于异常处理期间的错误或由于异常无法通过任何其他异常机制管理而被触发。
  • DebugFault - 仅当调试停止时才出现。
  • Auxiliary BusFault - (Cortex-M7 only) 显示有关 BusFaults 的更多信息。

Memory Manage Faults

显示 MemManage 故障地址 (MMFAR) 和状态寄存器 (MMFSR) 设置。

MemManage 故障状态寄存器 (MMFSR) 指示内存保护单元 (MPU) 检测到的内存访问违规。仅允许特权访问。非特权访问会产生 BusFault。

SCB->MMFAR

显示位于内存地址 0xE000ED34 的 MemManage 故障地址寄存器(十六进制)的内容。重置值未知。MMFAR 包含生成 MemManage 故障的位置的地址。仅当 MMARVALID 设置为 1 时,此地址才有效。

SCB->CFSR

(MMFSR)显示 CFSR 寄存器中标识 MemManage 故障状态寄存器 (MMFSR) 的重要位。以下字段定义了 MMFSR 中有意义的位。

IACCVIOL

指令访问违规标志: 0 (unchecked) = 无指令访问违规故障。 1 (checked) = 处理器尝试从不允许执行的位置获取指令。异常返回堆栈的 PC 值指向错误指令。处理器尚未将错误地址写入 MMFAR。任何尝试获取 XN(永不执行)区域的指令时都会发生此错误情况,即使 MPU 已禁用或不存在。可能的原因:

  • 分支到 MPU 中未定义或定义为不可执行的区域。
  • 由于堆栈内容损坏导致返回无效。
  • 异常向量表中的条目不正确。

DACCVIOL

数据访问违例标志: 0 (unchecked) = 没有数据访问冲突故障。 1 (checked) = 处理器尝试在不允许操作的位置进行加载或存储。异常返回堆栈中的 PC 值指向出错的指令。处理器已将尝试访问的地址加载到 SCB->MMFAR 中。

MMRVALID

MemManage 故障地址寄存器(SCB->MMFAR)有效标志: 0 (unchecked) = SCB->MMFAR 中的值不是有效的故障地址。 1 (checked) =SCB->MMFAR 保存有效的故障地址。 如果发生 MemManage 故障并且由于优先级而升级为 HardFault,则 HardFault 处理程序必须将此位设置为 0。这可以防止在返回到其 SCB->MMFAR 值已被覆盖的堆叠活动 MemManage 故障处理程序时出现问题。

MUNSTKERR

从异常返回时,MemManage 出现故障: 0 (unchecked) = 无拆垛故障。 1 (checked) = 异常返回的出栈操作已导致一个或多个访问冲突。此故障与处理程序相关联,这意味着原始返回堆栈仍然存在。处理器尚未根据失败的返回调整 SP,也未执行新的保存。处理器尚未将故障地址写入 SCB->MMFAR。可能的原因:

  • 堆栈指针已损坏。
  • 执行异常处理程序期间,堆栈的 MPU 区域发生了变化。

MSTKERR

MemManage 在异常进入堆栈时出现故障: 0 (unchecked) = 无堆垛层错。 1 (checked) = 异常条目的堆栈已导致一个或多个访问违规。 SP 仍在调整,但堆栈上上下文区域中的值可能不正确。 处理器尚未将故障地址写入 SCB->MMFAR。 可能的原因:

  • 堆栈指针已损坏或未初始化。
  • 堆栈正在到达未被 MPU 定义为读/写内存的区域。

Bus Faults

显示总线故障地址 (BFAR) 和总线故障状态寄存器 (BFSR) 设置。

位于内存地址 0xE000ED29 的总线故障状态寄存器 (BFSR) 显示指令提取和数据访问导致的总线错误状态,并指示在总线操作期间检测到的内存访问故障。仅允许特权访问。非特权访问会产生总线故障。

SCB->BFAR

总线故障地址寄存器 (BFAR) 位于内存地址 0xE000ED38,包含生成精确数据访问总线故障的位置的地址(十六进制)。仅当 BFARVALID 设置为 1 时,此地址才有效。

SCB->CFSR

(BFSR)显示 CFSR 寄存器中用于标识总线故障状态寄存器 (BFSR) 的重要位。以下字段定义了 BFSR 中有意义的位。

IBUSERR

指令总线错误。记录指令预取时是否发生 BusFault。 0 (unchecked) = 没有指令总线错误。 1 (checked) = 指令总线错误。处理器在预取指令时检测到指令总线错误,但只有当它尝试发出错误指令时,它才会将 IBUSERR 标志设置为 1。当处理器设置此位时,它不会将错误地址写入 SCB->BFAR。可能的原因:

  • 例如,由于不正确的函数指针导致分支到无效的内存区域。
  • 由于堆栈指针或堆栈内容损坏导致返回无效。
  • 异常向量表中的条目不正确。

PRECISERR

精确数据总线错误: 0 (unchecked) = 没有精确的数据总线错误。 1 (checked) = 发生数据总线错误,异常返回堆栈中的 PC 值指向导致错误的指令。当处理器设置此位时,它会将错误地址写入 SCB->BFAR。

IMPRECISERR

不精确的数据总线错误: 0 (unchecked) = 没有不精确的数据总线错误 1 (checked) = 发生了数据总线错误,但堆栈帧中的返回地址与导致错误的指令无关。当处理器设置此位时,它不会将故障地址写入 SCB->BFAR。这是一个异步故障。

UNSTKERR

异常返回时出栈时发生 BusFault: 0 (unchecked) = 无拆垛故障。 1 (checked) = 异常返回的 unstack 已导致一个或多个 BusFault。此故障与处理程序相关联。这意味着当处理器设置此位时,原始返回堆栈仍然存在。处理器不会根据失败的返回调整 SP,不会执行新的保存,也不会将故障地址写入 SCB->BFAR。

STKERR

异常入口堆栈上的 BusFault: 0 (unchecked) = 无堆垛层错。 1 (checked) = 异常条目的堆栈导致一个或多个 BusFault。当处理器设置此位时,SP 仍会调整,但堆栈上上下文区域中的值可能不正确。处理器不会将故障地址写入 BFAR。可能的原因:

  • 堆栈指针已损坏或未初始化。
  • 堆栈正在到达未定义的内存区域。

BFARVALID

总线故障地址寄存器 (BFAR) 有效标志: 0 (unchecked) = BFAR 中的值不是有效的故障地址 1 (checked) = BFAR 保存有效故障地址。处理器在 BusFault 发生后设置此位,此时地址已知。其他故障可以将此位设置为 0,例如稍后发生的 MemManage 故障。如果发生 BusFault 并由于优先级而升级为 HardFault,则 HardFault 处理程序必须将此位设置为 0。

Usage Faults

UsageFault 状态寄存器 (UFSR) 包含某些指令执行错误和数据访问的状态。仅允许特权访问。非特权访问将生成 BusFault。

SCB->CFSR

(UFSR)显示位于内存地址 0xE000ED2A 的 UFSR 寄存器(十六进制)的内容。复位值为 0x00000000。

UNDEFINSTR

未定义指令。 0 (unchecked) = 没有未定义的指令。 1 (checked) = 尝试执行未定义的指令。设置此位置位时,异常返回堆栈的 PC 值指向未定义的指令。未定义的指令是处理器无法解码的指令。可能的原因:

  • 使用 Cortex-M 设备不支持的指令。
  • 内存内容不良或损坏。

INVSTATE

无效状态。 0 (unchecked) = 没有无效状态。 1 (checked) =尝试执行非法使用执行程序状态寄存器 (EPSR) 的指令。当此位置位时,异常返回堆栈中的 PC 值指向尝试非法使用 EPSR 的指令。可能的原因:

  • 将分支目标地址加载到 LSB=0 的 PC。
  • 异常或中断处理期间堆栈 PSR 损坏。
  • 向量表包含 LSB=0 的向量地址。

INVPC

无效的 PC 加载 UsageFault,由无效的 EXC_RETURN 值导致: 0 (unchecked) = 没有无效的 PC 负载。 1 (checked) = 由于无效的上下文切换,处理器试图将非法的 EXC_RETURN 值加载到 PC。当此位被设置时,为异常返回而堆栈的 PC 值指向试图执行非法 PC 加载的指令。可能的原因:

  • 由于堆栈指针、链接寄存器 (LR) 或堆栈内容损坏,导致返回无效。
  • PSR 中的 ICI/IT 位对于指令无效。

NOCP

无协处理器。处理器不支持协处理器指令: 0 (unchecked) = 尝试访问协处理器时未引发 UsageFault。 1 (checked) = 尝试访问不存在的协处理器。

UNALIGNED

未对齐的访问 UsageFault。 0 (unchecked) = 没有未对齐访问错误,或者未对齐访问捕获未启用。 1 (checked) = 未对齐的内存访问。通过设置 SCB->CCR 中的 UNALIGN_TRP 位来启用未对齐访问的捕获。无论 UNALIGN_TRP 位的设置如何,未对齐的 LDM、STM、LDRD 和 STRD 指令始终会出错。

DIVBYZERO

除以零 UsageFault。 0 (unchecked) =无除以零故障,或未启用除以零捕获。 1 (checked) =执行除数为 0 的 SDIV 或 UDIV 指令。当处理器将此位置为 1 时,异常返回堆栈中的 PC 值指向执行除以零的指令。通过将 SCB->CCR 中的 DIV_0_TRP 位设置为 1,启用除以零的捕获。

Hard Faults

显示 HardFault 状态寄存器 (HFSR) 的设置。仅允许特权访问。非特权访问会生成 BusFault。

SCB->HFSR

显示位于内存地址 0xE000ED2C 的 HFSR 寄存器(十六进制)的内容。复位值为 0x00000000。此寄存器可读,可写以清除。这意味着,寄存器中的位可以正常读取,但向任何位写入 1 都会将该位清除为 0。

VECTTBL

表示异常处理期间由于向量表读取错误而导致的故障: 0 (unchecked) = 没有读取向量表。 1 (checked) = 读取向量表时。设置此位后,异常返回堆栈中的 PC 值指向被异常抢占的指令。此错误始终为 HardFault。

FORCED

表示由于可配置优先级的故障升级而产生的强制 HardFault,该故障无法处理(可能是由于优先级原因,也可能是被禁用)。 0 (unchecked) = 没有强制的 HardFault。 1 (checked) =强制升级 HardFault。设置此位置位时,HardFault 处理程序必须读取其他故障状态寄存器以查找故障原因。

DWTRAP

数据观察点 (DW) 标志使处理器在当前指令或下一条指令处停止。 0 (unchecked) = 不是 DW 匹配。 1 (checked) = DW 匹配。

DEBUGEVT

指示何时发生调试事件。写入寄存器时,必须将 0 写入此位,否则行为不可预测。 0 (unchecked) = 没有发生调试事件。 1 (checked) = 发生调试事件,DFSR 已更新。

Debug Faults

显示调试故障状态寄存器 (DFSR) 设置。

SCB->DFSR

显示位于内存地址 0xE000ED30 的 DFSR 寄存器(十六进制)的内容。复位值为 0x00000000。该寄存器是粘性读/写清除寄存器。这意味着,它可以正常读取。向某个位写入 1 会清除该位。

HALTED

0 (unchecked) = 没有停止请求。 1 (checked) = 由 DAP 请求停止或使用调试步骤命令停止。

BKPT

BKPT 标志由 BKPT 指令的执行或其地址触发断点比较器匹配的指令设置。当处理器暂停时,返回 PC 指向断点指令的地址。 0 (unchecked) = 没有 BKPT 指令或硬件断点匹配。 1 (checked) = BKPT 指令或硬件断点匹配。

DWTRAP

数据观察点 (DW) 标志使处理器在当前指令或下一条指令处停止。 0 (unchecked) = 不是 DW 匹配。 1 (checked) = DW 匹配。

VCATCH

当设置了 VCATCH 标志时,调试异常和监视器控制寄存器中的标志也会被设置,以指示向量捕获的类型。 0 (unchecked) =没有发生向量捕获。 1 (checked) = 发生向量捕获。

EXTERNAL

当设置了外部调试请求标志时,处理器将在下一个指令边界处停止。 0 (unchecked) = 没有发生 EDBGRQ。 1 (checked) = EDBGRQ 已停止核心。

Auxiliary Bus Fault

显示可选的辅助总线故障状态寄存器 (ABFSR) 设置(Cortex-M7 only).

SCB->AFSR

显示位于内存地址 0xE000EFA8 的 ABFSR 寄存器(十六进制)的内容。复位值为 0x00000000。ABFSR 存储有关异步总线故障源的信息。如果发生总线故障,故障处理程序可以读取此寄存器以确定哪个总线接口触发了故障,如果源是 AXIM 接口,则接收到哪种错误类型。ABFSR[4:0] 字段保持有效,直到通过向 ABFSR 写入任何值将其清除。您的实现中可能不存在这些接口。

AXIMTYPE

指示 AXIM 接口上的故障类型。仅当 AXIM = 1 时,该值才有效。

ITCM

ITCM 接口异步故障。

DTCM

DTCM 接口异步故障。

AHBP

AHBP 接口异步故障。

AXIM

AXIM 接口异步故障。

EPPB

EPPB 接口异步故障。