[应用相关] STM32跳至硬件错误中断(HardFault_Handle) 原因及参考

[复制链接]
4218|19
 楼主| 花间一壶酒sd 发表于 2022-7-26 14:21 | 显示全部楼层 |阅读模式
一、HardFault_Handle引起的原因:
1、遇到错误问题是数据类型不对,导致该步骤永远不能执行到,跳至硬件错误中断;所以硬件中断可尝试查找数据类型错误。

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

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

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

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

 楼主| 花间一壶酒sd 发表于 2022-7-26 14:22 | 显示全部楼层
二、解决方法

1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。
2123362df883f51e42.png
 楼主| 花间一壶酒sd 发表于 2022-7-26 14:24 | 显示全部楼层
1.2 在Keil菜单栏点击“View”——“Registers Window”,在寄存器查看窗口查找R14(LR)的值。如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值,如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值。我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。
7237162df88a0986c2.png
 楼主| 花间一壶酒sd 发表于 2022-7-26 14:25 | 显示全部楼层
1.3 在Keil菜单栏点“View”——“MemoryWindows”——“Memory1”,在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。地址一般以0x08开头的32位数。
 楼主| 花间一壶酒sd 发表于 2022-7-26 14:26 | 显示全部楼层
 楼主| 花间一壶酒sd 发表于 2022-7-26 14:31 | 显示全部楼层
1.4 在Keil菜单栏点击“View”——“Disassembly Window”,在“Disassembly”窗口中右击,在下拉菜单中选择“Show Disassemblyat Address...”。在弹出框“Show Code atAdress”的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。仔细查看附近区域的相关代码来排查错误具体原因。
 楼主| 花间一壶酒sd 发表于 2022-7-26 14:38 | 显示全部楼层
vivilyly 发表于 2023-2-2 13:28 | 显示全部楼层
出异常一般都是HardFault_Handler.  
lihuami 发表于 2023-2-4 15:31 | 显示全部楼层
常规的指针错误吧               
eefas 发表于 2023-2-6 13:10 | 显示全部楼层
stm32f10x_it.c里面有个HardFault_Handler函数,把while(1)去掉就可以了
hearstnorman323 发表于 2023-2-7 20:12 | 显示全部楼层
遇到这种情况一般无非以下两种原因:第一、内存溢出或者访问越界
iyoum 发表于 2023-2-8 19:17 | 显示全部楼层
先看看是不是你任务栈空间设置太小,溢出了?
uiint 发表于 2023-2-10 11:35 | 显示全部楼层
有可能内存溢出或者访问越界。              
primojones 发表于 2023-2-14 12:06 | 显示全部楼层
果上电后, 在调试时, 执行单步, 会在不确定位置的地方产生HardFault_Handle
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

1219

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部