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

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

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult8 U: H! y" J8 ]
8 L( J& w' H4 \; k- S
常见的导致单片机进入hardfult有以下原因:6 Z7 m% K0 ^/ e( [/ Z' ~
堆栈溢出、数组越界、野指针、非对齐访问: }5 X: `/ j* @$ G

, ]2 v$ c- V% B+ c

* ~+ O& C, ?2 |# p接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题
" e# H* Q8 Q' Y
3 o6 v2 m3 g% }/ q' T定位错误9 \' m6 l6 F2 h" @3 q4 S$ n
方法一  Show Caller Code
$ {  U. `' d) r* h+ |& o  D8 i! [- q在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。/ b& `& q3 C. Z7 H% X/ X+ o

5 E" s! y  C* W: o
微信图片_20240729134833.png

7 [, p5 N. d* y5 c
2 L( A$ `/ Y; ~3 ]7 n/ l方法二  开源库CmBacktrace3 F9 ~4 X* K: _1 M: N& r  ]
CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:! \& z7 v  r# Y6 |* g& Q
' V7 H1 O, o  {( s/ s; t2 v5 [
支持的错误包括:
4 h2 A6 y" R8 P8 w断言(assert)
* u+ |6 U$ W1 T, l* S! p故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)
! R1 z4 _: S) @/ @故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。
3 y9 j$ Q' O) f$ W! }9 ~* |3 [/ T" `% l- C7 R6 K
输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈
7 Q4 x4 _' ]* Z* K7 v9 L) z0 _( e' d* A
适配Cortex-M0/M3/M4/M7 MCU
9 Y' o% N( V: W
) O" M5 N# l- J6 T3 U1 r支持IAR、KEIL、GCC编译器) I& u6 }1 O5 ]( x9 U6 b

( W# K9 w' N- o7 I3 a+ j; m下面我们以实例过程移植及使用(Keil)1 t; m" P8 u9 d5 B% R
1、下载源码,解压,如下图5 V1 g5 C" W& n0 J+ k% M
6 s7 S+ o4 E# i
微信图片_20240729134829.png

$ x9 _3 [+ W  g( A1 u" ^
/ T/ W4 ]8 X- O+ C3 U+ A1 e* E- i
其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。
( l' F# q) l, @8 O% V! D3 Q8 Q! f6 y: F6 L
2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件4 w# S# {7 @4 S) i! X
+ _! e8 ^5 N) h+ A0 J
微信图片_20240729134826.png

6 r' t4 a: t  H8 `  E# v

% `! U6 Z+ l. ~3、添加到工程中,添加头文件、勾选C99模式
0 Z3 Y; X/ y; Y1 m# `+ e; P3 Q+ ]6 N' H+ B; K
微信图片_20240729134823.png
! \5 Z& C+ L# v( f0 ?8 i

* O; ]! `5 {5 e8 e: I
微信图片_20240729134820.png
+ K5 u0 j5 W; f
6 u6 e8 ]( L  O/ q1 w
4、这时我们可以编译一下工程,编译后提示比较多错误
8 l( C1 p: x3 C5 ^3 X
: M( t3 ^, k8 H) X7 F/ p4 T/ C
微信图片_20240729134817.png
6 g7 t  [4 A& d- ^, z2 C
  O- a8 q) E* k0 H. D
5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:, q8 l# S$ A# j
. W/ N: O7 o% ]* S4 L( g+ N4 x
微信图片_20240729134814.png

/ J" m8 v" t& _4 Z

- l- D. D( W! _5 M% `6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了! p4 T. b$ f' i$ s! y' x; S
3 u0 M7 q1 }2 H7 U) d* |+ ~. q
微信图片_20240729134811.png
& d& M4 _5 W6 Z
4 w6 M0 ?, n2 S# D
7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽6 ^( ^! ]2 }3 _- o

: i2 q# m! q1 i: {  c8 o
微信图片_20240729134808.png

+ b4 [8 Q% {9 P, B

( @" b& d4 O8 N/ T8、这时我们重新编译,错误消除。
% W* u2 ^2 a8 }. z2 O1 E7 A1 ~& L' T3 g
我们在main.c文件里编写需要测试的代码,如下:
, g  v# f) }0 C2 g! m8 t, k% G$ o1 U
, y. F# i8 r7 h0 s/ ~$ H
微信图片_20240729134805.png

3 Z" K+ i: v+ Y( Q4 E
1 t8 v& O/ r6 O5 R+ g" g- Y3 h6 D, \2 Z1 L) C; x. h
% _# S" e: H" E- `* ]
9、下载并运行程序:
: \+ H8 d3 S3 z0 Z; l8 t8 o& r- H$ x: \
微信图片_20240729134801.png

9 Z# S  G4 `' J9 K  i0 q( X3 c
7 D* w. e$ n5 D9 ?, u7 }
10、可以看到串口输出的错误信息,我们根据提示运行命令:  g0 I0 z! [8 R7 _
addr2line -e USART_TEST.axf -a -f 0800157e 080015ce
- D; o5 C& @/ Z, _, a% J$ b9 a/ @( f( K
运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,
3 C" M, j4 X  E' r1 w0 r# {7 m+ M* W* }: I5 N& p) O
微信图片_20240729134758.png

% g, D) s6 u/ n3 a7 N. G3 U7 `( u: h
11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:
, e1 x: f7 k4 Z% `  H* Y

0 T& t1 }! s2 K" L# q
微信图片_20240729134755.png
' [; c1 F* k! A/ E; \. G
; w; X) r4 T- \! D
12、在该文件夹中,我们按下shift键同时点击鼠标右键! ~3 T5 }+ J' W- n

/ y) P6 O) L& h- [
微信图片_20240729134752.png

# {. C" J* c4 l5 l' P( j

# M$ T2 H, V' G* T. ?13、在powershell中,输入 start cmd并回车运行
6 Z9 v. q( i$ |  @& }/ \
( {; T# y9 t1 P! ~
微信图片_20240729134749.png
. J& l0 e9 d% w$ ~
4 J3 z; I2 X. h# S* _4 s2 h+ m

0 n" U) W5 d/ [; W% b. X' }9 D14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行
1 m$ D8 w4 V/ |; Y7 J' U5 t4 _0 j3 w* Y
微信图片_20240729134746.png
' G  c: u6 ~+ t4 ?" }
, D3 D. Y& R+ z* |0 P
15、可以看到addr2line.exe工具给我们定位出的错误代码行数
# P7 A) U$ `9 x$ E% N. E; c( e* a/ C! q1 Y6 {
微信图片_20240729134743.png
% J7 v% @; y8 |( ]& O
+ S; e" R% N" O/ d" v6 j. T
使用CmBacktrace库能帮助我们有效快速地定位HardFault错误
1 Q& r4 V5 Q( T
2 W  v. i$ L, a7 ^! d
转载自:创客技术日记
0 q0 @# _5 `: N! H4 T如有侵权请联系删除
+ D( D0 {6 e4 H) m$ I) B8 C7 u" b
/ [# d2 R# ~  _6 U. n+ q
收藏 评论0 发布时间:2024-7-29 13:50

举报

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