STM32 出现 hardfault_handler 处理方法

一、Hardfault_handler产生原因 

1、遇到错误问题是数据类型不对,导致该步骤永远不能执行到,跳至硬件错误中断;所以硬件中断可尝试查找数据类型错误。

2、堆栈设置错误也会跳至hardwarefault;

3、如果上电后, 在调试时, 执行单步, 会在不确定位置的地方产生HardFault_Handle, 检查一下你的时钟配置(外部晶振频率, SysTemInit/PLLConfig相关函数以及晶振频率宏定义), 可能是超频了...导致了STM32不稳定.

4、如果在使用某些参数时,使用的类型与其定义的类型不同,也可能导致出现跳转hardfault,这种情况下, 一般是不固定的跳转hardfalt,排查问题较麻烦;

5、如果你使用片上flash做参数存储,那么你需要注意了,参数存储区最好从flash的后部往前存,避免参数区与代码区的互相覆盖。如果参数被覆盖了,或者代码被覆盖了,这也会导致跳转hardfault

二、通过Keil调试问题定位问题位置

 void HardFault_Handler(void)
{
    /* 用于确认进入HardFault问题位置 */
    uint32_t r_psp, r_msp;
    r_psp = __get_PSP();
    r_msp = __get_MSP();
    /*
        1.读取PSP和MSP的值,通过和SP值进行对比,确认当前是指向PSP还是MSP
        2.在Memory中打开存储位置,找到08开头格式的地址
        3.在Disassembly输入08开头格式的地址,定位出现问题的具体位置    
    */
    
    /* if Hard Fault exception occurs, go to infinite loop */
    while (1) {
    }
}

你可能感兴趣的:(STM32单片机,stm32,单片机,arm)