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

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

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult
! n2 Y; \% _6 `
& l# l7 e, D. D" Q1 p* ]. c0 k常见的导致单片机进入hardfult有以下原因:6 o' `. _( `+ O' ^( G4 B
堆栈溢出、数组越界、野指针、非对齐访问
4 H% e+ h  s5 i5 p" E% U1 D# k( F5 `

. M' b0 ^8 V& w2 B2 q. L接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题8 V7 j! \  Z  K# f
' d5 n; D( n% R# t* w' p
定位错误$ g- A; T' E  I, ^: u
方法一  Show Caller Code) y% d# ?8 f7 K
在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。( H, T7 A) W1 n* Y6 F

# ?% r6 B+ O9 g0 S" O! C
微信图片_20240729134833.png
1 e" E, u; x9 O" c, |
& H2 w8 U+ F; q7 {3 j
方法二  开源库CmBacktrace
* J- s% o6 m$ X9 s3 ZCmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
' A" V7 r1 A: I! |6 J: L1 S) f; \! F; h" _, X
支持的错误包括:
  [" F. k/ [- z2 Q断言(assert)( |7 q! ~) M8 {) C: P
故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)5 J$ N# [5 b! a6 G  l7 w0 }
故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。2 h8 W8 C# y0 G1 c) t
! R9 i1 b7 x3 R# i" ?5 b
输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈; s& Q2 e: x1 n$ b- j" ~8 Z8 l1 V1 [
+ H' U+ ~2 n9 t$ Q3 @% x( l2 [
适配Cortex-M0/M3/M4/M7 MCU- _) y% Y5 s+ S8 U( \

, z8 W0 G7 J8 V- b9 m/ C/ S支持IAR、KEIL、GCC编译器
$ D9 E& `! |& D6 ?. {' Y
- q/ {# M( {4 Z& |6 m/ a下面我们以实例过程移植及使用(Keil)7 m1 c7 \+ z3 t1 P7 p! m0 ^, M. @
1、下载源码,解压,如下图
, W, ^1 l2 `. \0 s( s8 w
, i1 M% ?; x# k8 i3 O: X
微信图片_20240729134829.png

2 c' B3 p' m, H" E7 e' S1 q# d

6 M$ @# S! K7 |$ s. z% ^8 |其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。7 z4 J( U, M5 S; L. h

7 }& D+ }: g: z( Z8 `2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件
4 Z) }& m, P+ R2 T1 @" |7 h$ d# R
, K/ v5 G8 C& u3 D% I9 u
微信图片_20240729134826.png
" f  W* U/ @/ ~% i6 T

9 P/ O2 f. Y8 Q! ~& I- }3 Q3、添加到工程中,添加头文件、勾选C99模式
6 L# z% ?& y( t) o' y( \5 q: v, D+ R/ v% F0 Z9 w* D0 L
微信图片_20240729134823.png
% R9 b/ ]+ Z6 n

0 R; h$ s; P5 B& v" y
微信图片_20240729134820.png
) q. y/ A% t% }% O

; e+ t. O7 R3 j9 O; @4、这时我们可以编译一下工程,编译后提示比较多错误! r" b& ?, J& @% ]
( d0 {3 W- y; D3 ^
微信图片_20240729134817.png

, E5 }6 K4 ~6 M. L; D
0 j. {/ k0 ]3 G$ G3 y5 r; B
5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:
& p: [' p: a, ?6 R% ?. _3 B. X8 A+ j% z- C, b7 D8 T* v
微信图片_20240729134814.png
4 u6 F; _& q  \7 x7 k0 \
, F+ Y* x8 S$ Y" ?7 ?% `
6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了
0 \! t: h% F7 Y$ j( S8 D9 d% ~

0 \  W& c; t! Q; b
微信图片_20240729134811.png

) N  w- y/ S1 J: V  ^# l; [6 m- Y& k0 h# {. ^
7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽8 w! A# p: ?, d* r
1 a! a0 D: F2 o. Y/ e! W
微信图片_20240729134808.png

  B- v" h. e9 }2 N

" U' }; f3 t; c6 ]8、这时我们重新编译,错误消除。
8 x# }" Q2 ^2 |: O) z3 Z. T; p  A: j4 i! l. ]5 ]! e
我们在main.c文件里编写需要测试的代码,如下:
" k1 {6 {( t: a) I' y& e

. t! y8 ]0 H: n$ m( e
微信图片_20240729134805.png

5 Y' d( Y+ p- A1 }+ g/ ?" c# e9 h) q  j1 J- A+ ^: m7 E
3 P0 _% `9 J9 j, o( C7 J3 T
$ {0 m3 [+ r1 h6 Y
9、下载并运行程序:
2 w! J7 W! W8 e3 q- p2 C3 _4 _( @5 Z/ ?
微信图片_20240729134801.png

! `' {9 Y( a6 ~- j2 m5 }7 K

9 p4 J, w) @# l& J10、可以看到串口输出的错误信息,我们根据提示运行命令:. S& E0 H8 A3 c) O6 P
addr2line -e USART_TEST.axf -a -f 0800157e 080015ce1 f& e6 x6 d* e% K! B6 G( B

% K9 k2 F* P' |, i! w; G/ l8 f运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,# R$ G6 t, n* N
9 ^( L$ p& M$ u+ R4 n+ C
微信图片_20240729134758.png
: J& A9 K8 e$ G! k2 I  b* b3 k; ]

! X  Y& N- z. H! e; @* P9 A, H$ J3 F11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:2 B8 M  w- n# |6 k

1 ]5 B" V3 h1 h% A! T& X0 x
微信图片_20240729134755.png
! j$ N! A" @# G

+ B5 Z- b% _/ L) E+ @$ o  u12、在该文件夹中,我们按下shift键同时点击鼠标右键
4 M* E" c" Y/ H) l/ P; B) r9 l# E+ U' U/ `7 Z5 g
微信图片_20240729134752.png

4 K  _! I/ m! {$ f
- P& L, W: f0 E' V' `
13、在powershell中,输入 start cmd并回车运行
% E$ @$ K% H; U  z; x5 E3 o9 h0 E/ `% }* h
微信图片_20240729134749.png % }9 A. t$ V; ~7 d8 i

( v4 K. G1 {! ^- Z  R' ~3 g

, V* q; {, ]0 Z14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行; _! p) n# \/ t
+ D  f( m1 G) g! k  Q7 B8 r
微信图片_20240729134746.png
# Z4 [' z5 ?& z& G( D

9 T3 y; [5 b* r. X15、可以看到addr2line.exe工具给我们定位出的错误代码行数
8 p9 R' R" L+ |; R5 E. P
# p! y2 f* n7 N. S
微信图片_20240729134743.png
/ n5 S* k0 s( e- s* c
( {7 \+ h/ ^0 u+ I/ O3 W7 t( M
使用CmBacktrace库能帮助我们有效快速地定位HardFault错误
# s2 l/ u% v$ [3 _
! E  [4 l: }& l8 \" j* d
转载自:创客技术日记
3 m0 n6 t# H: V0 }如有侵权请联系删除. B2 j; E6 r8 q8 V$ k
- f. l  z8 x4 l. y0 N
收藏 评论0 发布时间:2024-7-29 13:50

举报

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