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

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

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult
" w/ ~* {. ~3 ]9 n; |/ x1 k( w" n( b, f( n; ?# O9 W
常见的导致单片机进入hardfult有以下原因:
  q" N" W( O% V堆栈溢出、数组越界、野指针、非对齐访问
: j3 L1 r& l0 g% R7 _
* K& R; r( ?! @2 |

2 q8 D: S2 j' _接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题
! N8 `7 Y% X8 f) }5 J. C# t& v
2 u' y3 F  s) r6 D定位错误
$ {  k" N; \: c- W方法一  Show Caller Code
- ?/ u& c6 q, n* Y; n在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。; R; o4 L0 u4 k# Q+ q) w

. E/ u/ ]6 Z8 \8 k5 @! D' [
微信图片_20240729134833.png
- k  p& g8 i2 O  g* S) w$ ^# _

. N1 v2 G' Z' b, v* Z方法二  开源库CmBacktrace
. q9 R% z9 W: i  C) y  Y# kCmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
' }' s2 l; u$ O9 \1 `( j
) U/ t: ^+ r# U1 y0 A, j; e9 k支持的错误包括:
* w6 s. d+ M3 C, n断言(assert)5 M' M; X3 g& _7 H; V5 a! E
故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)
" o5 d# V& E; V: W( `4 k, n' G% k故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。5 o8 S) F- Z  Z7 {5 S  e4 K! Q
! D8 R2 {( c2 h, R/ [+ [7 F2 P# r
输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈2 ]% H& A( j7 z9 i1 f5 z1 U# G

0 a5 Z) {3 Z5 Z% a4 L' u4 b适配Cortex-M0/M3/M4/M7 MCU
9 `5 H; I1 N9 R. V0 N; P5 h3 ?" U: @  r4 r0 z0 D8 }  Z
支持IAR、KEIL、GCC编译器; P  j+ h+ q6 h  R' r4 [

- u) r* z: v: r& B下面我们以实例过程移植及使用(Keil); Q/ U8 ^& y- X; t
1、下载源码,解压,如下图/ |5 q& z2 F4 t
: P3 E2 F7 z3 N$ |% n/ `
微信图片_20240729134829.png
+ a& _7 `2 d! W5 P. ^4 f# I7 b

' J# K8 h& p- @6 X其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。
- j. U1 f9 \$ f0 D3 W. U4 {
, w, v5 X7 F' O) @2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件
& h) A2 a  T. T6 o! }  p0 q! R2 C5 \! \8 t* r
微信图片_20240729134826.png

9 n5 F0 z0 Z! K' C" {: t+ E

" f4 e6 A  L9 y7 C# `* t; a3、添加到工程中,添加头文件、勾选C99模式1 W# n, y3 i  [1 w% ?+ O
# |6 {+ `3 ]4 k/ p
微信图片_20240729134823.png

. u0 ?' t' @1 @' J/ l) ?! T8 i! S5 D
微信图片_20240729134820.png

! M: G' Y0 v. f2 ]
- q6 ^$ N3 Z1 G+ O4 s' Y; J
4、这时我们可以编译一下工程,编译后提示比较多错误
, c% D" r, K1 C$ p' S# Y! b  B7 R0 K/ S4 M8 T
微信图片_20240729134817.png
( Q. I  T: w4 V1 S$ n) U* c

2 O' B% B" x8 S: I- v$ s5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:4 }* e# z% T* C# K$ K0 @
: X9 _9 J+ p  f# X2 X( I, K. y
微信图片_20240729134814.png

' c  k) I# i- A8 `/ ?. |2 a$ P
$ C" i5 T- u- V
6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了: j& [' S( l9 S7 ~% c- s
+ v5 h# h) a! q- E% g& f
微信图片_20240729134811.png

2 I! }; x0 r: z' z* o. j5 G3 n0 X! x$ D- K8 T: k2 W
7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽
) I' u: ^# U% s& x# j& \* C3 e0 }' q6 w" C5 l& Y3 E/ D
微信图片_20240729134808.png
1 k0 Y: P2 o+ u1 P0 I
* Q* Y- o$ v5 C! k6 Q
8、这时我们重新编译,错误消除。; V* G) v+ u. q$ h  k
. q5 h/ w; D; ~4 n
我们在main.c文件里编写需要测试的代码,如下:7 s6 J( d/ k8 D/ E2 w
4 Q/ i4 C3 C6 {1 d2 C: q
微信图片_20240729134805.png

( \3 x& _& `9 D$ L  _9 Z+ `
# A( r4 z( z: E/ G; N7 z
; e: x/ @- S5 T/ j/ D8 `  C/ ]

, s: ~3 w! g, X7 n9、下载并运行程序:
& l& c4 a" f" X& g
8 b9 V! l4 n5 |/ \/ y6 j  X
微信图片_20240729134801.png

" x: A! d  D- h# V, k6 P4 t  z$ ]
0 [& k1 y: i( ~& o
10、可以看到串口输出的错误信息,我们根据提示运行命令:
# J, \2 H! [2 i; O. Haddr2line -e USART_TEST.axf -a -f 0800157e 080015ce* R! s6 S6 e6 d; F6 F
* B  P: f, t# `2 G& _- h
运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,
5 u4 h) D- E9 P
0 @, A3 S2 }0 @- o: q
微信图片_20240729134758.png
( T6 `  x, A; B; t' n
  @5 [3 I1 V5 ?- n5 W0 d" s+ L7 t
11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:
+ x5 ]2 U1 C* U

' E" D2 m" [$ W# R
微信图片_20240729134755.png
" s  F. U1 @8 H, a- V% l

9 U/ a4 n% q+ B3 _12、在该文件夹中,我们按下shift键同时点击鼠标右键9 l; ?9 g7 c0 M& W: @3 e$ G# }

" z; |1 K6 p; D4 c' b
微信图片_20240729134752.png
; O1 M6 f0 h8 {

* ?# P$ O/ W' H9 u/ t: s" r13、在powershell中,输入 start cmd并回车运行
' ]0 P9 M+ M; P/ ]4 q
& o" U8 c# f$ E) O8 O
微信图片_20240729134749.png
, {6 u+ L. |' t/ B' D. j  O3 g# ]
' O- H- y/ y' J5 G
, J% C. P/ H# b3 A. H
14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行  D" D4 N4 o% a' u; ^" i8 G

& b* |1 z+ h$ S  ]7 Q6 i3 X% d# G
微信图片_20240729134746.png
& U7 y1 i5 |6 j* R
; ]6 j) x9 `* m+ O+ o9 r
15、可以看到addr2line.exe工具给我们定位出的错误代码行数
8 e/ j1 W, N9 w' ^
4 @- v, T, Q  w: K& C
微信图片_20240729134743.png

. c) ?/ e" @! x) a2 R5 I

/ B1 a; @+ N9 U- {; E7 z, R# \使用CmBacktrace库能帮助我们有效快速地定位HardFault错误
" ]4 F  P( p5 |7 T3 s' ~6 n
. m  |2 f8 Y8 w8 [
转载自:创客技术日记
( C8 S# h/ w- O: w% j如有侵权请联系删除
) {: b( J1 F5 b/ B& H" _. n1 s8 Z  u6 f* y! Z" g2 [
收藏 评论0 发布时间:2024-7-29 13:50

举报

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