ARM Coretex-M核心单片机(STM32)分析hardfault的原因

1. 前提基础知识(ARM M核异常 压栈流程)

M核栈增长方向是地址逐渐减小的(TIPS:有的架构的处理器是增大的例如8051内核,而有的像ARM A核心是可设置的 可以增大也可以减小)

ARM Coretex-M核心常用的有M0 M3 M4,下图第一个为M3的压栈情况,M4带FPU和浮点寄存器的并不一样

M3的假设hardfault ISR里边就有个while(1);语句,那看SP的栈顶值,从栈顶开始数算第一个向上高地址方向数到第六个就是LR的值,把或者值读出来赋值给PC(定义个函数指针),就可以跳转到问题发生处了,然后结合hardfault状态寄存器(0XE000ED2C,SCB->HSFR)的值 大概能分析出产生hardfault的原因

**下图为M4核的压栈情况,因为带有浮点寄存器所以压栈的内容也多 **

ARM CM4核心带浮点处理器FPU的,压栈的东西还不一样


进入hardfult后看MSP或者SP的值,看下边第二章图如果hardfult里边啥都没有,就只有个while(1){} 可以用第二张图判断SP+20里边存储的就是LR寄存器的值,也就是产生hardfault前导致的问题的地方,把这个值像第一张图一样写给PC就能定位到因为哪里产生的hardfault,

现在还在推出来个类似的公式解决方法,发现函数里边写的东西越多函数栈指针会变化,也就不能直接取*(SP+24)|(SP+23)|(SP+22)|*(SP+21),拼凑出来的值就是LR的值可以直接赋值给PC,定义个函数指针给赋值了,在调用在hardfault里边直接就可以跳过去

公式化的方法(待在M3内核上验证 理论上来说MSP是+0x14的),把下列代码替换掉原来的HardFault_Handler ISR

c 复制代码
/*----------------hardfault 调查原因方案,需要debug 单步执行--------------------*/
void(*f1)(void);
uint32_t result;

void HardFault_Handler(void)
{
	result= __get_MSP()+0x1C; //实际操作Arm Coretex-M0核心的+0x1c,M3核的+0X14
	f1=*((uint32_t*)result);
	f1();

	while (1);
}
/*----------------hardfault 调查原因方案,需要debug 单步执行--------------------*/

ARM官方给出的hardfault 原因分析方法


总结下来就是利用处理异常时候会进行压栈处理,也会把LR的值压进去,然后分析栈中的LR的值,设置PC跳到导致产生hardfault的地方,然后结合上边的hardfault状态寄存器进行分析问题的具体原因

<引流>

Github: HardFault问题定位与分析

知乎: ARM Coretex-M核单片机,例如STM32单片机遇到HardFault问题应该如何解决?

相关推荐
点灯小铭1 小时前
基于单片机的电子琴设计与乐曲存储播放实现
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
hemama_2 小时前
STM32F103VET6开发板例程(一)-LED
stm32·单片机·嵌入式硬件
夜月yeyue2 小时前
Linux 内核驱动加载机制
linux·服务器·stm32·嵌入式硬件
炸膛坦客2 小时前
FreeRTOS 学习:(十七)“外部中断”和“内核中断”的差异,引入 FreeRTOS 中断管理
stm32·freertos·实时操作系统
奋斗的牛马2 小时前
FPGA--zynq学习 PS与PL交互(二) HP接口
单片机·嵌入式硬件·学习·fpga开发·信息与通信
ACP广源盛139246256734 小时前
GSV1016/ACP#HDMI2.0 HDCP1.4 发射器(TTL/LVDS 输入 + 音频插入)技术解析
单片机·嵌入式硬件·音视频
d111111111d5 小时前
STM32中为什么会有APB1和APB2两个外设有什么区别
笔记·stm32·单片机·嵌入式硬件·学习
ACP广源盛139246256735 小时前
GSV6505F---1 In to 4 Out HDMI 2.1 Splitter with Embedded MCU
单片机·嵌入式硬件·音视频
ThreeYear_s6 小时前
【FPGA+DSP系列】——CCS联合proteus仿真DSP工程,以TMS320f28027芯片为例,LED闪烁仿真。
单片机·fpga开发·proteus
2501_925317136 小时前
【底层奥秘与性能艺术】让 RTOS 在 48 MHz MCU 上跑出 0.5 µs 上下文切换——一场从零开始的嵌入式“时间革命”
单片机·嵌入式硬件·#嵌入式·#嵌入式开发·#rtos