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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-4 16:34
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler 函数里的死循环while(1)中。2 e. W: w- i5 `4 h) s3 G
这说明 STM32 出现了硬件错误。
( ~! q: t4 [7 M$ Z  W* W: o. ~% r9 R
微信图片_20231104163424.png
3 u  U! l5 E+ V2 s: h- a. D

, l. z3 d, L8 w; N" m  D. pSTM32出现硬件错误可能有以下原因:
" W0 f& v$ j2 A2 F0 j8 M' {0 J5 m1.数组越界操作;
$ r) k6 S3 F2 Z# m- g5 C  e6 V2.内存溢出,访问越界;
$ Y# |, l+ r6 d3.堆栈溢出,程序跑飞;
" p3 W6 ]5 k" T. K) L4.中断处理错误;% w5 g* K6 t4 `& N( y9 `0 V
遇到这种情况,可以通过以下2种方式来定位到出错代码段。
: N0 W% ^" B3 Z: V  x
: c: D6 A" j- t+ h1 o
方法1:' T2 c7 c5 [- K% _6 A3 \2 i
在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击STOP停止仿真。
" W5 e9 q7 I6 v7 [* L) m3 ^( s4 D. E% H
微信图片_20231104163420.png

* _. t1 ?! j- F, ?8 a6 L" B! @, W4 L& o; T- c5 l8 ]: N
在Keil菜单栏点击View——Registers Window,在寄存器查看窗口查找R14(LR)的值。# e* V; W+ t* u% o

7 q( ?( A: b& X" w: Q9 C7 A
如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值;如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值;
, k, K3 r/ m" F( `8 [+ \1 z! {9 i: y8 }% v& s+ ?( L
我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。
: Z0 G7 Q  f# |3 C% k3 W/ X, M3 D1 Z0 P) o
微信图片_20231104163414.png
; I/ p2 F8 }/ ~  B+ r! r
8 E4 |9 V2 J+ W8 _! {/ ~
在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”;
, M* u" N( [. R6 e% `$ Q$ e; r- i" P
在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。
5 p% H2 G# S- {0 W3 H* C# M! h" d# h) i8 g% z, v4 f5 W. {, ?
地址一般以 0x08 开头的32位数。本例中,地址为0x08003CB9。
: o1 H& B9 `. G) m
6 `; ]5 ]* L3 N4 v# {0 s) h
微信图片_20231104163411.png

" Q3 J" ?7 y: T. A- u

. ]9 B. A* X6 K' z/ x/ b; U在Keil菜单栏点击View——Disassembly Window,在Disassembly窗口中右击,在下拉菜单中选择Show Disassemblyat Address...。
. \$ {' E9 Q- ~0 `& d& n& v/ H' ?0 u
在弹出框Show Code atAdress的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。: T. f5 J9 L" N7 P6 F
7 g+ r7 e% h- c) q( h, N/ b9 W
仔细查看附近区域的相关代码来排查错误具体原因。% c$ N! W* Z0 {/ S5 P. v- \. o
9 r+ o3 |1 p3 a% w0 r' Z
微信图片_20231104163406.jpg

+ d/ p' r* r9 A
* y6 t  d1 \7 x方法2:5 `6 r- u, F$ a( }0 T
在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。" o) K: \+ G% n1 s  d7 Y7 e* C
3 e* y' p$ a1 c6 r3 c3 Y2 R
微信图片_20231104163401.jpg
% V" \0 P9 L1 V

  r, k" a9 ~7 v+ L; z在Keil菜单栏点击View——Call Stack Window弹出Call Stack + Locals对话框。
8 E/ c6 ^, R  v# J8 C, b
: C) X: a. ]' p- ^) E1 m7 I- C. T; v
然后在对话框中右键选择Show Caller Code,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。
7 k' E1 e; B5 q! m+ m- E* K' t1 R8 m. B
( M& q& D9 G, i. ]% S. j

1 d6 \( T% }  ?6 y转载自:STM32嵌入式开发1 y" i% o$ k2 `8 Z! j
如有侵权请联系删除
  X+ |  C0 I6 m9 M8 b
1 x8 s) s6 G) K" [! T1 P
9 @! @# b2 C5 _+ Y6 ~' @* {/ X
收藏 评论1 发布时间:2023-11-4 16:34

举报

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

好资料~~,学习啦

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版