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

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

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult0 f4 _& I; \. p( p. l
! M' x2 `% N8 f2 K; g* W
常见的导致单片机进入hardfult有以下原因:3 d+ N% f  x& }- e! \( d; g
堆栈溢出、数组越界、野指针、非对齐访问
/ |+ t4 k; [% u0 M% W6 Q2 B+ h. Y6 T: [3 a& M
0 r- d& v# k, r$ u* h
接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题8 v; J( i6 D) {# k
, E4 p5 m; }6 T/ w" y
定位错误
4 I8 C6 r4 B; Z6 ?- J- I) |! F方法一  Show Caller Code( e7 Q4 X+ }- N0 x! N3 R, n
在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。) G4 Y9 M6 V5 Z8 x
+ ~8 o5 u0 X# {% y% F$ ~
微信图片_20240729134833.png

/ M/ w( T; h* {' p4 M5 D# J1 r6 R1 p; a: R, p0 D3 d
方法二  开源库CmBacktrace
0 {. v" b: H' B1 {CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
- C2 O! a7 G8 J6 K/ Y# ?
- R: Z- e# W3 H# V8 s8 q1 D+ I支持的错误包括:
9 {3 X1 Y5 a* C. L- N. }4 Y) n% @断言(assert)
+ H$ |( C# x. {* }$ L8 L" `  Z. W故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)
+ s! y% f7 r- l8 g7 d3 i8 v故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。* i9 a# Q9 Q4 J
- I/ V+ s7 ^$ K3 t) b9 l5 N
输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈
* M" c, q' B: `* O7 G7 ~0 X9 @9 ^$ J7 f: p6 K$ U# X8 G
适配Cortex-M0/M3/M4/M7 MCU7 S  t' F0 a3 k" ~3 i

9 N2 u  t: I, k+ g) W, l- n2 n+ R支持IAR、KEIL、GCC编译器
, F- X7 K) ^. W0 U8 o  X4 ~0 W$ K' m, N/ p
下面我们以实例过程移植及使用(Keil)' X6 V  E9 F* h
1、下载源码,解压,如下图
0 U+ @- h2 f% Y9 E
# L, T/ C( {7 b8 p
微信图片_20240729134829.png
+ q- {/ h) S; {' r" A$ n6 f

# P( Q3 O" n9 D  L其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。
& M, b2 B1 K  [. d( a+ C1 n. j" _$ `+ g2 q0 Z' g# _
2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件3 C6 l* c9 f4 G& `9 W" x# m6 d
5 O, _4 c5 x6 y5 A& y3 j! D
微信图片_20240729134826.png

8 h9 I$ K, ^; V
! Y8 o" G- x9 p% L/ J
3、添加到工程中,添加头文件、勾选C99模式
$ \( M2 f  {. m; \+ |  Z
/ h9 @2 T& I. }2 `
微信图片_20240729134823.png

" ?$ p8 J% e) h
. _. L( l0 T; D8 N3 k& m6 O: @
微信图片_20240729134820.png
" O/ C5 p) r* g$ c$ R

2 Y, ]. C1 N; \4、这时我们可以编译一下工程,编译后提示比较多错误. W# u# `4 m+ T
! l3 `1 I3 \- T) T* G# T
微信图片_20240729134817.png
) B3 d" {  q6 `
$ A. K8 A5 _# F. a( [/ |7 F( ~/ x
5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:
4 t" ~/ q! F" ^0 R+ h) m* \/ \% ]
0 ?  }' R0 u1 p
微信图片_20240729134814.png
+ z! x9 j$ t; z# Y' B2 V& ^

; Y) s' _0 Y- Z. P# D: F6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了6 [0 x0 ]5 Y- x
7 D, t3 f; Z  L$ P
微信图片_20240729134811.png
7 m4 u( L5 @) t# |
  n2 [. G/ V0 [8 U5 Y, h# f+ h4 L( L
7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽
  x" x" B5 V6 |. k/ D0 j: j' L2 C; O+ F2 t( L
微信图片_20240729134808.png
" P! g% N- X# |, V

/ |0 \4 b# _, b4 c- {' ^8、这时我们重新编译,错误消除。+ x* z6 j5 l; ~& G% i5 \. D% Z

" ?$ j# x; K- q& j我们在main.c文件里编写需要测试的代码,如下:! ~- [: K- l; ?4 b& e( n) T# T) Q

' l( f( x/ o- j1 ~) _
微信图片_20240729134805.png
9 p- b* L7 S; `3 j8 j- s; R. j  _
  l& X. A7 p/ A7 N
% i0 }; J' D0 O
+ ?# m' Z, J' U( I, {7 D
9、下载并运行程序:. K5 `" r5 |( X! u9 b; M9 _
0 o7 ?4 P" A! w' G
微信图片_20240729134801.png

& w3 j# t9 T. J6 R
) O: j  A: W: [4 C3 V% _
10、可以看到串口输出的错误信息,我们根据提示运行命令:+ S1 s4 T( R) X+ j/ @0 Q
addr2line -e USART_TEST.axf -a -f 0800157e 080015ce
; Y% v  k, X! ?) f. t/ W) S8 j2 j
) q; X5 t4 O1 l  ~# t& `6 ~运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,
( ~  W% q+ S0 A! X) r* E; T  j2 y
7 Y" ]" P7 I8 a9 V
微信图片_20240729134758.png

; F8 P4 ]" X; X
  Y. f" A( d6 F/ ^0 A. C5 f8 F11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:+ R5 p) u9 w/ r  u
) T  X2 l9 b$ N+ w) d
微信图片_20240729134755.png

% `% c+ r7 d; ?/ {* ~! M& c( A& v5 K! c8 c! V
12、在该文件夹中,我们按下shift键同时点击鼠标右键
, N  L: L7 Q4 t; H4 L7 f# _
& |6 @/ |6 ^8 r8 j
微信图片_20240729134752.png
& k$ C$ y' K8 G- K& g
# V& h2 w9 t$ y  ]5 R5 i" |
13、在powershell中,输入 start cmd并回车运行; L8 i/ Y7 ]9 X% }. y

" [( B5 p3 [$ [7 m9 B) _9 F
微信图片_20240729134749.png ) m& d+ @+ e1 V3 g1 ]1 U  L) u
$ k# e# H7 z  b* c, w) X( I" ~4 V
& N8 x: u" x" k) ~+ q3 |
14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行
0 c; E6 P3 _* H) e5 z! e6 I$ a- S6 u/ ^( h, v
3 m" W, b" n% J  m' @
微信图片_20240729134746.png
: w( S+ F2 S% j% S+ C

8 h, ^- _) @" \4 r15、可以看到addr2line.exe工具给我们定位出的错误代码行数" Z. H0 ]' t8 [$ _

' R* e' }3 m* E! \
微信图片_20240729134743.png

8 k7 j' j5 N7 P6 l" J! d; l" r
0 `1 A  V/ g; m4 L! Z2 a- D
使用CmBacktrace库能帮助我们有效快速地定位HardFault错误
2 g8 m7 a0 W: m- C7 W
* [: ?" e8 }8 W2 m
转载自:创客技术日记# B6 l* D7 A- x- e
如有侵权请联系删除
; T) G4 a' g( k! b
' |/ ]8 S6 x# g
收藏 评论0 发布时间:2024-7-29 13:50

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版