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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-4 16:34
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler 函数里的死循环while(1)中。
, R' c5 W/ L; |% w7 L9 r
这说明 STM32 出现了硬件错误。
( f% c' T% ?5 T& L$ Y
, d! {; X* G1 x/ e9 Z  H0 n
微信图片_20231104163424.png
) O: F0 W( o5 J, M+ b; Y+ x

; D% N4 X2 ?2 @" y" TSTM32出现硬件错误可能有以下原因:0 ]: S( d. ^5 A0 x: i& \) P
1.数组越界操作;
) P7 o- d' y- G3 l+ y7 y2.内存溢出,访问越界;
) l$ g& q  \1 s3 N4 W3.堆栈溢出,程序跑飞;
* r  Z. c$ N. g7 Y; @1 n5 p4.中断处理错误;
! b/ [# `/ Y4 d% t) i遇到这种情况,可以通过以下2种方式来定位到出错代码段。
5 T; {3 H4 N7 @2 o, i0 K  N  Z' N* Q4 }3 Z7 k# \
方法1:- {- m4 f" |8 e; O% m
在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击STOP停止仿真。
+ R3 J, G" Y! S  L) k0 p1 i
+ z5 l1 S' D9 i8 E! N8 ~3 Z0 W
微信图片_20231104163420.png
6 j$ {" T+ l- u3 U

+ n( G1 E5 z3 ~' ?/ q3 j在Keil菜单栏点击View——Registers Window,在寄存器查看窗口查找R14(LR)的值。# |3 K5 e6 T' r9 P
  }+ A3 ^9 o5 E1 ~, T! u
如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值;如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值;
1 V" `: J$ z9 d) d1 I- k3 z
' p0 _) X( Y0 A1 t
我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。
& R" q, n: c4 }) I7 C5 T/ p2 {" \' |' e0 i9 U/ o* @
微信图片_20231104163414.png
, T6 [! a; j9 o) n3 _
( ?  y" C; C+ B4 O3 T2 Q- {
在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”;
5 {- Z+ H9 ?% N& x/ B  h- C. H+ l( F; ?8 N1 I2 b/ q+ |" \3 s! y
在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。
2 [; J3 v* D: H- \/ a8 ]% v4 T* h" K- z7 {0 m$ E0 b$ R
地址一般以 0x08 开头的32位数。本例中,地址为0x08003CB9。% a, r4 }- \8 v+ a" q/ u0 ?  ]8 e

" a' w9 _) v3 r) N6 c$ B* F
微信图片_20231104163411.png
3 [, ~+ @# a6 d* e3 l- w# K
  K9 l1 \% y& x! F: y' `+ T4 ?* M
在Keil菜单栏点击View——Disassembly Window,在Disassembly窗口中右击,在下拉菜单中选择Show Disassemblyat Address...。
9 T1 G- q/ ?6 K4 N
0 w4 s# J' c. \) z
在弹出框Show Code atAdress的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。3 n6 i; L/ h# x6 Y3 @% h

, G2 N( ?* ?" l1 E* t
仔细查看附近区域的相关代码来排查错误具体原因。: E/ {* P  d8 e! X" Q' m' _5 C6 O0 g
# v7 u( h+ N4 Z- i! H- r& v1 i: W
微信图片_20231104163406.jpg

% x0 a4 U4 {4 t  H3 ?0 j- W) q& ~* }) y5 D; D/ G  m
方法2:' [9 f) ~7 `/ h2 m1 a$ B; _
在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。+ e" {7 A4 S# M5 @: X1 w* j% z

4 g: Z$ w- b) g
微信图片_20231104163401.jpg

  q: B* C$ p( N( T: R. |( g% y( K! K9 H* F& \( c" r0 H
在Keil菜单栏点击View——Call Stack Window弹出Call Stack + Locals对话框。
! C  {5 V1 z- C2 \. O
/ N" j, k2 _' J  q
然后在对话框中右键选择Show Caller Code,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。5 @  B) g" e" p6 I3 ~! m* ~
8 ]8 x& _2 z$ v
9 Y3 d) c4 {" {3 h

* n9 C6 i* e5 J4 \% j; M转载自:STM32嵌入式开发$ A/ n0 M" A$ r' P9 m. f8 b" |
如有侵权请联系删除
) E. e; [" M; ?! L" U6 ]) W$ \; c/ T/ Y  H( I$ t% d
$ Q3 Y3 D3 `9 q' ]& T
赞 收藏 评论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 手机版