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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-4 16:34
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler 函数里的死循环while(1)中。
' Y  N. x) o8 S" D) Y6 k3 m5 A3 I3 P
这说明 STM32 出现了硬件错误。6 i' ?7 F2 A7 P0 ]

6 I6 n. ~. q1 w7 e6 P) ^
微信图片_20231104163424.png
# B6 M3 ~5 {1 @2 p
0 R6 v; q7 [# r
STM32出现硬件错误可能有以下原因:* H0 _2 j( y1 P
1.数组越界操作;$ b0 Z  H& X8 b3 a# T/ z2 }
2.内存溢出,访问越界;
7 [3 D. c4 }5 q5 I1 k3.堆栈溢出,程序跑飞;
( z  a; q5 k. ?5 E; n4.中断处理错误;
+ ~( U* T0 k4 t7 c1 W遇到这种情况,可以通过以下2种方式来定位到出错代码段。1 N+ @3 [3 O! S3 i  u4 R
# `1 H0 E# A9 N' ^! N
方法1:+ E% Z* J0 ?) z  r* q% }2 J
在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击STOP停止仿真。% v) r+ k  k% d2 W+ a
7 ~; S/ r! m+ S; _( m  m/ w
微信图片_20231104163420.png

& U; u; ]/ N/ A* k  y6 E6 A% L. M$ K0 u5 }
在Keil菜单栏点击View——Registers Window,在寄存器查看窗口查找R14(LR)的值。
4 l' h8 W) T( `+ J; O1 |# I. Y( H! I# j8 A% u( s
如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值;如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值;) j% r6 V& b! p  |7 F/ L; z3 C( y

4 k- \) ]6 M4 i9 E' k
我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。
$ k$ w9 X: ^+ y7 {2 i/ ~# N& \' Q7 p0 l( H+ y  l1 r1 O
微信图片_20231104163414.png
) x9 V& m" }6 T8 b$ N

$ y+ K3 t  U5 h- z! E7 P  I7 I0 b在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”;
5 Z0 D, j. O& L' `$ c3 V) a% C" j: d( D& f: B0 T9 n: W) m
在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。. y6 j5 e( n6 W0 a) L- o
+ R; m, A( C- v" p# G# s' [
地址一般以 0x08 开头的32位数。本例中,地址为0x08003CB9。% x/ u, V8 W( A

: w! J% K, x1 e: a
微信图片_20231104163411.png
' E& ?* X6 M- @

( Z$ D3 ?1 `8 |& Z在Keil菜单栏点击View——Disassembly Window,在Disassembly窗口中右击,在下拉菜单中选择Show Disassemblyat Address...。6 \4 K8 W% u; [9 }7 H

; X7 D- C  }$ B# n' f
在弹出框Show Code atAdress的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。( l  M0 ]; P$ a5 S3 x; i8 i) K
+ X( u- T8 R, p" C
仔细查看附近区域的相关代码来排查错误具体原因。
  R6 e& d1 X+ h. t) h
/ n8 [9 J5 a3 I  K. R" V) m1 \/ t' Q
微信图片_20231104163406.jpg
1 s  E$ a: @- N, }, c3 ]

3 |$ M% `: w; o! z) g方法2:
' c! C+ @) A  U8 ~在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。
/ l2 Z& K4 Z% S
" c5 }2 m8 L+ g6 r# M
微信图片_20231104163401.jpg
5 w4 z! l- I% d

0 R( B4 c( K- a& d, E在Keil菜单栏点击View——Call Stack Window弹出Call Stack + Locals对话框。
, g* F4 j: K9 X, B8 Q! h$ I+ G' T  ?) c8 b
然后在对话框中右键选择Show Caller Code,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。
% ~. ]) R2 i) B( i* h0 r( X7 ?" m: n/ x- P

% ]. i# @7 z# ]0 X9 m+ W; |; X% x2 G' i! b
转载自:STM32嵌入式开发1 R; z! y2 H8 \5 T
如有侵权请联系删除" ?7 o# c/ V! M
  H( p5 w4 {+ ^! E! B# D
3 _8 N+ y+ [, ^5 a7 h% u
收藏 评论1 发布时间:2023-11-4 16:34

举报

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

好资料~~,学习啦

所属标签

相似技术帖

官网相关资源

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