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

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

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult
+ \. P% c" p0 ~# T# {& p0 n1 M) [$ |$ S- @  o
常见的导致单片机进入hardfult有以下原因:
+ Y9 a. ]5 K. U, c) u+ T堆栈溢出、数组越界、野指针、非对齐访问. P. G: g$ Z! k- p  Y+ B9 D7 F% Y
% i& D- Z1 y  H- ?  d

- h1 D* f4 Y8 }+ J; }" r/ D7 N接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题
! _) ]$ |8 M5 e( [& h6 U6 ]
- w( O+ `/ v: A, F定位错误
6 v% [7 V5 t/ d5 ?: ^" Y方法一  Show Caller Code
0 \7 e4 B  y$ _- I. M3 Y; _在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。
+ F, Q( \, b  E; ?, N. n9 p

$ V6 O" b2 ?  Y+ z% G
微信图片_20240729134833.png
2 L* B% e) X- M6 H1 ~6 d3 k" y) M

+ Z1 m5 N% e, j! Y! Q5 U方法二  开源库CmBacktrace
4 o; A8 R+ B( n7 q& c* ICmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
" K. u+ M5 v: L+ w: N0 ^
5 x& {& ^& u6 J$ c支持的错误包括:
8 Y7 _% V1 K, D' G* {. u+ e断言(assert)* o/ _9 Z: Y8 l
故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)  n8 L: v1 }; |
故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。
1 \/ p. V9 F/ S$ x$ Q- N( Z
: I/ {: I& F. F7 o输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈5 @5 B2 a7 g5 k/ h. @0 y( V

! Z! Q" W2 N4 O适配Cortex-M0/M3/M4/M7 MCU
: d0 l# o+ F7 o
( z* A% u5 I' ~( k% ]  `支持IAR、KEIL、GCC编译器
& r& A3 I% L% z, w# \; A8 T3 S: Z- ^$ e( P. i9 q& p% m
下面我们以实例过程移植及使用(Keil)
& ~" e/ r$ t* u0 |9 a1、下载源码,解压,如下图
; m" M$ G6 b3 J( i; U% f# v& L3 e9 A# d  g* n
微信图片_20240729134829.png

4 S3 N& k# y" X

. x) e/ P* }) F其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。$ L2 U2 o. ?) I* Z1 `5 l

' M$ ?+ Q0 o+ r9 b% R, ]% {2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件
) F3 P( b- i$ |9 B+ q
& k. B/ [% E1 \% }, O3 ?# Y9 K
微信图片_20240729134826.png
% J  j0 {3 P3 i
6 I, R9 o+ K0 o7 \- l# ]2 i
3、添加到工程中,添加头文件、勾选C99模式; b. ^1 X: u3 n) y! M
2 ?6 F* ^3 |) h1 g" C+ }
微信图片_20240729134823.png

/ X( f, Y. [( G4 s# J# a& _& \# t/ e9 b
微信图片_20240729134820.png
) ]8 v4 Q3 w$ Z
0 ~& U+ i9 c6 k
4、这时我们可以编译一下工程,编译后提示比较多错误
  C- L' m. Q( g2 i7 K8 Z& S+ o  i1 ~4 l" D5 E: L
微信图片_20240729134817.png
4 ?1 I9 d, B: o/ L4 y

( U) ^( y7 `  x5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:4 q$ t) ]( B7 Q

2 H# e( }3 z& \. `: S6 Q7 O
微信图片_20240729134814.png
* ^  @* S0 z2 l. P% o% G
: Q1 `( Z2 b6 v( G  o
6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了& |! N0 C2 y$ C, }2 v2 u4 @

* H6 \2 D' s: E; i4 G
微信图片_20240729134811.png
/ k. X  D. u2 b. j. h% i& ~6 o# K5 Q' J

- R9 V5 d+ \2 W. u5 r7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽3 G- w, d+ X7 B* Q

/ l8 t; I6 K# s7 l" p, W, j
微信图片_20240729134808.png
  o, E  z8 k- ?* E/ d4 t7 M
6 u, n% ~4 \% w# N; X+ ?- c
8、这时我们重新编译,错误消除。  Z% x: C' Y* U

- E* O1 ?, m* o' b我们在main.c文件里编写需要测试的代码,如下:
9 y, _3 v, [+ e& C' q

3 P) N7 D# u  v9 u6 b
微信图片_20240729134805.png

1 Q& Q. A) A, D' @' `( Z* l3 I( e6 {3 f" b4 m

7 S5 O" ~9 v. n8 _! X
% O1 a' p2 l8 `9 k8 C$ P+ r( ^$ y" ^
9、下载并运行程序:
- y9 t, _! i4 `5 m! t+ s- K
: s5 W; k  C- A! M0 Y4 A7 ]
微信图片_20240729134801.png
+ l8 k# k( e+ d6 r; k1 C
2 `' P8 V. H" e+ _7 e, T4 S9 j0 v
10、可以看到串口输出的错误信息,我们根据提示运行命令:7 l: L8 O5 w' j. `. n5 D  T! Y  ~, p
addr2line -e USART_TEST.axf -a -f 0800157e 080015ce, }0 h0 P( e# k8 I) c

+ v, F* J" M( u6 m9 H' I3 m运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,. r: [* `  `, L% q, p

9 S$ n  z$ R) L# Q
微信图片_20240729134758.png

3 M9 `+ o3 {* h, T4 b8 s' c5 Y' N( C3 I+ p8 V: ?) p$ \" v
11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:( H2 I+ h, C( \2 U( k$ P5 j3 Z- o

% J1 W) T+ D# Q2 b6 h# I
微信图片_20240729134755.png

9 P& j/ e0 j! T5 U/ u: u) ~1 L& @/ ?" r9 j- [, A
12、在该文件夹中,我们按下shift键同时点击鼠标右键
, _) T; A* X1 `1 N4 w' w5 X& T: d- J* m9 I2 e4 {( m
微信图片_20240729134752.png
4 c( b+ y* ~1 E: [- H, e
' p, Z7 d4 _6 n: O$ v! O
13、在powershell中,输入 start cmd并回车运行( G8 L7 a7 ^( q4 c
" a# T5 y: J; f) u
微信图片_20240729134749.png
7 G0 o' e: R% g
( i! `0 R5 J- L+ q3 G  S) r" I
& B$ z# t6 K+ \1 K# _: O7 u
14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行$ Z) b( R1 a- E2 T- ]; [

+ c& O. [; T6 T# l7 x) M6 w
微信图片_20240729134746.png

+ V/ v0 Z9 y, B/ t8 z* c; w
4 L# p( z: \, j8 b1 F- r1 n! [
15、可以看到addr2line.exe工具给我们定位出的错误代码行数
* t' k0 _" j; j5 N
9 p7 {$ A: z. A5 d8 p5 U0 h
微信图片_20240729134743.png

; v( a% Z, z; K' h9 k. J

9 Q# z: @7 R( G, m) B* C! l使用CmBacktrace库能帮助我们有效快速地定位HardFault错误6 `1 ]4 A1 e9 m

/ b& u+ N4 `! @9 r
转载自:创客技术日记
3 W6 B8 S1 ?* i如有侵权请联系删除# ~9 |: U: z9 u$ c) `

% Z5 h, t3 d+ b" d2 M9 ^! p0 P
收藏 评论0 发布时间:2024-7-29 13:50

举报

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