欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

stm32进入硬件错误中断hardfault的原因剖析以及如何定位(必看)

最编程 2024-08-13 15:31:57
...


指令集方面:arm一般高端处理器,比如cortex-a系列,都是32位的arm指令。而cortex-m0,1,3,4等低端处理器,也叫做单片机,为了增加代码密度(同样存储器内可以存更多指令),用的是thumb指令集(而且仅支持这个指令集),这个指令集大多数指令是16位的,少数是32位的。这就是为什么上面的调试图中,看到指令都是两个字节,而有的是4个字节。比较老的arm7,arm9等处理器,支持thumb指令和arm指令,需要通过指令告诉处理器,显式的进行指令转换,这个因此需要编译器提供支持。

注意:stm32f1(cortex-m3内核)单片机,仅支持thumb指令,在blx rx跳转指令执行时,会坚持rx寄存器存的地址,的最低为是不是1,如果不是,那么stm32会认为我们企图切换到arm指令,但是arm指令stm32不支持,因此会跳入hardfault硬件错误中断。stm32进入硬件错误中断时候,会在相应的状态指示寄存器里置为,用来提醒用户,是什么问题导致的错误。

只有三种错误类型,但是都会进入产生硬件错误中断。

HardFault错误

这个会在SCB->HFSR寄存器中通过位来标识产生的是什么错误,我们可以在进入了硬件错误中断,查看该寄存器的位来知道发生的是什么错误类型。具体哪位是干嘛的,自己查查Cortex-m3与m4权威指南这本书,讲得真心不错。

1. MemManage错误:存储器管理错误

存储器访问越权,写入MPU保护的只读区域,压栈错误等等。

会在SCB->CFSR寄存器第一个字节显示

2.Bus总线错误

比如访问了非法的存储器位置等。

会在SCB->CFSR寄存器第二个字节显示

3.Usage使用错误

比如非对齐访问,试图切换到arm指令状态等,我上面说的就是这个错误。

会在SCB->CFSR寄存器高半字显示

如果我们在keil mdk中进行调试,可以在HardFault函数处打断点,进入后,菜单栏选择Peripherals -> Core Peripherals -> Fault reportes窗口,看到各个错误寄存器的可视化信息显示,如下图:我这个错误就是由于rx = 20007800, blx rx, 地址rx中的地址最低为不为1,因此出现了使用错误,这个位表示我试图切换到arm指令,因此产生了错误。

stm32进入硬件错误中断hardfault的原因剖析以及如何定位(必看)_arm开发