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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-4 16:34
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler 函数里的死循环while(1)中。" S8 Y1 s* j7 p8 @3 T$ Z* V) N
这说明 STM32 出现了硬件错误。( G# X4 S& V' s9 V0 P! x
1 h  M4 N4 B( d' l! G+ d+ r
微信图片_20231104163424.png
+ A# _# }" e) X- l% j. d
$ z; n2 m; Q; X  f6 @
STM32出现硬件错误可能有以下原因:( ]4 S2 q  ~! p4 y( d
1.数组越界操作;
9 Y" n6 ?5 {; N3 ]5 n2.内存溢出,访问越界;
7 j, n: r" E! @' }8 m& E3.堆栈溢出,程序跑飞;
8 m1 e2 ~8 z/ n- Y! \0 n4.中断处理错误;
. H5 X' V& |4 P5 q- l7 h遇到这种情况,可以通过以下2种方式来定位到出错代码段。' }) y1 M/ m: c( P
+ O: n: q3 X! ~( {% v! s
方法1:
: W& z  T! s8 t( {) i+ K在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击STOP停止仿真。* R: F( M: i& S( S9 ?
2 e( O# ?/ H" n: u8 ]! A7 j
微信图片_20231104163420.png

+ T7 V8 x; D& ~9 ?5 D/ E6 ?/ {# T/ M2 w* X/ ^' L7 m
在Keil菜单栏点击View——Registers Window,在寄存器查看窗口查找R14(LR)的值。+ U$ Q. S7 O9 T0 z5 ]8 p0 I

0 _( Z1 P- J0 Y. f
如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值;如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值;
  T5 s, N' S4 t( S$ u! Q- D' f% R* U; Q+ P- C- _' p
我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。
- R, u) L& Y7 l! ~4 }
$ d' [8 g0 _% t: n% D
微信图片_20231104163414.png
8 Y/ }, [1 T$ a! z
. H3 [. T& u! [$ m8 g+ a, _# n6 g
在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”;) H- ?3 h& U7 C) o( _

1 ?) K+ G! w  u2 B
在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。) Y: ~; N  Z( g; m  ?, E* ~7 G
- o; x* d" g; ]2 A# E
地址一般以 0x08 开头的32位数。本例中,地址为0x08003CB9。
' ~' V6 A  n4 ], I4 ^) ~; ~8 w/ k" t/ [
微信图片_20231104163411.png
* H, f+ P$ V, L- _6 ^1 |

. N" H: Y4 R8 ^5 ^' C在Keil菜单栏点击View——Disassembly Window,在Disassembly窗口中右击,在下拉菜单中选择Show Disassemblyat Address...。' ^( a8 v. `8 n! F& t  _: O

0 @; A6 O, }3 z6 G! `) Q0 P9 N9 v
在弹出框Show Code atAdress的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。) X0 c& e5 `1 W

4 @8 l2 P" j  W1 C
仔细查看附近区域的相关代码来排查错误具体原因。
4 U2 j1 _  G0 k+ d1 J% Q' I" f: ]/ O/ Q
% c6 c- ~6 z$ k3 @' B/ k
微信图片_20231104163406.jpg

/ {+ c$ {4 E, G! X
, s& {3 G0 W' m2 L$ z+ L- _方法2:1 V* v8 D9 X1 N# A- V
在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。
# _* V( c- R# q' q0 \: w1 P& A3 J, _0 G6 w8 h* A+ g! r
微信图片_20231104163401.jpg

6 c, g5 W8 n3 ]  N; ?/ U! `+ z9 e7 Y$ Z4 F5 G3 ~! Z& Z
在Keil菜单栏点击View——Call Stack Window弹出Call Stack + Locals对话框。
% D5 s; l+ M/ M4 j0 x+ p/ u$ y$ D# x$ q- q
然后在对话框中右键选择Show Caller Code,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。8 |( j2 d0 t, P

+ c5 a0 V, p& w% u- u
; z. G; t, n4 g+ S8 a' s& q) W$ B' e6 W7 X; E+ k
转载自:STM32嵌入式开发( r) }- h; x) B, U( x  H
如有侵权请联系删除
9 [% o4 z. ~, ]* [  r' `8 C9 Q  h' p( F0 X' T8 [' w+ _6 i

; w, |" ]" O' K0 g4 f; i
收藏 评论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 手机版