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

基于STM32 hardfault问题分析经验分享

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult' v5 o. g% Y7 u& ~$ H8 z# O8 _
4 c" q( m, ?$ X/ i4 Q( L3 ~& b
常见的导致单片机进入hardfult有以下原因:. Y6 d6 i5 F* w# ~& G- ^; j" M
堆栈溢出、数组越界、野指针、非对齐访问
, l( S3 |! Q* b7 _  M1 `  s* h
$ r' W8 v8 K' d0 h& Z. m
% S5 w; y+ z, o/ L3 t2 E: t2 m
接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题# i: _3 @) l* ]+ s

; o/ o6 i& P* J5 G- X定位错误
; X+ ]( R! A& r2 f方法一  Show Caller Code3 Y' W9 y& g  {9 b
在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。
  P* O8 l; t, f

; ?+ g* X8 z( I( c8 |
微信图片_20240729134833.png

. ~, r6 O/ L1 f( f: p) x; G' J% W) L0 v& B1 w/ y8 H
方法二  开源库CmBacktrace* T' [. y3 u& i7 T7 z
CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:7 W/ {# {2 @3 r( }
- a3 b0 ]0 _! L' O3 V
支持的错误包括:7 E" R4 G: |( s/ L' u4 x
断言(assert)+ T6 R$ m2 e. K5 A% e
故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)8 h- x# B/ ]% }/ X, h5 \& F3 I% b
故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。
5 W5 n' d) B' E1 S$ `
; ^. p; ?. y! }* d: _输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈" R/ o0 P/ j# I7 L0 C
3 Z# P6 R% e8 Q" l& f4 y
适配Cortex-M0/M3/M4/M7 MCU7 C: y/ Q& ^8 w2 R  g  a/ g
  B3 p5 r8 J, ?5 I
支持IAR、KEIL、GCC编译器5 a+ ~1 I! G! U2 f9 H
7 V3 {8 {/ s6 L" J. L$ b
下面我们以实例过程移植及使用(Keil)1 b4 Z; b- c9 }' Y' E
1、下载源码,解压,如下图
& f& J" j4 x. h+ X0 c0 ~
/ @. L1 \3 |. S: U2 f( a
微信图片_20240729134829.png

6 G3 ^) }( X7 F  e0 N$ o4 z
* g3 P+ W! d* H6 o* I
其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。0 Y' U) p* ?4 e6 ]/ _" l+ T: M

: {3 N- i. q: ?1 W9 _0 C% [9 _2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件
. l7 s2 W0 n, Y$ }3 Z' I6 k3 H( [% n' v, u+ E
微信图片_20240729134826.png

: M: F/ @: R4 C/ b

* ^8 I* k& c  D  M7 }, G4 i3、添加到工程中,添加头文件、勾选C99模式) W4 K. _1 Y4 O# ?. K; m7 l5 x- _: l

" `: H/ h/ B" n' Q+ B! Z1 _& `. V
微信图片_20240729134823.png

( b6 B( h3 K' s6 N, U/ H
, g4 D* i& A+ g
微信图片_20240729134820.png
' M, h5 C9 L* f. H+ p. C. y. }

; k' y! L& b& Q4、这时我们可以编译一下工程,编译后提示比较多错误
% {" G. _$ e: E( d$ G. z' A6 R: B# f) u. k! f
微信图片_20240729134817.png

4 T/ y* Y) `' ?5 s1 b$ P  t

+ |6 e# S' h% J0 P5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:
; P  p# ?: p2 m/ Z3 H0 B( z0 G3 t. F: a
微信图片_20240729134814.png
$ y, N$ c0 {6 T. O0 C

8 ~$ ?/ j. {! _6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了
: m4 n# i  e- S, @* u" Z
( w4 J$ J/ v8 ?9 A) T9 M: {
微信图片_20240729134811.png

* E: R0 N" P: i' D. I* Y/ M( p5 c$ k  Q1 h8 Z
7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽( b1 ~6 n, p5 T& v
$ R7 }  l1 I4 v$ K7 L" K2 c
微信图片_20240729134808.png

7 c- l" B. z, B; i: d: Y
" H; B2 h6 {  K8 c: }+ _
8、这时我们重新编译,错误消除。
0 ~) }/ x6 {7 u/ P$ a: v6 N- i6 P0 u5 U5 |0 u
我们在main.c文件里编写需要测试的代码,如下:# D! [# A" W; h2 J9 y# N! x2 o
; ]9 Y) \$ C; R4 K8 R3 ^# h9 L
微信图片_20240729134805.png
3 @7 X1 L* u$ Q" ~( z
: o  b* E/ {9 C  t. y7 {+ c
( g- M! ]1 R  g9 L

/ |, D" ^% ^4 n, P5 G4 f4 [: |/ r9、下载并运行程序:( E) e+ F5 f0 b- ?6 c

8 p4 G. ?8 M! f; c3 h
微信图片_20240729134801.png
9 W2 b$ G# G5 d! y: z: Q

! q9 e2 [# h1 P0 V# l  ~9 d10、可以看到串口输出的错误信息,我们根据提示运行命令:# o: D# c" v: T/ c& @% [/ E
addr2line -e USART_TEST.axf -a -f 0800157e 080015ce) A0 H+ ~2 q* \) N! ~' ]$ f

9 U0 e4 s6 C' @1 F9 u8 Q  B运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内," P0 }. M! i9 d6 Q
. J" E" A+ p5 Q6 F# w
微信图片_20240729134758.png

, O. Z) k2 E. D# d- d! N; f. h* \$ k* R% H! v- N6 P: r8 n: H
11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:2 W& t* c2 `5 O, D7 C& Z2 {1 i5 g
! L/ F% r/ l* Y% e  t
微信图片_20240729134755.png

- O3 C3 \# f0 v0 F1 j/ O8 |0 H0 P5 O  i
12、在该文件夹中,我们按下shift键同时点击鼠标右键
- D) b. i! S  `
' E( j7 p& J/ y' W, j, M
微信图片_20240729134752.png
. N6 N9 v; s3 w$ E, ^

" M/ d* u( y; O, ]1 K13、在powershell中,输入 start cmd并回车运行
6 F# ?6 i& Y* g3 x( z/ Q6 \: c
; x+ _  ?' w" c! r; m
微信图片_20240729134749.png ) n2 A, p- k  x& Y8 V5 Y- c/ B0 w

( V. W% P5 q' L/ ^2 `  x9 a
& F. O( L2 Q2 p5 c, V+ n
14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行' c" I2 W- Q; l' V0 f# E# i
7 J' c+ K* @: |" p$ I
微信图片_20240729134746.png

! }+ U& }$ d2 q) a# o) L
+ y! q- x* Y" l' U
15、可以看到addr2line.exe工具给我们定位出的错误代码行数
9 X/ B' ~0 j& c3 ]" B3 _% o* e
) r9 Y  z0 T% o' w) v
微信图片_20240729134743.png
) P4 v9 s( g( ^2 q
1 n: W0 F; r9 G  r" }1 m
使用CmBacktrace库能帮助我们有效快速地定位HardFault错误
& v1 o8 b9 @4 `% t  R6 e! W+ @$ N
转载自:创客技术日记! x% |: F* B7 ~2 k
如有侵权请联系删除
; X& C7 ~# d8 O" r! T8 @3 P& l$ f3 {0 g" E& L1 }- N
收藏 评论0 发布时间:2024-7-29 13:50

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版