请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
shenxiaolin_mai 发布时间:2018-12-9 16:18
本文为CSDN引用,过来给大家看看,很有帮助的!!!!9 e# H9 i! m6 d4 x3 G
原文地址如下:连接8 i$ V3 m; s5 c: |
4 g0 O6 S2 j+ H$ P  {7 y
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。这说明STM32出现了硬件错误。- e& u* v' f1 A. [3 G# r8 g# D
1.jpg
7 c: i* Z/ h3 X" P8 l/ `+ f& M' G2 H6 t' k: s. A7 _; A: s
        STM32出现硬件错误可能有以下原因:5 g! ?, j+ Z% V" A( ]3 q( s
6 `; {# U: D; j$ l; f
        (1)数组越界操作;/ S7 i; y+ n& d; a" C& w
( X0 _6 q0 j7 @, y
        (2)内存溢出,访问越界;( @  Y) I$ j. Z2 Z7 d3 H
( T" o8 i. i7 B# `
        (3)堆栈溢出,程序跑飞;
) {, e2 `" A% z7 i. i
8 I3 N2 o" X/ F, d) Y" i8 J8 D) Y        (4)中断处理错误;. x" `3 i1 ~5 Z( p

* F& b, V0 ~+ N& e+ K        遇到这种情况,可以通过以下2种方式来定位到出错代码段。
2 i4 q# S9 a1 P) x$ t' r4 @  L# d
( Z" C- _/ R9 }% ]& B
+ F# p/ c- P# J( y1 W
* m  s. \/ E8 G. R# v方法1:! N% Z3 P  U9 ^1 T+ i0 I; R
$ @7 ^1 @6 Y7 C, S
      1.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。9 M3 y& W$ G7 U; ^* k; A+ _# e

) h, s& |/ o4 R( n 2.jpg
- O- @6 k; p( O7 S1 i0 f5 ^6 b# v6 @; t  i
/ i: P1 T% E7 p

* j/ f0 \0 Q, T8 |: c) L5 l, @7 m4 }      1.2 在Keil菜单栏点击“View”——“Registers Window”,在寄存器查看窗口查找R14(LR)的值。如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值,如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值。我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。
$ Z6 N" {) L. J, a7 X 3.png
- V- O( q% p1 t4 T/ b! w! V0 z- b/ @4 J) P
      1.3 在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”,在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。地址一般以0x08开头的32位数。本例中,地址为0x08003CB9。( \9 ?# d; J( ~9 N( Y
! o. E3 h5 m( S8 Z8 w& v
$ d. x# C, Y4 u8 J$ V" T. q5 k
4.png
1 |( U# ?1 Q5 ~5 S( x. M6 z3 F7 e, |3 {3 i( D

2 F' ~2 o) M( c/ ~0 q3 y2 T) P      1.4 在Keil菜单栏点击“View”——“Disassembly Window”,在“Disassembly”窗口中右击,在下拉菜单中选择“Show Disassemblyat Address...”。在弹出框“Show Code atAdress”的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。仔细查看附近区域的相关代码来排查错误具体原因。
" _1 C" w) b: s2 ^  S: y! s% I9 R7 N& |6 T# Y0 x" F4 ~( O4 U
5.jpg 1 O! ~0 p" D6 a8 J* o# ?
! O* P# k2 C; N) F
1 f& C+ S2 G! F
$ E- J! x/ ]3 t; ?/ i4 `5 _' P
方法2:$ w7 O+ G! }0 N; V- `- i! [2 q$ M, s

0 V9 T" q$ D# M  d# Z      2.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。
% r' b; C. o3 C! w, B+ t  {
- n) `% {; ?: n. X! ~# j2 h 6.jpg % A. [  m  W$ q
6 e$ U3 _: z- r8 F2 q1 N* Y
      2.2 在Keil菜单栏点击“View”——“Call Stack Window”弹出“Call Stack + Locals”对话框。然后在对话框中右键选择“Show Caller Code”,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。
0 O2 }$ {- O# ]  v--------------------- + x/ l6 ^4 i+ A6 q
作者:electrocrazy 4 w$ ~* f2 x9 C- g4 s$ n9 E, Y* q2 U
来源:CSDN 9 b7 n* u9 q1 [0 }6 Y3 I
原文:http://blog.csdn.net/electrocrazy/article/details/78173558
( Y* C" Q( Y( ^- t( M版权声明:本文为博主原创文章,转载请附上博文链接!
4 W$ P5 q* j- v5 G9 S/ v5 W6 |
& g$ a, F/ T0 P5 Z

评分

参与人数 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# f0 o& o( @' M. r1 [2 x
很棒  正好需要
) R; V2 ^; q: p/ r  ?* N
我也是遇到这个问题去网上找的,哈哈哈
李康1202 回答时间:2018-12-10 20:14:56
还是没看懂
3 D  q% y% j' i: r% I3 ]

所属标签

相似分享

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