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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-4 16:34
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler 函数里的死循环while(1)中。3 U7 \3 q; q' t" J
这说明 STM32 出现了硬件错误。$ f/ Y9 Q6 J6 `
4 K# B' D; `2 U+ |
微信图片_20231104163424.png

, b* K" b( t& |; E6 {  Q  y- Q3 ?0 o+ [
STM32出现硬件错误可能有以下原因:
# k' ^7 _' j+ P$ U6 W. \/ W+ b1.数组越界操作;
) }2 S8 W& W* v/ ]. Q% R2.内存溢出,访问越界;3 v) B8 n' `2 p, `; q
3.堆栈溢出,程序跑飞;
. L, c; s& h6 P4.中断处理错误;
9 }; U3 [7 F" j$ Z. s+ x遇到这种情况,可以通过以下2种方式来定位到出错代码段。9 T- ~$ t( i. r

2 @$ w6 t4 X# i/ O' _. o
方法1:
' }0 Y4 L% @( E! v5 a, _& @' b- O在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击STOP停止仿真。
( C# z1 C# W% e1 b6 M3 q4 m. o9 z+ t. \7 q( V, m
微信图片_20231104163420.png
( p$ P0 [  x2 _( ~; P

3 U. b5 D/ e8 c7 ^+ p' I  e) Y在Keil菜单栏点击View——Registers Window,在寄存器查看窗口查找R14(LR)的值。* N8 W) y& t. u0 M( R
) y8 d, W6 ?. }- B# A. ]
如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值;如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值;. W1 ~$ L6 P( M) w
* A: }: i1 L( J! h* w
我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。
& R& e/ m  J6 M* S
2 q6 Q# j8 |) l/ _  Q' o
微信图片_20231104163414.png
3 y8 d2 u; n" c; D

: J  X5 }) I$ f& l1 q在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”;
. ]6 S8 q9 K$ P3 u6 }4 h4 L& \5 r& j; M9 s3 ^" s, F
在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。% |. t- h' [& u- k  R
0 T8 l# H/ G# m1 A
地址一般以 0x08 开头的32位数。本例中,地址为0x08003CB9。, ~. e8 V9 f: ?- K

5 c: K% Y* o+ I( Q
微信图片_20231104163411.png

4 g1 {) ]6 s0 j# e5 Q

* u4 p3 u. Q$ G2 n6 i& t在Keil菜单栏点击View——Disassembly Window,在Disassembly窗口中右击,在下拉菜单中选择Show Disassemblyat Address...。# C- q( i5 |$ z. U7 k
- Q- P2 B9 U+ j* M% `" @6 R# b: R1 p
在弹出框Show Code atAdress的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。
9 }8 E& G! S" _1 Z$ E# o% H, o; q' \1 ^; N+ D- e# ^! \$ u( [
仔细查看附近区域的相关代码来排查错误具体原因。
, k' N( V( F* o* R) A8 l$ P0 |
* X( A) j, Z! t# ?
微信图片_20231104163406.jpg

; B! }' I; O$ d  ^$ @& j
, Z# B, j* X' y" I) {7 z' a方法2:8 z8 Y( p1 P; v  Z
在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。
# U+ G! R9 a" a' v8 @# |& x3 @$ \8 P. j
微信图片_20231104163401.jpg

% O6 S- C# S. M# I( U4 `+ Y' g% j; `% E( ?
在Keil菜单栏点击View——Call Stack Window弹出Call Stack + Locals对话框。
6 }! X$ h3 }- y5 ]/ C  T1 ?- F7 C* [2 i% E: q/ y) a. @
然后在对话框中右键选择Show Caller Code,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。
2 q& n7 q+ E0 S( g" e, R. u' K' F  O
& q/ [6 b. E; H( a; |, a1 R8 x, d$ D6 l2 V3 }2 d1 O

2 |6 l3 y! g$ x8 s" s# @8 n转载自:STM32嵌入式开发3 A3 S1 i9 L& S2 d' B" A
如有侵权请联系删除  t4 X6 f# ]. {  {3 @0 `
4 X" }8 S+ B- k' o# P5 O  C  _

+ ?8 e5 X) Z9 C& D4 m( ?
赞 收藏 评论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 手机版