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

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

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult% G7 F% A4 d1 h* H- x

) I8 N$ p! @1 C9 V常见的导致单片机进入hardfult有以下原因:) ^: K) ]( v' t4 r, R0 m
堆栈溢出、数组越界、野指针、非对齐访问
. L' ]4 M% ]1 S1 w8 ~8 v
% [6 K2 k  d% B

9 O7 p2 ?7 M/ f+ R0 y. [# S1 D接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题
1 e. h, F% x* d0 R7 a/ D- B1 Q; ]: g% b
定位错误
  z0 V! f6 O; }: Y6 |: e# R方法一  Show Caller Code3 P2 `3 G; F5 l: ]$ r& r
在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。
" D; W# y" W4 v# q8 }
0 l5 C( a( F: ~0 m
微信图片_20240729134833.png
9 Y, f7 ?; y2 i( ~+ H+ X; J8 f( A
' g' q: k- K3 [# N% y5 h
方法二  开源库CmBacktrace
" b( s8 j6 O" z; L+ J# oCmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
5 }+ |: ?  j9 a" K3 C4 N) w" R
' [! i$ H* n8 t# h9 g& U7 t0 A- D支持的错误包括:
6 F' G3 k& J0 r  r( O断言(assert)
! i. m  [- I* V% |& i1 j- \故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)
- R* ]# L  v1 P' i" j4 Q9 q. w0 P7 d故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。
- n% p9 P5 A. q3 r; l1 H2 D$ o8 S
, w! ?5 r5 k* o: T) u输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈4 E* {4 u$ h$ A9 a. j1 k$ ^

  B* K! P# t; B6 o  L" Q6 ~7 ~7 e适配Cortex-M0/M3/M4/M7 MCU0 h4 p! k8 w( S, ?2 x

  }, D. ]& w1 y: J1 |支持IAR、KEIL、GCC编译器
; {5 |6 I! ^  l! A; L9 h( ~/ m3 A1 i- H1 p$ T6 Z6 _
下面我们以实例过程移植及使用(Keil)
, |+ |- B0 X; Z: [, Y1、下载源码,解压,如下图" C) w( q8 j3 R/ q% R
+ n* H; o5 T- M+ r# h# f! v# @& F1 g
微信图片_20240729134829.png
2 E  K/ X+ r* p- h2 V5 `" L
8 Y- A; Y! H$ c2 a! ?2 ?+ Y
其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。' i5 {9 e9 ]# |
, M& E$ C/ Y5 V! L. z
2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件
( ^" `2 d3 [' L# m+ N% h
# b3 |6 e+ q5 e# c3 y; N# J
微信图片_20240729134826.png

7 |* }8 R# v# X6 z$ `

9 ~6 x. s4 I7 A' L0 G3、添加到工程中,添加头文件、勾选C99模式
/ D! R3 U9 ]' [3 }5 }5 s* ^! o+ C" T; G* M4 \2 \8 {1 _
微信图片_20240729134823.png

; |# }% ^  P4 v6 }& u" S/ Q+ x0 S9 w: S8 l
微信图片_20240729134820.png

: i6 Q; Y9 [& o; L5 V
9 \; j, ?' Z% n
4、这时我们可以编译一下工程,编译后提示比较多错误' c5 Z: s9 z( \: D% t

2 H& _% i4 @& B
微信图片_20240729134817.png

$ ^0 V$ c" e* e# u( [3 {* O- T
6 y& R2 h( {7 d2 w( {2 e8 e$ U
5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:
* J8 K# N- z+ c) k2 C/ ]$ y. k' z
微信图片_20240729134814.png

, |9 B* {7 g, @+ s8 J6 f5 x4 A: f
% B, E5 n+ E, G6 p9 L  V1 N
6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了4 o$ q! n. X% m' X

: A/ C5 L2 f" Z) H* u  \9 K" T
微信图片_20240729134811.png

' y: \$ \  ~5 d. F8 O4 ^
6 Q# ~: c' A' t3 m, o. c7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽
5 {7 a6 b+ f( q" C* b! d, ]
: V, e) m/ g6 h, e6 s4 a
微信图片_20240729134808.png
: y% o4 y/ v" x& y

8 ?1 i8 |. z2 K" g8、这时我们重新编译,错误消除。
5 x# C( s- x1 y# T5 I: R4 m0 y2 w; E# O  J! j3 {' s
我们在main.c文件里编写需要测试的代码,如下:2 e( P) e  c7 {( A- E7 I$ Y

9 t5 {2 o4 M- E5 p9 E5 u: B
微信图片_20240729134805.png
; T% D9 g1 O, z1 x' ~

- Y  Y, P; [! \* c$ O" e/ S1 B5 r- q) r5 M3 H- ^& h7 r

: S+ b: ?2 L$ b8 I% t9 T9、下载并运行程序:% k. w" X& k& _
( z& ~! ]) v7 s4 r* Y
微信图片_20240729134801.png
0 I, P1 d. E' S8 S$ T2 I. |; ~
& i8 \% e- f# x4 Z( a9 _$ n2 M
10、可以看到串口输出的错误信息,我们根据提示运行命令:
* {0 m. ?6 @0 r* V7 f1 O- |addr2line -e USART_TEST.axf -a -f 0800157e 080015ce# m( ?4 Y5 C5 p- ~/ ~2 D

/ n" @1 m! q  ?: r! T; _运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,
' a  h) v. \: B9 e) C
/ N8 T* L9 ~( R/ y5 u) e8 P2 |
微信图片_20240729134758.png
" y1 \* ~7 I& L4 e" k3 p

; x7 D  h# U0 G: w! N! X2 A  p11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:
6 S* o: a. o2 p3 g3 A

3 s$ |+ T6 U: c) m+ F& G
微信图片_20240729134755.png

* x) P. O# |, q) [0 z5 w# K' J; S( g! k: A9 n" E+ ~
12、在该文件夹中,我们按下shift键同时点击鼠标右键; E! X0 Q3 l7 P

0 K  O/ x! U6 N+ n
微信图片_20240729134752.png

4 _4 r% ]3 R  X& O. g0 ]* |' s
' A# y% N, B# p) B2 {( X- ~
13、在powershell中,输入 start cmd并回车运行
" j3 J6 R7 X  Z; A
# u- }. j( ?# h+ Y
微信图片_20240729134749.png
3 o3 v! d0 \, X4 n, I
5 A# @$ }) j% D  [/ ^: T

3 a+ I+ }- R9 \5 s6 J% ?14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行
/ z! E6 F: [" G6 q' \7 l8 U  S4 T. ~( Q" v' ]9 X" ]8 \
微信图片_20240729134746.png
' F, }9 H; A" a- V* J; J0 `% W8 V

4 D4 J* K1 c$ h5 ?15、可以看到addr2line.exe工具给我们定位出的错误代码行数( f6 H- A& R- Y% Z4 r/ ~# k
! q6 h: n  z0 Q2 N1 t; ]0 O
微信图片_20240729134743.png
4 Z7 ]$ Q. h1 q* I: D

0 q  a3 O1 }* \9 t; b/ y, L使用CmBacktrace库能帮助我们有效快速地定位HardFault错误2 Z0 q1 R  P6 o* m; d1 a! A

( d: K( z2 r4 A5 `- l; z) {' q" n
转载自:创客技术日记- i5 R* K6 J9 N% K( [
如有侵权请联系删除9 U! Y- W, m+ x$ C( o' E: R

4 p9 k- B# ~0 I. Y, \- d$ R
收藏 评论0 发布时间:2024-7-29 13:50

举报

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