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

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

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult
1 i% y* I$ L/ g. ~
  v( ~2 v: d- q3 d; ^/ t! Y常见的导致单片机进入hardfult有以下原因:
( q- f3 @+ z% d6 M' k堆栈溢出、数组越界、野指针、非对齐访问8 X. K( f, F* [1 K4 S, v: p( Z

0 C* {) r% B1 D: N5 l  B
  i* y  p  S: h2 c
接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题7 K$ O7 O  A- l; k8 ^
, O; ~5 L& M+ @0 U7 A) T9 N
定位错误7 u1 @  {! Y* t7 `% H' L
方法一  Show Caller Code
3 P6 \& S; [3 {$ i; Q在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。( N6 f: c2 D/ m! i4 y5 z

& Y7 M6 O% `. X3 q
微信图片_20240729134833.png

% i0 Y6 C' z  z7 X, ~5 d9 {: T" o  }2 f5 W* h/ I6 u$ A
方法二  开源库CmBacktrace* Z* O5 p% k! `4 ]9 S4 N- P) _% f% V
CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
! [* R( x+ F$ c" p' k
, V% q* f% s0 s7 N支持的错误包括:# O8 C/ \2 v, O: V+ L# y4 d( L0 X3 U
断言(assert)) t/ a; I/ l, I4 S; A7 ^2 [3 p+ P
故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault); i! @2 Z/ a  Z8 I: r1 u
故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。
  P* t2 v; g! |  h  S( v3 y6 a8 |/ O1 P- p. A" c& h' D9 C7 c5 n
输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈
' a2 S0 J. F8 w- u& K6 T& l+ H4 t' o8 R1 C) h& c* v
适配Cortex-M0/M3/M4/M7 MCU! \/ t6 [( \* J4 ]4 N% k
* {  T, f% H4 K5 U! O
支持IAR、KEIL、GCC编译器
! n" R. Q# J" J; R0 y/ h, }/ z
- S: O5 G. @9 \4 M3 T下面我们以实例过程移植及使用(Keil)! A7 ~  F9 B$ E1 L' ?' Z* ~& z
1、下载源码,解压,如下图4 i- q9 M/ c  C
9 i6 }" H- J0 v) o7 \
微信图片_20240729134829.png

: R. ^- X* b/ F3 N' L6 Z; ^) L

/ k; p5 L' H/ X& L" F其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。
/ z, [9 L. r! H3 ^6 P' p
! X& F! h! d7 R, W6 r% c! g2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件; q' u$ O5 Y' P/ Y8 \( k& ?# D$ N, v

0 E9 \. U1 v& o, L
微信图片_20240729134826.png
/ C) [3 l: E; Q1 e# j! p6 ]+ B, d2 e

6 H1 O, i% ?5 L' u3、添加到工程中,添加头文件、勾选C99模式
% h7 e& X; j' w) Q0 Q* \
* N/ }: g8 T$ u- k
微信图片_20240729134823.png

: q/ m5 ~7 [" ?7 f+ Y* e: g7 a4 K
! Q- P5 Z! K3 e/ _+ }7 U
微信图片_20240729134820.png
$ {9 }/ m1 r, D: n1 m

; M5 b  B+ U7 f4、这时我们可以编译一下工程,编译后提示比较多错误
1 A- }+ P0 G# L
+ K1 G2 J/ v2 _
微信图片_20240729134817.png

: r* m" i0 A; F1 v; W! m. {5 q
! l! A) E" B4 d" q1 H
5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:
5 }& M5 X& _- H" u: Y8 t8 m9 f# l) f* l5 h( w% h0 t& i
微信图片_20240729134814.png

* O; H2 k6 L, A4 P

% u. H1 V: z- X1 l6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了
8 ^  E9 K" K8 O( ?
; J$ F0 W* O$ P" I. l9 J
微信图片_20240729134811.png

  ?$ J$ e8 ~  P2 H0 {6 o6 n' e+ a+ ~! |2 i9 n* n8 `$ [
7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽
8 f. O8 S, ?, X+ f( ~# I$ y' o$ \; F
微信图片_20240729134808.png

+ @5 P/ V5 \9 D4 `  t4 ]* E
5 \  _' w1 h8 }5 G4 M
8、这时我们重新编译,错误消除。
5 ^# i( W/ S* n' r6 X: r5 @* Y4 |% i6 I
我们在main.c文件里编写需要测试的代码,如下:
' _) t3 I0 e/ }
' C5 }0 T% `) g- C; f  ?. `8 L' ]
微信图片_20240729134805.png

: n: X5 S$ L% ^  W8 T! U
' \- n5 L+ J6 Q, `  I' H9 U5 K4 @+ f" j$ p  A: t' h
2 d& {6 Z9 B. W
9、下载并运行程序:
; Q& E  F4 [- o5 H5 O- A
, H2 y0 {7 w% @
微信图片_20240729134801.png
/ o  w$ j1 D' h

# L' {' a" ~- c+ a  }/ n* N+ Z" j10、可以看到串口输出的错误信息,我们根据提示运行命令:
& t3 ?! n6 J# ~, w! @3 U6 oaddr2line -e USART_TEST.axf -a -f 0800157e 080015ce/ ?7 K' }4 f$ W5 K
0 H3 R4 V* j0 w" x- C7 P$ j- A
运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,, e. }3 d  O. t

, B1 i  `( @$ h4 s: @  ?# t6 W
微信图片_20240729134758.png

8 b9 z% T! I9 v5 _3 x" L% N2 \' b6 a2 n: Y7 Z
11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:/ e, |/ y- p- ~/ u" ~2 W, w) p
: H1 l  a/ w" V. n( |
微信图片_20240729134755.png
. h* O; C4 K5 v, x
2 a& _/ V" f7 V) ~0 W: m6 ^6 U
12、在该文件夹中,我们按下shift键同时点击鼠标右键
# G2 N2 S! G6 B# o1 _" g
1 n' W  y* ?$ M5 k+ H
微信图片_20240729134752.png
( S" A# q6 s' }! Y) S! w+ f* m6 I

& a: o; ~- g& M4 Y' W; j; i13、在powershell中,输入 start cmd并回车运行
% L1 F9 g( a8 x' l0 @
% G3 d& G2 n; l/ m4 }: k
微信图片_20240729134749.png
. e* S, [5 y2 w* o7 l1 I
: q% w5 j3 j) i" g% f+ T

' G# u8 {3 I+ A( i14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行
* e8 u  j- V$ [+ G, T/ s# A  O/ W' w& ^. I
微信图片_20240729134746.png
  I* \( |9 R! K5 b
5 v& B. _, N; `0 g( E& o
15、可以看到addr2line.exe工具给我们定位出的错误代码行数; o  @4 B8 ?" f7 A5 h, w, G8 B# Z
. R- v- u  x) ^6 @; A
微信图片_20240729134743.png
6 x+ z  b+ O0 Y& q3 t* R
: Y. v! x2 o1 G
使用CmBacktrace库能帮助我们有效快速地定位HardFault错误
! ?2 r, K: B; O2 c
2 A8 d' y4 z) }: A
转载自:创客技术日记
* M* r; |1 w" B. y如有侵权请联系删除
! b) `, H, D$ C5 U$ h/ x0 f! b8 h4 Q0 x. |2 j& A- u' A3 \
收藏 评论0 发布时间:2024-7-29 13:50

举报

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