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

[转]STM32硬件错误HardFault_Handler的处理方法

[复制链接]
shenxiaolin_mai 发布时间:2018-12-9 16:18
本文为CSDN引用,过来给大家看看,很有帮助的!!!!- y: u6 m6 q# Q
原文地址如下:连接
! c( i6 M3 V5 _, u! k* h% x! Y0 B$ Z; {
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。这说明STM32出现了硬件错误。
8 X2 X+ O) }6 g7 \& p( \* V 1.jpg ( l: ?& T+ O: U3 F# \

8 a- q5 {& A  C- T  `! c- R& ?* Q        STM32出现硬件错误可能有以下原因:) J+ r5 d8 ]5 J0 ]. c4 [
( L; N4 X) O, p% S5 \8 D% i' y* o
        (1)数组越界操作;! S; V# g5 ]0 Z8 j  X0 [7 f
  p, }" H# m, a9 h
        (2)内存溢出,访问越界;
; G) a: Z% A/ V9 L3 |' {
) u1 S6 V+ `) f  M' Y  _        (3)堆栈溢出,程序跑飞;+ U6 o# r' e1 X9 x5 B
' Y. K9 u& y* |6 b
        (4)中断处理错误;" ?/ i9 B  R5 {  h+ Q5 U# T
6 k3 I0 a$ Y& G4 {, O
        遇到这种情况,可以通过以下2种方式来定位到出错代码段。
7 Q$ D4 c7 {2 w9 ~+ Z
5 F' T& j9 G+ J6 x, }: Y2 b7 Y6 q, ]9 t$ j% a6 X, e

( a4 S! y( O2 h方法1:
5 D) Y( K1 {/ A2 D& g
" q0 Q- S. t: R% o8 p      1.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。" W9 a1 \6 {8 U
3 c" q+ H0 X4 C
2.jpg ( g- H9 J( w0 d/ W$ m$ U

' \1 |/ z& j8 O& H$ A/ Z
( n- w2 H2 u: x6 k$ h  q; g. Y
7 J: D+ Z4 B& g4 m6 b4 |3 f, `      1.2 在Keil菜单栏点击“View”——“Registers Window”,在寄存器查看窗口查找R14(LR)的值。如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值,如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值。我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。5 B$ W; y  T+ z  S
3.png 7 p7 e3 o' Y1 X% l
9 ~& n4 c$ k, C4 s
      1.3 在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”,在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。地址一般以0x08开头的32位数。本例中,地址为0x08003CB9。
' S: {. {$ {, ]# [6 ~  @& }& n9 M# n$ l& S4 }5 y
0 [" X$ \9 z* v  I
4.png
( }& d7 }0 C. s4 L( ?0 Z
# j/ I% q( n4 W* j( W5 p6 x9 k( D, E8 l
      1.4 在Keil菜单栏点击“View”——“Disassembly Window”,在“Disassembly”窗口中右击,在下拉菜单中选择“Show Disassemblyat Address...”。在弹出框“Show Code atAdress”的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。仔细查看附近区域的相关代码来排查错误具体原因。1 C; y, X1 ?# F0 F' `) U$ ?2 N, U
1 G4 o6 o' \1 h# c6 T
5.jpg
+ \8 O$ h+ P6 {
$ ]0 P5 g9 N# F4 m
$ Q5 ]- |& N6 z9 }1 s$ v$ l2 Q' q- ~7 m
方法2:9 q$ l+ C  @6 Y- D+ S
$ w4 U8 I" B2 F$ O/ y
      2.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。- F# A) b' f  R! @2 L& Y
3 H# S. h5 l- z; V
6.jpg & ~$ Y4 @" k: x/ q; }
/ V$ q3 G; N2 u: H0 Q/ i
      2.2 在Keil菜单栏点击“View”——“Call Stack Window”弹出“Call Stack + Locals”对话框。然后在对话框中右键选择“Show Caller Code”,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。1 D+ `" W' D1 |% A3 v) u5 B
---------------------
( h* h# y* |) d7 d. O& e3 X作者:electrocrazy
+ l& _, D1 s1 P" D+ g1 k来源:CSDN
0 Z3 w( I) @# N2 L+ ]. J原文:http://blog.csdn.net/electrocrazy/article/details/78173558
  D& V, ^, x9 Q8 g版权声明:本文为博主原创文章,转载请附上博文链接!$ }; E! o4 N# E7 U  u

" F0 g$ R! N7 K

评分

参与人数 1 ST金币 +20 收起 理由
STMCU + 20

查看全部评分

收藏 2 评论3 发布时间:2018-12-9 16:18

举报

3个回答
shaoyang_v 回答时间:2018-12-10 10:11:27
很棒  正好需要
shenxiaolin_mai 回答时间:2018-12-10 13:27:23
shaoyang00 发表于 2018-12-10 10:11
0 p. M5 O# T! r3 f8 t3 y; ?很棒  正好需要

4 _+ F$ u# ^( u+ y$ U5 @& C我也是遇到这个问题去网上找的,哈哈哈
李康1202 回答时间:2018-12-10 20:14:56
还是没看懂  T, `$ F& P8 \* ~* D6 W# f

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版