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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-4 16:34
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler 函数里的死循环while(1)中。/ G4 t+ \$ S  Z( q$ f- l0 T  P$ M
这说明 STM32 出现了硬件错误。
9 i, o! }' m* R' O& t, l% f9 u
& ?7 k# X1 [6 B, F
微信图片_20231104163424.png

* B  W' H) N. Y) }" h! y. Y7 W  A
3 l8 \4 E' G7 R2 d# k) H2 `- L1 BSTM32出现硬件错误可能有以下原因:$ q! Z: K: x$ J  V
1.数组越界操作;
0 U) N8 X, N' ^0 S% H2.内存溢出,访问越界;
% g2 q. j' W/ i) c; z# C3.堆栈溢出,程序跑飞;
* J7 j, b& D* A% u6 `. ]" ?4.中断处理错误;
) Z" [3 k. a6 D: V0 o5 q, I遇到这种情况,可以通过以下2种方式来定位到出错代码段。/ [: l& l% A* x0 |- l* i/ y$ d
% C, B  D5 d: U/ E* l, L$ A1 P# _  Z
方法1:9 H; T. E8 P4 c) C; v6 t( }6 j- {
在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击STOP停止仿真。0 l+ C1 ^6 a" N& q) r4 i# ?, R

5 K: z* U) O2 N3 O! @
微信图片_20231104163420.png
4 d8 P$ Z# y; L+ X( y& l
; ~3 B6 S6 O8 B8 Z2 `
在Keil菜单栏点击View——Registers Window,在寄存器查看窗口查找R14(LR)的值。
/ v9 w' j2 |" q& s$ ?2 j+ n- t( @) o) W% s# C% f
如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值;如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值;
" b/ v1 H6 J, p" ~  f& Q, }  W0 t
) k! `0 u# T. J/ g; I8 _0 t
我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。9 y. O7 f4 `& g5 z% q

5 r+ W7 W" X9 c
微信图片_20231104163414.png
/ [4 o& F% K# _* P' X
, x3 X% @- j, w4 g
在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”;
, y2 _# N! C4 B! x! G4 A1 ?# o' T! [# T2 M+ n9 p0 J0 h3 h
在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。
" N! a4 `* W7 P! M  o7 M! V5 [5 l0 P/ h, S3 F7 N" D( R" n9 J
地址一般以 0x08 开头的32位数。本例中,地址为0x08003CB9。6 q) @4 m% }7 ]. t8 @) E
0 z6 C8 B0 Z' K1 J- Y
微信图片_20231104163411.png

. K8 K% X% d: B2 h) B! Y

; s- r0 q% {( q' F在Keil菜单栏点击View——Disassembly Window,在Disassembly窗口中右击,在下拉菜单中选择Show Disassemblyat Address...。
9 w8 k% M+ R$ g9 f# m( J9 c1 a! F8 J# ]) a5 |5 T" m
在弹出框Show Code atAdress的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。5 z- d1 Q9 n6 H* ~, w' k+ C
, C% x: i- t7 W, E
仔细查看附近区域的相关代码来排查错误具体原因。
% g/ O- N. g$ }+ }: X6 q
5 m4 F) |" N6 L- ?% ~
微信图片_20231104163406.jpg

2 c- u3 j) F8 F) r
; v1 D9 z0 W& l. i/ {方法2:
/ a; H) H0 i2 O- }" A) H" a* I在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。1 W% m2 N; u/ N: N1 S
" |) J5 ~9 F+ N% ]7 j7 [6 D/ Z
微信图片_20231104163401.jpg

5 i# s+ ^: u, \7 D% r: I# Z% d% {7 {+ C
在Keil菜单栏点击View——Call Stack Window弹出Call Stack + Locals对话框。3 ]# g" b0 a- H
3 n8 Q. ]4 F, d  Y5 W1 d
然后在对话框中右键选择Show Caller Code,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。2 [- ?$ ~! R1 }- Y+ n3 c! A/ D

( a% e& V; |1 m" b2 v+ E6 P$ A& e! A# G" E  v6 l* D* d) x
1 O; O( Y/ A9 [. H% p: A2 @8 V
转载自:STM32嵌入式开发
' A8 Y5 f! j/ d  u0 g7 f: t- h3 R如有侵权请联系删除
$ N" H3 a3 Z) a/ f$ N
( r0 @: T8 F7 N- q+ n) P1 g5 Q+ C# E. y
赞 收藏 评论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 手机版