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

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

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult$ R9 h, F+ D4 g: Q- o; B+ `

- H4 F. u) o& B9 x常见的导致单片机进入hardfult有以下原因:3 T3 o6 y% y3 b) d
堆栈溢出、数组越界、野指针、非对齐访问4 v$ e3 C0 F2 U' E

0 w. j% @& R3 k' k; r# a7 s( S2 A  @

/ `$ l& \# I" x  {4 E) s接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题/ z' u* x3 `6 k# y* o5 F

* B( q" X! G; @& s定位错误6 c9 i$ Z: c# U8 A
方法一  Show Caller Code- L* a5 x8 U( `! L4 ]
在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。- T& z- V- O: v# {9 c; e2 y
! v8 p+ N7 A% N
微信图片_20240729134833.png

6 H, q5 D  `% |7 H6 Y
7 Z) b$ z  h  a4 X方法二  开源库CmBacktrace
7 m4 d/ a& L4 E# c3 E) rCmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
5 d$ U5 E' k+ ]! E7 s! @
# u$ ^8 X2 Q5 d2 v( O$ t支持的错误包括:3 `/ r% S* O3 l
断言(assert)" [8 g) h. @0 B1 u) y6 K8 q. c5 }
故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)6 Z4 L3 z& P  Q3 S1 U2 \& K, I5 F
故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。
2 v' h6 T/ a* X# `
: d3 J. m1 i5 T- I. C3 D输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈' w! C( n' d4 O' p* I$ v
% @8 {  ^: w( Y: Z+ _8 O4 @. d
适配Cortex-M0/M3/M4/M7 MCU
, S* u" h8 `( P( n2 L, v7 u
& Q7 ?$ W# ?9 L支持IAR、KEIL、GCC编译器; H$ t0 Z1 o& @9 Y+ e( @

# V: V  j4 F; n' u# |  z' g/ m下面我们以实例过程移植及使用(Keil)
: W: [7 ?8 J3 o. B- T, m1、下载源码,解压,如下图
- o4 r+ W7 A5 M$ e! _3 F: E: i: ]9 [. N& t" E7 u
微信图片_20240729134829.png

% |- ]+ D8 ~( b* {
0 p% D! @% l$ I4 Y! _3 o
其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。1 t) ~0 [2 B" e

8 g$ e0 S' r/ U6 w2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件
7 u( G2 Q/ Y% {- ?0 M# H9 n) Z
. l* t6 C5 U# H; I+ {4 z' j
微信图片_20240729134826.png
" f+ [1 j6 B( e; P8 s  h
4 q# s; W0 X) Q6 I
3、添加到工程中,添加头文件、勾选C99模式
% i5 E; E/ t7 v9 p. L# f6 X5 W$ D& Q! q( f5 y
微信图片_20240729134823.png

  E: X, K, [) X! w1 j3 |
' O! O. w0 v1 _) b+ P# Q
微信图片_20240729134820.png

; R6 ]2 d- q6 U; y6 y

. M2 }+ V# c  E; G6 q/ D) q8 Q4、这时我们可以编译一下工程,编译后提示比较多错误* t1 `$ H1 }1 y4 z9 f
8 ^9 b3 v& V% p) p' V6 X
微信图片_20240729134817.png
9 e; d: i" F+ `: m8 o4 v

  }$ w" W# ^! }7 i" e' S# m5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:
( r+ U  c, k  y( ~" f' [4 U& {" \! e+ O1 J; M- {" Y& W8 R; Q8 p
微信图片_20240729134814.png
. L* v7 j  e+ U' g
/ K( S1 M1 ^! D
6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了) ^$ c: J0 _2 t7 b' {& |' ]* a7 O
( Z/ ^* Y7 q, \4 B- Q/ h" P, q
微信图片_20240729134811.png
  s) {( `5 D. W+ d( l: `

6 f+ @, r3 q( y5 F( D8 k7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽
8 x  g8 l" c4 l- @3 l# Q9 q& O
5 T/ j9 S- _% t7 R% R' f& I7 t& Y
微信图片_20240729134808.png

7 v% C: T1 z3 c

, [5 o; r# h; {, o- t& m8、这时我们重新编译,错误消除。
& ?/ ~, A7 c: P% H/ q; V# G0 s. i; ^' z/ @
我们在main.c文件里编写需要测试的代码,如下:7 G, b) \$ x) l. T" }# |4 O

$ l0 p! u- C' g
微信图片_20240729134805.png

' G5 X; ?9 r5 g2 P8 y/ H1 a% ?3 W2 S$ `2 T

: ^- w" {4 w9 P! o9 i
" T: Q/ w2 y& g
9、下载并运行程序:
5 d! [8 P$ s/ {7 n) {3 C
) p+ K' ~9 w" M1 S
微信图片_20240729134801.png

: e/ {0 t4 G0 A7 e9 _+ d1 v7 f" t1 U5 r
) N$ U8 ~: I2 i1 B
10、可以看到串口输出的错误信息,我们根据提示运行命令:8 N# w: ^  r0 c! A: g% M# o2 O* j3 k
addr2line -e USART_TEST.axf -a -f 0800157e 080015ce
; ?: _1 j8 p. |. P0 ?) M8 W- S: }0 @; b. c
运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,) w  |! ~% R, I+ H# _% G. q0 P

( t  S! D; k# \/ h; S4 _1 t
微信图片_20240729134758.png
  M* N" N9 l* C/ G( E
# @( i  e, z4 H8 \
11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:
- r! h  ^5 v" I+ f( C, y
9 U8 E9 o  N2 S( H$ x3 G6 I
微信图片_20240729134755.png

! C# o. B. p. M3 c2 L0 z. z8 I/ |- K% }9 f  ]* s
12、在该文件夹中,我们按下shift键同时点击鼠标右键2 D" e, `1 T& s6 K  E

1 T& Q+ B" ~' L5 `
微信图片_20240729134752.png
" E2 H1 P+ P( z+ m2 t* j$ u6 Q
* Z4 ~" Z% ~8 p& ?, V) R4 J
13、在powershell中,输入 start cmd并回车运行/ ]% r" `: p" r( S+ ]2 [, ?% C
( z( E5 S$ a  ?. a0 z& x
微信图片_20240729134749.png / [6 g- y/ \% Z' i+ x2 C, ~9 J

6 q; z* D$ ?! Y8 Z
5 d" O+ a8 N- \/ R" ~+ T$ \
14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行
2 G) t3 S9 F5 |4 y* p' \7 o& k. _6 R  m$ ?! s4 \
微信图片_20240729134746.png
) k1 q# L$ a4 N6 e+ I4 ?
) a- D$ h: M( S$ |9 Q2 p* \
15、可以看到addr2line.exe工具给我们定位出的错误代码行数+ O' p8 T" O* P! Y7 x% m) r" g* {9 {
. M7 Z5 f0 S: X2 ^4 C. v- g
微信图片_20240729134743.png
# T1 B. t' D1 g2 R. a: Q0 L) o, m
2 a9 V8 x8 Z; R2 g* l
使用CmBacktrace库能帮助我们有效快速地定位HardFault错误9 m7 `; ~& Q; |5 K' k: u& |
8 @- [& Q8 B1 k* z
转载自:创客技术日记  R# p7 t4 t1 k$ s" e3 n+ {& F& F* P
如有侵权请联系删除
+ \1 E3 F. T) M; r- A. P3 F. h7 Y
7 ]4 Z& H; W' \+ G4 R- n
收藏 评论0 发布时间:2024-7-29 13:50

举报

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