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

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

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult, B# p3 p$ d4 j% i' m

- Z/ F/ i% o) r! k0 a4 g1 D常见的导致单片机进入hardfult有以下原因:
" J4 v! k5 R1 w; X* R  Y3 W堆栈溢出、数组越界、野指针、非对齐访问
/ c- ?# S( T$ M- f+ H5 `
7 Z" o4 ]) R# P4 x
; u- \8 s6 r* B- n! {/ v
接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题4 ]! c, {1 u) L) ~2 j% z; a
7 G) {% e6 n1 r& Y6 w  K" c+ U. G
定位错误# X" Z$ E6 z, E! H  [) V, _. y7 z9 r
方法一  Show Caller Code
+ g: X+ z6 v# |( i8 ^$ R/ q1 D在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。8 L8 I( W' y( P1 ^# _3 Q1 b" P, h, y

. J/ }/ t3 t# ], Q2 s
微信图片_20240729134833.png
. [! G6 Q. v2 Q8 H2 j
6 x% K3 f) [; ]: s: |: e
方法二  开源库CmBacktrace6 N) T# [; |2 d9 q  I/ W* N
CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
- x5 l' D' H+ i
' y+ |2 C- Q+ ^/ |) n" d# l9 T支持的错误包括:
! L+ W0 W( r) l& b断言(assert)
  D8 T* v$ F: \0 Z8 U3 {) j0 x故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)
: `; R' l- O6 j# H# k$ P9 N故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。1 ?+ V( o: ?, |. I, S/ V- ^
' }' P6 ?: V$ }+ u2 l9 X" B
输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈
& x! a" i3 |* z( s( G. S+ D
5 \: w5 F1 I9 h4 o3 _! g$ r适配Cortex-M0/M3/M4/M7 MCU
# D- ^8 k4 G6 ^( ]) u2 Y5 f9 O; I3 y& l
支持IAR、KEIL、GCC编译器
* W$ K) j# m9 |2 k6 N3 ^3 A  f! j$ H9 _: T
下面我们以实例过程移植及使用(Keil). ^0 a1 X8 ?3 e0 c1 M) S
1、下载源码,解压,如下图
" X: D" S8 I& {- x; B' O  J
+ ]1 M# j6 O( `8 A: \" M: [
微信图片_20240729134829.png
# ^( l' Y: w" _6 P* V5 s
- V6 i6 {" e7 f
其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。* L6 S" O* ]- ^. C( ]

! Y, m( G, E1 s3 o9 {6 d  |: |# J2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件
8 V. L9 G) _* s$ s$ c  x
. g. A8 E: b. ]. [3 L# @
微信图片_20240729134826.png

7 F* }5 K5 O* m# O( W* g

1 F' Z' E& p- @; f/ ^- C9 ~3、添加到工程中,添加头文件、勾选C99模式
- t6 I# z. x5 x0 O1 ^
( A# i8 ]  t( {! C5 C
微信图片_20240729134823.png
; a/ M$ {$ P% t9 A
  r* u5 n0 ?9 J2 t
微信图片_20240729134820.png
7 Y9 k! |. E3 I
" `5 W* ~, X/ n
4、这时我们可以编译一下工程,编译后提示比较多错误- V/ u( y' v' e- G5 |% f2 \

9 I8 t- [+ F( R% i! I
微信图片_20240729134817.png

* ^- u+ {, y; z! `1 E4 J
6 x6 s! B+ V( J, g
5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:
3 o$ L+ V  g/ U, ]
5 r; u  S3 H' D. l3 u/ i
微信图片_20240729134814.png

8 h3 q3 w' U; ?3 Z/ E6 q  V0 o
0 @+ f4 B: `* y
6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了' x$ B) X$ R2 c

' B& q8 P7 w& J* X  |) ?: H
微信图片_20240729134811.png
8 X3 [! m7 k8 j8 w% A1 p/ L( L

: _- k$ E3 }8 F7 b; A( J: X: f7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽
' h1 w2 [3 T% \8 N
0 Z5 h9 |$ E, a9 G1 M' l
微信图片_20240729134808.png

. X# \% G; p5 s

( F+ t  W8 b" A8、这时我们重新编译,错误消除。. t* M! s- J( {

: V) t' O' g0 y/ G, u我们在main.c文件里编写需要测试的代码,如下:% w9 O/ B2 P; ^
& O1 s7 a1 c; q% i  j
微信图片_20240729134805.png
* s6 s# J$ p0 r( z
# F$ b( K( v/ _( z" \- Y
9 u1 G, }, V/ f9 s* s0 l: h! U
  Z" M- f( ?9 H/ m# B: c6 C/ s; M
9、下载并运行程序:# ]7 K* I' d# q$ f- \4 {
3 S$ n; J' v# T# y5 ~3 H: A' \
微信图片_20240729134801.png
3 C4 R- M/ p) I' T1 {$ A

. c$ W' K; w* U/ G" b3 g! x10、可以看到串口输出的错误信息,我们根据提示运行命令:
$ ^- Q& z9 N9 Raddr2line -e USART_TEST.axf -a -f 0800157e 080015ce
0 Z+ y6 P' x2 f+ \8 U) A
2 U8 U+ w7 b) {运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,2 G" K4 s* I6 u5 I

) [" @6 A% F* C- K3 N+ K
微信图片_20240729134758.png
2 x$ v( o1 j* N6 ?8 k
( E7 w0 w# |  L5 R7 M; i
11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:2 P  o" ?1 O! d! q1 ]* q! t
' o8 n+ g" D/ ~% z4 h0 |+ ]
微信图片_20240729134755.png
( a8 o$ ?$ s# L# J

" a/ y: }& t( J% M% f12、在该文件夹中,我们按下shift键同时点击鼠标右键, n- _; c9 t+ p8 P
* c8 K# U7 I* A; V
微信图片_20240729134752.png
" r! ]+ P0 D# y# f

1 I5 F; M  f7 Y% X" I7 g; p13、在powershell中,输入 start cmd并回车运行
% p& ^2 r2 V2 T9 j2 C" ~8 m7 n) ~: d' A; T& u* L- J% i9 Q4 C
微信图片_20240729134749.png
8 i& h; Y, E7 h& N$ z
5 L  \' Z% Y, ?& o) X/ R8 d
# F8 f5 F9 `. B- R2 ~
14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行' `6 }) |9 c) ]; V6 V2 o! w" h

; I' L1 \2 C9 ~
微信图片_20240729134746.png

0 {" @. y" ]7 Q8 t' h- g0 s
9 E4 }2 _( n2 _+ p
15、可以看到addr2line.exe工具给我们定位出的错误代码行数
: P- F$ {% r% V# s' @7 ^* q* ]6 b* _5 W# w% x, g  l
微信图片_20240729134743.png

( n9 X+ T2 H' H# y$ H( X  X

; a3 A! j7 G' h& @: `- t5 i使用CmBacktrace库能帮助我们有效快速地定位HardFault错误
# k& A$ G/ l, e) C" a1 w* @
" i( Z/ l0 H0 G2 k- Y( g& b" w
转载自:创客技术日记8 W+ J# H; [4 l& b+ H! m+ O
如有侵权请联系删除; x% O# g9 @, v* M2 x
, I' E) B! A1 u& n; I0 a3 ]9 `
收藏 评论0 发布时间:2024-7-29 13:50

举报

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