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

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扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版