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

stm32 HardFault_Handler解决方法

[复制链接]
eefishing 发布时间:2017-6-6 13:39
最近在搞stm32的IAP功能,在app运行的时候进入HardFault_Handler函数。
$ A# j8 T  `. n$ @
$ r! E# M) V4 l& h
% S+ o- T6 ]! j0 k. g
程序介绍:/ s3 f& x/ x% @) B/ F: B- B  ]
1.bootloader程序为串口接收app应用程序的bin文件,用写flash函数(参考正点原子的IAP程序)将接收到的bin文件写到app区域,然后跳转到app应用程序执行。
/ l' H! e% a6 e/ D: C2.应用程序为简单的测试程序,在主程序中500ms闪灯。
- D0 o' k5 O) A2 V% e: ^+ G$ b, H9 g* G- g
3 ^8 v7 i2 v4 {- P9 |4 L  o3 k5 D
问题:
, n7 U' O8 W' w  u& M0 J4 w) b- ~bootloader程序可以正常接收bin文件,正常跳转到app程序区域,在app执行过程中,初始化程序会进入HardFault_Handler函数。$ I& y, \9 O: g: \/ H
解决方法:
  M- I  q. z+ i2 G' ^& ]首先将bootloader程序和app应用程序通过jlink写到单片机中,app应用程序区域设置正确,程序写的地方就正确。然后用jlink仿真app应用程序,仿真app程序需要注意bootloader程序能够正常跳转到app程序中,我在此为了仿真初始化完成后就直接跳到APP程序中了。& j; f# x4 W+ f; O5 c$ F) Y9 A8 k* `
如下图所示(bootloader主程序):9 c( D2 p( j1 i  E
11.png
6 ?( W  J/ L: s/ {. bapp应用程序主程序0 |2 C0 @  C# n1 s4 ~" a8 d+ t
12.png + W# q3 u8 v) ]2 Q0 d
409行为app中断向量表地址

1 E9 c; s" H/ D) `% f接下来直接在app应用程序中debug调试程序,因为bootloader程序可以直接跳转,所以可以跑到应用程序中,在HardFault_Handler函数处加断点,打开view下面的call stack windows框(查看出错时栈的情况),如下图所示:
$ z7 Z8 H7 T: M$ f  N( x5 P- D 13.png
0 l2 m2 |* f# T  W5 N
14.png
& c* S7 z* f" B) p5 E* q4 |( f$ A! [- }. B; }
4 K3 _: Y1 j8 g0 F
现在进入错误处理的函数中,看看栈窗口的情况:8 g) l: o" a4 k7 R% p
15.png
4 P: Y2 D# H! z( V* p# a7 d3 O. t- j: ]9 G可以看到此时有串口中断,还有定时器8的初始化,再回过头来看一下我的app应用的初始化过程,初始化定时器8前面,没有初始化过串口,而且应用程序中,串口初始化是被屏蔽的,所以这里不应该出现串口中断压入栈中,那串口中断是从哪里来的,往前找会发现,在bootloader程序中,我打开串口中断接收的数据,在跳转之前没有关闭串口中断,在这段程序中串口中断还存在,还在起作用,而且中断向量已经发生偏移,不是在应用程序的程序指针范围之内,所以程序指针跑飞了。

7 S' @0 i' f5 p1 f3 D; [! F5 c4 Y& B1 d: b# y8 {5 Z

( M6 Y; U3 V2 `8 D1 \基于以上分析,我在bootloader的程序中,在跳转函数之前加一句关闭串口中断的语句,如下图所示:: T- N5 ~$ ?9 L' D* x% R
16.png * G* d$ D, Z- k$ S5 N# B* H
: n7 e) B) j: N) F
+ ]$ S' |! e, X  U* ?% d. R
添加函数HAL_NVIC_DisableIRQ(USART1_IRQn);关闭串口中断,再来测试一下,发现应用程序能够正常工作了。
$ i+ v3 K1 q% N: W9 D. N所以在bootloader中跳转之前将打开过的中断全部关闭,在应用程序中用到时再次初始化。- ]7 |5 [3 ]9 K0 P. {
6 w0 V+ k6 p2 L; q3 H3 K

4 Y8 z! u9 i& h: Q8 r; P( S以上是在这种情况下的解决方法,可以用其他情况下查找HardFault_Handler的问题出错位置,一定要注重栈窗口中的每一个函数及函数内部的参数,有时不一定是函数出现错误,也有可以是定义的变量超出范围,这时需要点开函数的+号,查看每一个变量是否合理,如下图所示:
3 f1 X( ~( H  l! j/ U# {) k7 q 17.png 1 s6 k: v! l) ]5 r3 }9 Z' K* M
查看函数里面的变量,以上就是查找问题的方法,需要灵活应用。
$ F' w4 w# ]5 T5 A+ U5 Z7 x; g

9 A8 ]) H" g9 c: Z3 ~8 `& P转自:李蛟23的博客+ X. |. Q4 Q4 a, u# K8 Y" `: v' s
! U* G" U9 F" ]% S8 J& [; O+ O
$ \' O: l1 F7 s7 W  o; J; D
$ h1 v9 }, N- W+ ~

评分

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

查看全部评分

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

举报

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

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版