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

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

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult# y! y8 m5 k! x6 K6 ]

& Y% C" S, ^. V- k. ]5 k: y常见的导致单片机进入hardfult有以下原因:% n0 d/ B9 \) B, b1 a
堆栈溢出、数组越界、野指针、非对齐访问0 @# k' P4 c5 o5 G+ S. l

! v6 y) D4 A" a
! S9 u4 o# j. O7 z! u7 I) ]
接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题
* [- h0 G" s& Y; B& A- U) p9 \8 B' I* x2 z3 M  O6 |
定位错误: E& G3 T" V9 t: [: F2 I7 M2 L, _
方法一  Show Caller Code* s& U# @8 |5 c& M2 S- s9 {2 q
在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。
6 A5 V. ?% ?/ A( Z
+ r" v  I& h; ^9 Y- t& ^0 N
微信图片_20240729134833.png

3 Y1 x9 o3 y6 u% B# D0 U2 Q( Z1 G' `5 z5 F, r) [4 a# K# C0 P) H) p
方法二  开源库CmBacktrace
* p$ y. `  v$ `, `4 F1 FCmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
& V# q) J# y% Y, t4 {' W" M; e: C4 e( C; i
支持的错误包括:
# x- \7 L+ t: F0 f6 N  |) P断言(assert)* [/ z. ^3 R7 M: y, |7 r. q
故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)# f' i. [# q( u# r8 B+ X* b- B
故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。
. l% Y' z; y, J3 T
6 E% a# }- k1 a: T( l" u输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈
  N% _: T, V  L4 R/ ]9 n/ C
, N# m1 v* k/ ]$ T1 Q, @7 i+ ~适配Cortex-M0/M3/M4/M7 MCU' }6 B- W3 v" i9 L# ?7 N2 i$ p: w2 f
0 x- e, z4 b5 k* ^" a/ j
支持IAR、KEIL、GCC编译器9 V$ z, e6 C& L1 I

/ ~) r5 B; X5 h- E( C, w" j& ?下面我们以实例过程移植及使用(Keil)
& Y; a: U8 L2 Y* m' s+ Q: c1、下载源码,解压,如下图4 f/ e; y& G: q# o

$ k" b; _6 R# X2 f% \* }/ I
微信图片_20240729134829.png
4 f" j' \. n( L3 u/ _2 `. j

7 \, v% C/ z7 Z4 a! ^" ^其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。+ C% I2 H# {0 j6 f0 \9 v8 |: z# q
( r' Y- {3 [/ k2 Q4 X
2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件
) i9 n. e% C+ G! y0 [! H6 p4 ^- U( ]
微信图片_20240729134826.png
2 J' ^: V8 D( q* z

3 X* `0 C* T' j# Z! o! v5 A3、添加到工程中,添加头文件、勾选C99模式
, N. x4 A  V, F1 f% o  E" m+ Q6 ]5 \+ g
4 j! p$ J# y7 m* I
微信图片_20240729134823.png

+ q" W2 [5 ?/ x: ~- f4 k! ~  i& w# m) a5 F! l3 c5 c+ T
微信图片_20240729134820.png

: H- _0 F. J1 e/ a: y1 U' q, g9 _
$ l; K  c% x/ `3 F$ c
4、这时我们可以编译一下工程,编译后提示比较多错误0 W5 o$ S% Q0 N5 Z$ B( x3 g6 e5 [
1 A& q1 E$ F0 H# v' \
微信图片_20240729134817.png
9 w4 @! o9 K0 i3 H2 _. X

/ M/ {8 r! Q- e' r& a5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:
% D, u: @$ ~: Y; I1 [4 w/ `* h
" I0 e- b; J, H. C0 D& c
微信图片_20240729134814.png
. L0 U  t" Z; t' {

' i; l4 G( X3 B4 x4 C' {+ A1 [6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了$ V5 B5 ^6 s1 Z6 b* ]

" U5 X6 {. D- o: U1 z- ~0 w* @
微信图片_20240729134811.png
9 A) B6 F- z( @6 k" w% E

& s- D, n8 i7 p, y8 ]7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽3 c7 |/ i+ j' H

- I* p5 s) D$ R3 b, m& m' A) i
微信图片_20240729134808.png
- Y* j1 f- }/ f& x, d' L4 A0 }( E

0 o3 m7 K/ `6 P% m  T) k8、这时我们重新编译,错误消除。" N4 F" y/ r- u: \9 @6 b  J$ W# q

6 L4 P: Z1 m1 K% B3 b我们在main.c文件里编写需要测试的代码,如下:2 Y3 J& K& h3 D

2 p4 g. N2 V2 X9 A- y0 J, w9 j
微信图片_20240729134805.png

  i1 `+ F0 W; U4 }( I+ B
! Y6 ^5 H  @" Y9 |
7 @* A. }$ U  k1 B6 G
5 r2 i/ p; t$ T& I
9、下载并运行程序:
* ~/ B" y1 X# F# [; ^1 B* _, q% ]0 [% m# C$ ~! k, e. w( {0 \
微信图片_20240729134801.png
, \6 e* I3 d, w) I. t- p+ Z

6 ]( Q0 y6 t+ O# J10、可以看到串口输出的错误信息,我们根据提示运行命令:3 O, V! b, c& B% ~" d
addr2line -e USART_TEST.axf -a -f 0800157e 080015ce
6 E8 l; ^1 x5 F3 f' }
+ T9 Y! m2 \& W9 J+ Z% u) R, k+ h运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,
5 Q2 t3 t* V4 t. x
6 B- n  D* V, {2 \
微信图片_20240729134758.png
; l1 z! p9 _3 D" i: y

" H6 B1 w. v" q. Z* L1 C11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:
  c- K& `6 n6 R4 {& G6 A1 d8 Y

" z, y; Q' u# m4 t
微信图片_20240729134755.png

# Y, u: }  B; Y  J3 k1 Q* L) }- X! n
12、在该文件夹中,我们按下shift键同时点击鼠标右键
4 \) }4 S7 e/ }3 `
; j1 |& M! d  M
微信图片_20240729134752.png

7 O' N/ z' U7 _  f$ z7 `' x
' B0 \5 ?5 F" F; Q
13、在powershell中,输入 start cmd并回车运行3 o% b' B' r& u0 }. D

8 v, B) `  T% g) t
微信图片_20240729134749.png ; F0 o9 B$ {  `

% @! Y# [5 L0 ~# e
% r* v5 G; k2 t, }$ ~
14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行1 L  r# h6 m2 ]6 a/ v# s

& ^' h6 h8 f4 o
微信图片_20240729134746.png

8 {9 ]4 Q$ z3 i  f- D$ H, q
0 ?5 p5 u5 }* E  @
15、可以看到addr2line.exe工具给我们定位出的错误代码行数
2 w! r) |; j2 o5 w/ b# A& o+ ]7 U$ g2 Z: C, w" Y
微信图片_20240729134743.png

% e. v/ h( @  |0 b5 x$ V, f
' @( s) {3 S0 z& l
使用CmBacktrace库能帮助我们有效快速地定位HardFault错误9 d7 ^5 S1 k! r+ z
$ @- F: a& }. K$ Z5 [, U
转载自:创客技术日记3 C, S3 I4 t3 Q: F5 m& }
如有侵权请联系删除/ F3 Z8 {  P/ P* c7 R$ {
& i; ^, L, T# B/ _# [( ~, M* M2 q
收藏 评论0 发布时间:2024-7-29 13:50

举报

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