STM32 Cortex-M3 Hard Fault Hard fau lt (硬错误,也有译为硬件错误的)是在STM32(如无特别说明,这里的STM32指的是Cortex -M3 的核)上编写程序中所产生的错误,造成Hard Fau lt 错误的原因也是最为纷繁复杂的。由于能导致该错误的原因很多,所以一但出现,比较难找到其原因。网上有很多类似的这种方法,现在我将其稍加整理,并结合我曾经遇到过的问题,详细说明。 硬fau lt 是总线fau lt、存储器管理fau lt 以及用法fau lt 上访的结果。如果这些 fau lt 的服务例程无法执行,它们就会成为“硬伤” — — 上访(escalation)成硬fau lt。另外,在取向量(异常处理是对异常向量表的读取)时产生的总线fau lt,也按硬fau lt 处理。在NVIC 中有一个硬fau lt 状态寄存器(HFSR),它指出产生硬fau lt 的原因。如果不是由于取向量造成的,则硬fau lt 服务例程必须检查其它的fau lt 状态寄存器,以最终决定是谁上访的。 1 寄存器描述 首先查看硬故障寄存器,判别原因。 对于调试故障,有个调试故障寄存器,在0x E000ED30 处,有详细介绍,不做探讨; 对于取中断发生的,有两类原因,一是在取向量过程中发生总线 fau lt,二是向量表偏移量设置有误。 本文重点介绍位 30 所示的,上访类错误。 这样 Fau lt 类异常有了三类,用法错误,存储管理错误,总线错误。 对于这些寄存器详尽的描述,见权威指南。 2 确定发生错误的地方 2.1 查找出错原因 Cortex -M3 有双堆栈功能,在带有操作系统时,一般都会使用。在Keil 软件使用 JTAG调试为例,系统的启动文件中,将断点打在下面 4 个地方。 HardFau ltEx ception B HardFau ltEx ception MemManageEx ception B MemManageEx ception Bu sFau ltEx ception B Bu sFau ltEx ception UsageFau ltEx ception B UsageFau ltEx ception 程序跑飞以后,就会停在上面的4 个断点的一个地方。可以通过两种方式查找原因。 第一种,在KEIL 软件下,利用软件提供的功能查找故障原因。 在点出的窗口中,可以大体确定是哪个寄存器、什么原因造成了 Hard Fault。 第二种,通过在内存观察窗口,直接输入上面那些寄存器的值来确定,通过观看寄存器那个位被置 1 了,确定出错原因。 2.2 确定出错地方 然后查看左侧寄存器栏中 Banked 确定现在使用的是那个堆栈,MSP 或者是 PSP,确定以后,在内存查看窗口,输入...