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

基于STM32在Keil中调试硬件错误的方法

[复制链接]
攻城狮Melo 发布时间:2023-11-4 16:34
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler 函数里的死循环while(1)中。
5 k+ C8 Y- a. f
这说明 STM32 出现了硬件错误。
# b7 g  x  A5 \3 i
! U2 s& {5 A1 |. [% d
微信图片_20231104163424.png
9 x" Y  T  i5 y) t( d
) y3 S0 Z# J' F* ]  g2 Q
STM32出现硬件错误可能有以下原因:
7 m: p  P0 K5 V  j* i& S: o1.数组越界操作;2 }7 [- Q. t6 ~  W
2.内存溢出,访问越界;
; }3 o. Y2 G6 s3 f. r: S8 f3.堆栈溢出,程序跑飞;
- n& u" n3 w0 w6 l4 W4.中断处理错误;; I; q5 D9 D' S+ S8 Y& ^. a
遇到这种情况,可以通过以下2种方式来定位到出错代码段。
1 g" i) o! J8 V4 ?$ T+ a  a& I: C3 e2 ^; {1 z" u# ]
方法1:  K) _! a( J6 T
在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击STOP停止仿真。, o9 N- q3 F- m) x4 z" @
# z# {" K) D  E7 ~
微信图片_20231104163420.png

8 v8 h8 F+ e) a8 @" k; }
; B) O+ a5 m4 W在Keil菜单栏点击View——Registers Window,在寄存器查看窗口查找R14(LR)的值。! f  I/ v2 k" J, @5 x% r. [+ l
% [' T, [1 l" a2 `+ _/ r- @
如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值;如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值;9 B2 {" q. m7 A7 P6 K

# j* V. z8 W/ f# U
我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。# u. W% W* @9 s

  z' _. m6 ~/ n
微信图片_20231104163414.png

5 f4 i! Z5 v1 t) P; ~( j+ A- O# z
在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”;2 o* ^' i9 G: P5 C: D+ r) h) `

- b6 I) R2 T5 S' v% K
在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。2 I- V1 M" f0 c- l" v
/ _9 l) l, v% p+ ~& M9 E+ m
地址一般以 0x08 开头的32位数。本例中,地址为0x08003CB9。' I/ t+ c0 s2 I9 X- H, l
9 s) I; ?0 d/ B
微信图片_20231104163411.png
$ |, H6 i0 M3 @1 q; j
- F, |5 K% [: A3 v* f! ^( m
在Keil菜单栏点击View——Disassembly Window,在Disassembly窗口中右击,在下拉菜单中选择Show Disassemblyat Address...。7 ^7 B1 |9 Y- Y6 t# Y% H, I1 F+ D; T0 d( X
1 A$ B4 ]1 [& [: [/ o# J% c8 x
在弹出框Show Code atAdress的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。- Q) b7 E1 W" q# ]
" D3 H9 J4 S4 s' ^# I! p' \9 I8 Y
仔细查看附近区域的相关代码来排查错误具体原因。+ s6 R+ l7 H, y( V" S& X
9 k1 f5 U3 b+ {' O# |1 J
微信图片_20231104163406.jpg
+ R: \+ |5 G" t% x
+ ]8 ^) C) g* G  R" o0 A) L
方法2:
# b/ x) L3 }1 E) `, [9 L- A在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。1 t7 d  Y: w6 t% X+ r9 T
0 C- s2 M! Y- K8 `1 v; B" p6 O" a! {
微信图片_20231104163401.jpg

9 V* Q' f, H  I! v- K# c0 i1 x* z4 |3 ?  C  j
在Keil菜单栏点击View——Call Stack Window弹出Call Stack + Locals对话框。( W% ]- x2 T3 |2 G. e- T$ C1 L
9 n5 g" r- l! y% E  k' ~& u
然后在对话框中右键选择Show Caller Code,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。
# ]9 z4 U# N1 k% I. v0 x* n# T7 q  ~# d( I) g: K& w8 Y' f

5 }5 ^2 _, n! T4 A4 l
$ [* B, X( Q( V; g- X1 A) j2 L转载自:STM32嵌入式开发
1 T/ _' _) l( Y. g! H0 k# f如有侵权请联系删除
1 L% q! \0 o( ~" y8 G
" j/ J! U: d0 ^1 B* M! `( B
- Y) _; K" s+ R
赞 收藏 评论1 发布时间:2023-11-4 16:34

举报

1个回答
xu@xupt 回答时间:2023-11-5 10:10:32

好资料~~,学习啦

所属标签

相似技术帖

官网相关资源

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