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

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

[复制链接]
shenxiaolin_mai 发布时间:2018-12-9 16:18
本文为CSDN引用,过来给大家看看,很有帮助的!!!!
  R! C+ I  a$ P+ I. C# M原文地址如下:连接
7 }) T# _# G5 V8 p- P1 E( ~4 J. o
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。这说明STM32出现了硬件错误。% I$ I0 l/ W- Z& g) C1 U
1.jpg # Z7 v) ~' K2 \5 y; S" q* ^6 r
9 U. c. ^* l4 H0 W
        STM32出现硬件错误可能有以下原因:
% @4 u2 \- V- x: {, X3 {) U" l/ m& T- V, t; W" @& Y: }
        (1)数组越界操作;
/ F& S7 \# ?: @5 u
7 Z) y9 d( H7 C, Y        (2)内存溢出,访问越界;
0 I( q& a3 o% @8 X) U0 i
- n5 V2 V7 V7 s* Q  A        (3)堆栈溢出,程序跑飞;
6 {  _1 s' _, S% m& D# j! K1 h8 i1 j0 y
        (4)中断处理错误;
" h. W0 p( x4 n, Q. X' q5 `: V  Z/ t: C+ b) u, {3 Q
        遇到这种情况,可以通过以下2种方式来定位到出错代码段。0 G) {8 h. Q5 d
2 }9 j9 Q: f, R5 S+ e# j; v

0 }* I% S  d/ Z- F- i# x) z9 c5 K& F2 g# w! D
方法1:
: I% i% b5 @* k" b+ S* F+ G/ v2 {+ x2 ]# @6 q$ N% f
      1.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。
4 Y  m* {* G4 Z* R' O* v$ x% M$ `# O* a! Y8 u; y4 n
2.jpg
1 w; j& F- f2 |' \% d& s. t2 E& D6 @/ E

3 U2 e$ K5 ?+ J; `6 h4 u
3 ?4 s$ d  B& f* K1 S      1.2 在Keil菜单栏点击“View”——“Registers Window”,在寄存器查看窗口查找R14(LR)的值。如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值,如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值。我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。8 J% S, K$ I2 O5 \
3.png
) b- h" V( p" Y" }, N; v% ?# \
9 ]% {! J) v/ F! U$ E      1.3 在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”,在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。地址一般以0x08开头的32位数。本例中,地址为0x08003CB9。
% k" Y2 a7 ]2 b
; E! f# O3 [. v4 z
9 e8 A& K8 H# J3 {, K  S 4.png * N4 S& i3 N/ m1 G% U3 j7 L% Y
& ~) F& o; C$ N+ u! @+ u7 T

9 x4 V% f7 w1 I% s/ x' Z( u( L      1.4 在Keil菜单栏点击“View”——“Disassembly Window”,在“Disassembly”窗口中右击,在下拉菜单中选择“Show Disassemblyat Address...”。在弹出框“Show Code atAdress”的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。仔细查看附近区域的相关代码来排查错误具体原因。) d! b/ j. t% u; ?) i6 s

3 y4 P; q+ g! h: J 5.jpg 6 @: y  z6 O$ U- [
! Y& C0 M9 i$ ]7 Z5 @4 R/ b3 N
, ~6 m9 b, ~1 q7 I0 R

0 @* x/ P9 e( D' z2 q5 q- D方法2:6 M1 i" W* I- s) {" {9 i
9 a! |5 Y, D6 E, V+ o
      2.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。
- ?5 z# m6 j, z5 ]: o
3 X, p7 h% U3 C0 G- o 6.jpg
  K% Y8 f8 ~; B
' q$ R( a( D. l      2.2 在Keil菜单栏点击“View”——“Call Stack Window”弹出“Call Stack + Locals”对话框。然后在对话框中右键选择“Show Caller Code”,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。
' i# s& s9 B. Q; \! a* q--------------------- 0 A% A1 @- S! b( i1 m3 P! E+ I* z
作者:electrocrazy
9 U: Y+ W. H, m) _. {来源:CSDN
$ F5 p7 r( V! e8 V4 N原文:http://blog.csdn.net/electrocrazy/article/details/78173558
7 R+ i; p' B  f$ t$ v" J' J  n' p版权声明:本文为博主原创文章,转载请附上博文链接!( g9 K% Q$ v6 M: Y$ r& b1 a

6 P" R* Z  S% _1 f2 v

评分

参与人数 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
& t) p5 q8 r6 r7 P( G# ~很棒  正好需要

/ B1 h9 P& j0 u7 p( t) p) a0 |我也是遇到这个问题去网上找的,哈哈哈
李康1202 回答时间:2018-12-10 20:14:56
还是没看懂! W& }: F7 D4 V& u: X4 e) ?

所属标签

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