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

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

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult5 Y' ?4 i+ t3 o. d0 ~7 A, Z: U
  T( I4 R$ w3 [0 V
常见的导致单片机进入hardfult有以下原因:+ B6 m5 P" T) u8 Q- n9 E4 B. G9 N; T
堆栈溢出、数组越界、野指针、非对齐访问
* @$ s9 b- q1 J  Q4 Y* ?- A
4 M6 E6 H; Y9 I$ U  N. ?
# L. X/ _, }! H2 x
接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题
8 b' e8 Z/ g! t/ X% i: R* D* D+ b8 T" J0 `% [1 e
定位错误
# o+ y1 V- ?+ T; k方法一  Show Caller Code0 t* P4 z( z7 ?9 x/ H$ P# J4 G
在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。+ y; }$ o+ P+ e. ?$ C, V3 I9 J
9 K* W1 Z: @* K
微信图片_20240729134833.png

4 ^& s8 G2 V( \8 v5 |7 _9 F
- h3 B' P3 u5 {0 [  m* E方法二  开源库CmBacktrace
/ h" H* s+ ]' i8 s4 }* ^CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
% g8 b6 c0 {( B" S
0 f8 ~# C: S/ f' u支持的错误包括:
. m! e! O6 i! g, A5 U断言(assert)# R2 d4 D& g; a: a0 j
故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault); y8 i. _" F6 r) }0 \7 Q( A
故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。
0 z; }, {  N+ K1 Q6 B+ |2 g& z9 ]* C( A$ U) P9 y9 a( x/ X: o
输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈
* t7 T' o6 u9 n) Q/ l9 O# Q  y9 z. Q
适配Cortex-M0/M3/M4/M7 MCU# {+ G0 \2 a0 E$ Z/ ~& q0 a
0 `) b/ n: a8 c; P4 b2 @$ @0 a
支持IAR、KEIL、GCC编译器
5 l& w" m  a6 E# Z* S
9 n+ B( L3 y% o' t下面我们以实例过程移植及使用(Keil)# N0 h2 s; P; H9 e$ Y  O' p: z5 m
1、下载源码,解压,如下图
$ ~2 b" w4 F/ b9 h' g$ I5 y& M
% `* e( p8 S, M& y/ V  e6 i
微信图片_20240729134829.png

, ]+ O6 k+ `% ~! ]

9 ?3 G4 q" z2 e2 n% S( x3 T其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。
6 d0 ~6 t3 t( k8 c9 T  g+ N/ c2 z% Q  W3 {- P! \1 p) H2 h, g0 K
2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件+ s2 k2 b- H3 G
% c" E- f. E: I) }( p" [1 W
微信图片_20240729134826.png
+ m; \- c6 ~5 g' }. Y+ w' O7 @! _

( l) ~; O$ ?# W+ U! F5 z3、添加到工程中,添加头文件、勾选C99模式8 n! G$ j+ w0 V& S! Y
7 F; ?) B5 K$ z0 o
微信图片_20240729134823.png
  }3 |+ R& I; b6 A* _: X( Y& C

) @, S# X* I4 i! Z
微信图片_20240729134820.png

; ~; D1 s. `2 I4 Y# X6 z! A- }8 c
% h  z( I  `+ Y4 t! G2 E+ X' H+ H
4、这时我们可以编译一下工程,编译后提示比较多错误
9 Q/ l) ~* T( s8 `7 s" b! v, D6 Z
+ b9 {, w6 ~1 _) Y. B- {
微信图片_20240729134817.png
. `" ]9 r4 v5 E! k6 m
! A4 u/ J. c- K( `9 }# k
5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:
! x. k' n5 h7 x; m0 @  Y8 m% ]3 ~% d: ^' O* I, v
微信图片_20240729134814.png
  u* n5 ^2 @/ L# w" n

3 P. P$ }1 d, J4 ^+ h! X& s0 d) a6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了* Y* ~% ?6 m/ x7 x
. M1 m3 j4 l4 e3 w% D
微信图片_20240729134811.png
& n/ H7 r' x! P8 A

/ _  Q6 l7 _$ |/ C: u7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽( k$ {3 A( I- o8 |/ \+ p& I/ }
  w  Y+ E8 s* I& v* c
微信图片_20240729134808.png

3 l* N: L. o% y& K9 n1 B
' V% `( L$ c  T: d- y1 E6 S" y
8、这时我们重新编译,错误消除。
" c8 B0 ^- O; B3 t, A) e9 S& [- K, r3 ^" l6 R2 i
我们在main.c文件里编写需要测试的代码,如下:! G+ _0 i; L+ [) r" B3 S
% A) F* B$ i& z/ W  o+ \
微信图片_20240729134805.png

) f2 W% \) X5 U3 D! e' N( U
1 b: y- R! T( p) ]
/ ^; ~) L0 }% |8 j* x& \$ ]
) Y0 X* w8 C+ L
9、下载并运行程序:- w: ], S( M- a; q* s* [

/ @2 H( O4 N6 \" G
微信图片_20240729134801.png

4 Q: _7 {# _8 z
; Z. t  T9 |# E# I0 f  N' s
10、可以看到串口输出的错误信息,我们根据提示运行命令:
8 T& V/ a( ^+ l" H+ ]addr2line -e USART_TEST.axf -a -f 0800157e 080015ce* G8 o- |% R! s, n. U( _6 \. d* [

4 Y* N  G; `% j运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,& g/ G/ M5 Q7 |- z8 v
3 A7 {( I1 e! h4 s
微信图片_20240729134758.png
7 E/ X) P5 `/ {8 m

* e4 n" v1 Y$ X4 s* U# e* u+ {6 R4 F11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:" }3 H3 m2 T7 ?
* T9 X: K6 e% k/ w! Y; ^
微信图片_20240729134755.png
8 l3 X" x- s3 ^1 t) o) E( I
3 p$ x: p& r5 ~3 j2 b) p
12、在该文件夹中,我们按下shift键同时点击鼠标右键0 B( ^0 J' k* z0 n4 E

" W, ]1 ?1 V8 o$ Y9 W8 t
微信图片_20240729134752.png
0 o* `& Y$ @0 {4 _7 ~/ E9 q0 w/ a8 G0 _
8 U1 Z1 R+ G* h0 S8 t
13、在powershell中,输入 start cmd并回车运行: ~( F) @5 t9 D* M5 W1 N5 N
+ O  Q+ w, z" I/ A$ i
微信图片_20240729134749.png $ \  b% i2 v' R# O
0 s% T2 x. A" P. O  I: I8 X
8 L1 l) J: A0 d( ?* ]5 U( l2 c
14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行
3 i) }4 H9 k) @% o4 E2 {& r( ^, J* v- j6 {, I
微信图片_20240729134746.png

  L1 e7 Y8 C9 X' I

6 b" I4 B& ]. Y" H, d+ _  J15、可以看到addr2line.exe工具给我们定位出的错误代码行数% ?0 l$ y0 ^- ~: s4 e" T
. B5 ^0 Z1 H% ?2 q+ J
微信图片_20240729134743.png
" q% d2 q3 I( j2 ?0 d) P

# J" j' U- b! x6 K) j- z3 I/ G使用CmBacktrace库能帮助我们有效快速地定位HardFault错误( z) a/ T/ b, g' Z! w
* u) _% c- E( ^( o
转载自:创客技术日记
! l5 ~$ V3 y; k4 _1 H3 E/ W如有侵权请联系删除* z$ u1 {6 l0 _/ N0 ]8 w
* B, q% z! M2 B
收藏 评论0 发布时间:2024-7-29 13:50

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版