请阅读【嵌入式开发学习必备专栏 之 ARM Cortex-Mx专栏】
文章目录
-
- 背景
- 异常使能配置
背景
由于文章【ARMv8M Cortex-M33 系列 7.2 – HardFault 问题定位 1】 中提到了HardFault 的发生是由于其它异常所升级导致的,所以就需要调查下如何是能其它异常中断。
异常使能配置
在 ARM Cortex-M33 核心上启用
- 设置 SCB 中的 SHCSR (System Handler Control and State Register): -
SCB->SHCSR 寄存器包含控制系统处理程序(如UsageFault 、MemManage 和BusFault )的使能位。 - 配置对应的使能位: - 通过设置
SCB->SHCSR 中的以下位来使能对应的异常:
SCB_SHCSR_MEMFAULTENA_Msk :使能MemManage 异常。SCB_SHCSR_BUSFAULTENA_Msk :使能BusFault 异常。SCB_SHCSR_USGFAULTENA_Msk :使能UsageFault 异常。
以下是相应的代码示例:
#include "core_cm33.h" // 包含 CMSIS 核心寄存器定义和功能 void EnableFaults(void) { // 使能 MemManage 异常 SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; // 使能 BusFault 异常 SCB->SHCSR |= SCB_SHCSR_BUSFAULTENA_Msk; // 使能 UsageFault 异常 SCB->SHCSR |= SCB_SHCSR_USGFAULTENA_Msk; }
当你运行上面的代码后,
还有一点需注意的是,在默认情况下,Cortex-M 处理器的
启用这些异常后,你还需要实现相应的异常处理函数(例如
如果使用的是 RT-Thread 或其他类似的实时操作系统,通常这些异常处理函数已经由操作系统提供,或者你可以在操作系统框架内自定义它们。
【ARMv8M Cortex-M33 系列 7.2 – HardFault 问题定位 1】 中提到了提到了通过 CFSR 寄存器可以看到UFSR 位域 INVPC 置位了,所以接下来又需要调查下,这个是个什么东东?
UFSR 位域 INVPC 中的 “Invalid PC flag. Sticky flag indicating whether an integrity check error has occurred.
在 ARM Cortex-M33 微控制器系列中,
当
-
PC 被加载了一个未能正确对齐的地址。在 Cortex-M33 架构中,所有指令必须是 2 字节或 4 字节对齐的。如果 PC 的值不是 2 字节或 4 字节对齐的,会触发
INVPC 错误。 -
PC 被加载了一个不能作为指令执行的地址。例如,如果 PC 被设置为指向一个数据区域或者一个禁止执行的内存区域,将无法执行有效指令,从而导致完整性错误。
如果在 Cortex-M33 微控制器上触发了一个
- 检查程序计数器的当前值,查看它是否指向了一个有效的指令地址。
- 确认最近执行的指令和代码路径,检查有无可能导致 PC 被错误加载的逻辑。
- 审查你的代码,确保所有函数指针、中断向量和跳转地址都是有效且正确对齐的。
- 使用调试器进行单步执行,以更精确地定位导致 PC 载入无效地址的具体指令。
由于