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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-4 16:34
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler 函数里的死循环while(1)中。; x7 ?7 ^1 W* S. l3 p+ @
这说明 STM32 出现了硬件错误。1 W# n7 S7 \$ z8 Z

1 k# M; y0 {+ j8 \& _
微信图片_20231104163424.png
4 M) G3 ~% N( c1 a2 B
: A* `0 \; x! \/ v
STM32出现硬件错误可能有以下原因:$ \4 l$ i/ F+ q' Z4 W
1.数组越界操作;
) @8 V8 e, _; ?: T9 c2.内存溢出,访问越界;
1 X1 y7 |, k( h5 d3 e2 L+ X4 g3.堆栈溢出,程序跑飞;& W7 q6 b  t; c1 i% h4 |
4.中断处理错误;
% A) F3 M9 _8 K1 ]) q遇到这种情况,可以通过以下2种方式来定位到出错代码段。, I7 k4 M4 c, K1 C  K% E' |1 w- |

, i  q3 ^; M% e* `- I
方法1:1 ?0 n( _6 i" i3 f: N
在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击STOP停止仿真。3 @7 c4 y( D; v7 Z, ]' ?9 _

* E+ o: |2 T1 B/ I$ Q- t& t
微信图片_20231104163420.png

# N0 o# S& O3 S/ R, `0 I! g* f! O4 m& u  W* s+ U
在Keil菜单栏点击View——Registers Window,在寄存器查看窗口查找R14(LR)的值。! A# K2 g7 @# z( m. B; k
5 r& n- `) ]1 E* T
如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值;如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值;
( A7 |9 U. k( _5 s3 [& l9 N8 k
( C% v9 F& R4 d7 I' ]
我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。' C1 {( Z# s/ q4 I

5 y& p; J4 \/ E9 z! o2 r7 b
微信图片_20231104163414.png

" o5 ~2 N6 h8 m( W3 v
0 J* A/ J8 W; @6 }: m% r7 I2 {在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”;
9 Y  J! u8 }6 `& i4 o1 m* X& Z" M
" j) {: x; R: L5 E1 N
在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。) k1 B0 t% a! g4 x5 o
5 `4 Z$ V1 O% I( G$ V4 E! w
地址一般以 0x08 开头的32位数。本例中,地址为0x08003CB9。2 z# `& L3 O5 N: E1 v

! h2 I* M" N% n5 Q5 t: j
微信图片_20231104163411.png

' }1 d8 q- i; f% e, S7 l

9 y, K1 @7 z7 T" k0 W# u; V在Keil菜单栏点击View——Disassembly Window,在Disassembly窗口中右击,在下拉菜单中选择Show Disassemblyat Address...。
2 {0 L$ F5 e. D& F" L
4 J" t; y3 k  ?; `+ ]& v, O  q
在弹出框Show Code atAdress的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。. c( r7 v  t  |1 C

* B- m; [9 G7 l4 _7 s7 O
仔细查看附近区域的相关代码来排查错误具体原因。
; u. I3 S9 w; |  Q" t0 ?; o5 A9 s# A; G9 t
微信图片_20231104163406.jpg
% a& J! W" a' ]/ q* }: V

0 ^7 n: P2 E* L9 i4 Y方法2:# {7 Z! s, a* J4 i  Y8 H# N: U& e
在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。
+ U6 ^6 v3 ~4 [5 E, C- B+ J6 e
, w; q+ Y/ K) ~! r
微信图片_20231104163401.jpg
9 N# _/ w+ Y) o- r
* J* c: V4 r: f. o7 _: t% F
在Keil菜单栏点击View——Call Stack Window弹出Call Stack + Locals对话框。
% f+ \, I# U* f( M. m' ^# _9 w& x6 {' M; y- J/ v  ~3 k
然后在对话框中右键选择Show Caller Code,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。  w/ |3 B% J( b( j; q  ?$ s

+ E. L1 V" [! ^9 d- Y3 g" S4 |( M' P& C

; o0 u3 a" p9 r5 X3 u转载自:STM32嵌入式开发
1 k# ], v- D4 v5 s1 ^+ Z( ]' A6 x如有侵权请联系删除6 ~, F; F- u& `6 s; R
. |% }+ A: {5 I5 `7 W/ `. z
' z/ @( f4 n' X. b; I. M, S& n
收藏 评论1 发布时间:2023-11-4 16:34

举报

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

好资料~~,学习啦

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版