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

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

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult& F  @: h% ~$ t: Q3 j

9 T. A( u7 A. S6 `# e) P常见的导致单片机进入hardfult有以下原因:, w5 k8 H. |7 a9 S  ]
堆栈溢出、数组越界、野指针、非对齐访问6 L1 V; f. X' o- @6 e, m

  e5 q" @9 ]+ ?# J

% ~" r: l( i$ f接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题
# P' A9 ~5 V9 a! N8 Y1 `8 `" R
" a! L3 d$ a- o2 d定位错误
4 `; l. D. V; u' Y4 i) n) f方法一  Show Caller Code( S* ?; p) C9 e
在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。
- t) N. D; O7 ~) _" e  v4 ]: `

  o( M$ x0 i, q$ T
微信图片_20240729134833.png

8 s% v. d9 }( {5 M; P+ w5 r5 l* U7 |
方法二  开源库CmBacktrace
( @7 C1 p: S5 ^CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:& k8 J& ?8 A8 I" ?7 R2 b( d
) q4 \) A4 H0 J! L( l& V
支持的错误包括:
" e- B7 f/ ?& M0 u( d断言(assert)
- U" N: }9 X% I5 O* I故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)
& P) o/ _$ {% W; ~6 H+ C7 ]故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。
$ k) \: w7 a8 W, ?' _$ k
' q( U7 r5 A3 i0 J& C8 }( \& M, y, X4 K输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈
4 J. z0 d4 Z2 S: ?, _0 d5 b( c. J# ?4 ]" t" n
适配Cortex-M0/M3/M4/M7 MCU( _1 Y, u1 A$ D9 ~( c' Z' \8 i; N$ E
& N6 l) K5 c* l
支持IAR、KEIL、GCC编译器
. u& l6 _8 @" `, A. X9 p1 [- n* ?. {9 H0 z7 b4 u% ^
下面我们以实例过程移植及使用(Keil)6 n) X; x3 i5 @. @
1、下载源码,解压,如下图/ q, Q5 G$ ?8 \% v# c  O) X0 G
  d5 J& O( f; ?4 R5 H
微信图片_20240729134829.png

5 v' C% o9 v# U0 }! q7 v& `0 E  {$ K

* N# C/ D  H3 S" H3 P) w+ j" A其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。. q9 ?( R, w1 l' G- O
, z* B' \& H6 X* A* V4 G% C, c
2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件
$ A& g. Q3 P( {- q4 f2 {/ B4 |" Q
微信图片_20240729134826.png
* j, O- k% @7 _4 H5 r

3 q  Z9 I7 {: [3、添加到工程中,添加头文件、勾选C99模式
! G- E- Y$ R: V! j
, g* E; B3 l( _* I
微信图片_20240729134823.png
3 |5 J" f* ?: t- j' L

0 s& ?6 s+ k1 C2 [$ Q! N
微信图片_20240729134820.png
) u, x0 L6 w/ h6 Q/ a5 X7 B4 V- K
' g7 K4 z1 w8 u9 b# P- H# ?" Q
4、这时我们可以编译一下工程,编译后提示比较多错误
( _- \' h  h, H2 c7 i' p/ _$ x2 Y/ |
微信图片_20240729134817.png
1 y6 W! b. U  E  r

7 E& n" M  V  N. s' Z5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:
! n- c  i1 \/ i3 k& ?0 z% n
) C+ d  t5 ?! k( L8 T- u' ]3 f
微信图片_20240729134814.png

6 N6 e  \. V4 y7 n' Q2 `
: S  K" q. e4 j9 G5 f/ F* V
6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了
! C& [: c, G3 a: f! L

2 z/ g5 `9 s; [
微信图片_20240729134811.png
* m- x0 U4 n7 g  Y1 G2 e% Q3 @
0 H& y' f5 L1 y
7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽
/ }0 `! W8 x# ?2 C' n: x( D! G8 R8 ]; v( N7 i
微信图片_20240729134808.png
" p  o4 D+ \# _4 B8 `9 e3 F8 _/ J
0 b" w" J! a0 I. V
8、这时我们重新编译,错误消除。5 _* o0 H  q% x& M

- L3 \% M( ~; m$ p" N% r我们在main.c文件里编写需要测试的代码,如下:
% C6 C- B$ G+ w) I/ N- w8 F

5 D/ G( R/ `& Z+ r
微信图片_20240729134805.png

7 D. w# V' C* _: B3 X* U1 r/ M* i( K$ [; M0 v$ c

, w' t; h; W: U3 D, P) u

6 I8 s. C" F$ `: R5 H* c2 N9、下载并运行程序:
- A' ~$ h+ `! c) r  G( t% F! O' p2 I! W0 C- ^; I6 j
微信图片_20240729134801.png

; n8 J; s' G" S% Q0 G) t' g

2 T4 w- a) Y# Z1 _5 w10、可以看到串口输出的错误信息,我们根据提示运行命令:
* [& A5 W* z+ g* W' Uaddr2line -e USART_TEST.axf -a -f 0800157e 080015ce
+ \# \4 V& _; F* N% @8 e5 @9 L/ `4 v' j8 y7 T7 d' f: S
运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,
" T+ d- ?' t5 m( S( r3 s0 t
/ [: ?. e7 s% O# f4 M  H1 B5 _2 G
微信图片_20240729134758.png
8 m7 y0 A/ l0 [% l& Y5 V
! N; D1 t7 u/ h4 \
11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:4 v# b# X: Y! U5 B( ^9 ~7 N, r
# f! h' E3 _1 K$ p% O. E  ~$ r3 [
微信图片_20240729134755.png
4 m( j: Y  N6 W* b9 p3 T

; c* U. J' Q; K/ H+ r: T+ {12、在该文件夹中,我们按下shift键同时点击鼠标右键
7 w# J% ]4 E/ P3 O! t  d- i) z: D8 w
微信图片_20240729134752.png

& w- d. R- Q% Q. [1 x. X1 B

/ q) W( h9 |+ n, L$ d3 c! v13、在powershell中,输入 start cmd并回车运行* c. B5 g  y. ]" ]' z: l$ t
+ G9 K" V' a  \! M
微信图片_20240729134749.png
3 w8 @6 _: I: Q& a* |; L& c

7 f7 d7 s" h6 @! H; P) j
2 [+ I( o9 D. C$ R5 }+ Z/ o: j  K
14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行$ S/ i. _. X6 v6 w: g

. c( A  h/ X; x! U, @
微信图片_20240729134746.png

. t; t* d2 y0 T

- }5 l8 @3 C& W2 _0 f4 H) u- K15、可以看到addr2line.exe工具给我们定位出的错误代码行数
3 ~7 R1 a, ?( f/ a1 {! k
+ ~( i% v/ U. M, R' n
微信图片_20240729134743.png

" P% m/ j$ M- G. M- J* j  l# e
) G) @0 u) t6 q3 g5 @$ ^9 j
使用CmBacktrace库能帮助我们有效快速地定位HardFault错误
* l/ ^2 f8 [6 ^6 Y: ?8 t4 B  Z; R& E7 {$ Q" F& @
转载自:创客技术日记0 Q2 e% Y3 U5 p7 F3 ^/ K
如有侵权请联系删除
0 Y8 R$ Q& v6 p" a/ u
! {( y0 }5 N# L8 [) X
收藏 评论0 发布时间:2024-7-29 13:50

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版