你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32 HardFault_Handler解决方法

[复制链接]
eefishing 发布时间:2017-6-6 13:39
最近在搞stm32的IAP功能,在app运行的时候进入HardFault_Handler函数。


程序介绍:
1.bootloader程序为串口接收app应用程序的bin文件,用写flash函数(参考正点原子的IAP程序)将接收到的bin文件写到app区域,然后跳转到app应用程序执行。
2.应用程序为简单的测试程序,在主程序中500ms闪灯。


问题:
bootloader程序可以正常接收bin文件,正常跳转到app程序区域,在app执行过程中,初始化程序会进入HardFault_Handler函数。
解决方法:
首先将bootloader程序和app应用程序通过jlink写到单片机中,app应用程序区域设置正确,程序写的地方就正确。然后用jlink仿真app应用程序,仿真app程序需要注意bootloader程序能够正常跳转到app程序中,我在此为了仿真初始化完成后就直接跳到APP程序中了。
如下图所示(bootloader主程序):
11.png
app应用程序主程序
12.png
409行为app中断向量表地址

接下来直接在app应用程序中debug调试程序,因为bootloader程序可以直接跳转,所以可以跑到应用程序中,在HardFault_Handler函数处加断点,打开view下面的call stack windows框(查看出错时栈的情况),如下图所示:
13.png
14.png


现在进入错误处理的函数中,看看栈窗口的情况:
15.png
可以看到此时有串口中断,还有定时器8的初始化,再回过头来看一下我的app应用的初始化过程,初始化定时器8前面,没有初始化过串口,而且应用程序中,串口初始化是被屏蔽的,所以这里不应该出现串口中断压入栈中,那串口中断是从哪里来的,往前找会发现,在bootloader程序中,我打开串口中断接收的数据,在跳转之前没有关闭串口中断,在这段程序中串口中断还存在,还在起作用,而且中断向量已经发生偏移,不是在应用程序的程序指针范围之内,所以程序指针跑飞了。



基于以上分析,我在bootloader的程序中,在跳转函数之前加一句关闭串口中断的语句,如下图所示:
16.png


添加函数HAL_NVIC_DisableIRQ(USART1_IRQn);关闭串口中断,再来测试一下,发现应用程序能够正常工作了。
所以在bootloader中跳转之前将打开过的中断全部关闭,在应用程序中用到时再次初始化。


以上是在这种情况下的解决方法,可以用其他情况下查找HardFault_Handler的问题出错位置,一定要注重栈窗口中的每一个函数及函数内部的参数,有时不一定是函数出现错误,也有可以是定义的变量超出范围,这时需要点开函数的+号,查看每一个变量是否合理,如下图所示:
17.png
查看函数里面的变量,以上就是查找问题的方法,需要灵活应用。


转自:李蛟23的博客



评分

参与人数 2 ST金币 +30 收起 理由
MrJiu + 10 很给力!
creep + 20 很给力!

查看全部评分

1 收藏 1 评论1 发布时间:2017-6-6 13:39

举报

1个回答
creep 回答时间:2017-6-6 14:05:48
感谢分享!!!!

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版