您的当前位置:首页正文

STM32 Cortex-M3 HardFault异常定位

2024-12-02 来源:个人技术集锦


1 Fault类异常

Cortex-M3的Fault异常分为:

  • 总线Fault
  • 存储器管理Fault
  • 用法Fault
  • 硬件Fault

1.1 总线Fault

这里引用《Cortex-M3权威指南》说法:

1.2 存储器管理Fault

这里引用《Cortex-M3权威指南》说法:

1.3 用法Fault

这里引用《Cortex-M3权威指南》说法:

1.4 硬件Fault

硬件Fault也就是我们所说的HardFault,只要产生了总线、存储器管理、用法Fault其中之一,就会上报给硬件Fault,所以,最终的Falut我们都可以通过HardFault查看。

2 Core Registers

讲了几种Fault之后,我们需要了解一些基本的内核寄存器,后续查找Fault提供帮助。

2.1 R14(LR)寄存器

注意:在RAM上编程时,应尽量只使用寄存器保存中间结果,迫不得已时才访问内存。

2.2 R15(PC)寄存器

当中断来临的时候,R0-R3、R12、LR、PC、xPRS寄存器会自动的压栈,如果中断中使用了其它寄存器,在进入中断之前,也会对使用到的寄存器自动的压栈。

3 HardFault处理原理

4 真实项目调试

真实项目中,我们大多不必关心Fault状态寄存器的值,因为只要我们定位到错误的代码的位置,我们大致都能知道是什么错误了。

1. 首先工程跑到hardfault了;

2. 通过SP指针找到PC的值为0x08000046,LR的值为0x08001DEB,可知程序在执行了0x08000046指令之后就进入了HardFault,此时程序不会执行0x08001DEB这条指令。如果程序没有进入HardFault,那么子函数就会返回0x08001DEB这条指令。

显示全文