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

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

[复制链接]
shenxiaolin_mai 发布时间:2018-12-9 16:18
本文为CSDN引用,过来给大家看看,很有帮助的!!!!
# j" a3 k7 {4 r* ~6 Y% N# r原文地址如下:连接
  G! [+ E" B0 P- A5 U9 p! M
; T5 t, ^. |% S! X" X在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。这说明STM32出现了硬件错误。: c- _: p7 Y/ I! |; g6 e$ A
1.jpg - q" e/ [+ o5 l3 i, g8 h
- r8 l3 V. Y! y4 ]' c! P% T' k
        STM32出现硬件错误可能有以下原因:
) @: u2 a- H$ J- L. n/ }# M/ k2 h! z( g( y( E$ |7 S$ Q
        (1)数组越界操作;7 @- {* g9 Y9 n! f2 Y6 z
0 U+ U' w* N. P7 c
        (2)内存溢出,访问越界;7 ?7 b" m. b3 d% d+ g

9 N# y0 L1 @% c. X- l( A        (3)堆栈溢出,程序跑飞;5 i) f" H) e6 x
- _+ z. k/ d8 }0 g) t0 X5 b
        (4)中断处理错误;
* D0 E9 C. u$ I1 G
% x: v2 S. c/ Q& G+ D0 K        遇到这种情况,可以通过以下2种方式来定位到出错代码段。
; o( C  ~$ ^8 V1 ]' F
1 r0 E* u& G, p- J$ r9 \! @" G- R+ G: E5 ?+ B/ W

( N1 Y: ^: w2 q. R5 Z' ]8 J2 j5 t方法1:1 s3 D, V. m' }4 I' T) m0 h

  H8 W% @9 q1 O% ^      1.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。/ X! M1 j7 n3 {. x+ i. F. a
: A' Z1 Z) |3 j# i& [0 f
2.jpg - Z, F. B. H% A( P, O+ E3 P

: p' c: Q& \! P$ F) \0 n6 y
6 w0 k! L7 l8 k7 @4 X, s1 {! O
6 v( e8 J. e+ F! r9 f      1.2 在Keil菜单栏点击“View”——“Registers Window”,在寄存器查看窗口查找R14(LR)的值。如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值,如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值。我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。, F4 }, q- v% m- E) ^
3.png $ n& `) n& J+ y" N2 [8 L* x
# @; w5 Y' ?- r/ D6 o; h# `/ c* C
      1.3 在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”,在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。地址一般以0x08开头的32位数。本例中,地址为0x08003CB9。% F9 h# p. h. R; ?: U; n

; i- p8 A5 x* x! T: O/ f( @6 A; M- ^; w- |7 y* V$ U) e2 F0 `
4.png # n! x! w8 L& y7 J+ G/ j
; \& r8 k: y2 {" ~, J
) t$ j' n+ X7 f/ y! p: W$ {
      1.4 在Keil菜单栏点击“View”——“Disassembly Window”,在“Disassembly”窗口中右击,在下拉菜单中选择“Show Disassemblyat Address...”。在弹出框“Show Code atAdress”的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。仔细查看附近区域的相关代码来排查错误具体原因。
- P7 P+ }5 P) V4 ~
: w: T6 [% d! i+ d. q. T 5.jpg / b8 M. i9 R: Q* b+ S1 e+ F

# C) h) g4 s7 Y- ~7 O0 `* q$ J+ K% m1 d  {( |1 \( N, H4 H

! q' x4 w) I2 e" l9 {方法2:
; ~9 J) d& Z  ]; D" C3 T8 n) Y; w$ k  H* |9 y
      2.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。' J2 l( L' T1 }' g% M

3 p! `: c% _; {' P) S) {* U4 ? 6.jpg
& C" F6 \/ ?$ D5 {- M/ {  P/ q# E# u8 a3 ]1 k
      2.2 在Keil菜单栏点击“View”——“Call Stack Window”弹出“Call Stack + Locals”对话框。然后在对话框中右键选择“Show Caller Code”,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。
- d3 R3 T* k/ H( _---------------------
+ e! }' `7 L" X) w  E作者:electrocrazy 3 L2 n: A' d2 A: d0 Y% b" T% y
来源:CSDN 4 M' b* k7 D  a! e% b% h
原文:http://blog.csdn.net/electrocrazy/article/details/78173558
& R, F2 y0 G  R  y' M版权声明:本文为博主原创文章,转载请附上博文链接!
# v. V4 r1 B% }' X
% x" B5 G* ]2 K/ D- y0 P8 v+ J

评分

参与人数 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
$ p1 |* W4 F$ D' I很棒  正好需要
9 S- @  W: E  U$ T* z
我也是遇到这个问题去网上找的,哈哈哈
李康1202 回答时间:2018-12-10 20:14:56
还是没看懂
0 Q; @5 Q7 A* s

所属标签

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