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

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

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult8 J5 R3 O% B3 s/ |$ K% L

9 l( _; Q, m9 t  i( Y- ^' f3 p常见的导致单片机进入hardfult有以下原因:
* {% {. n7 N# l2 q$ A( E堆栈溢出、数组越界、野指针、非对齐访问( I  n5 d4 Q) l# e8 X9 q8 w: \1 V
5 V# x. \" E9 C$ K+ n

- y! }/ V0 _+ W/ n1 a2 ?接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题9 U' j- s5 G% {1 U
" k8 F( o. }# P: T. W1 |
定位错误
5 y( X/ v- q9 d; ]5 a* V方法一  Show Caller Code: J; l5 s& Z* G/ B% |1 N/ m
在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。
4 J$ k* t2 ^5 D# v
# @) r! h" d% \2 }7 \2 c* ]& U
微信图片_20240729134833.png

+ a4 S) f7 E: ^; k3 d: @! P1 n! X/ f' _
方法二  开源库CmBacktrace4 y4 d; u* e2 Y: z: q
CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:9 ~( v3 F4 D2 T, A5 M  P) G5 b4 D
; t# v* T6 Z$ F  ^/ z7 U2 h7 O
支持的错误包括:
7 k% d1 B& j7 o( p8 [断言(assert)
$ g$ U) w( L1 C* r故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)9 P5 t0 G5 U, n# B% Y
故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。
/ l& U9 l. l# N# C! e5 i9 S/ g, z
输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈8 x/ n1 m7 E: F* C6 ~

) Z# c" Z9 M) a/ z2 S# I9 l# q  V+ P8 S适配Cortex-M0/M3/M4/M7 MCU
& l1 r8 z4 W: x  H. v' P- n
& y3 I& T: S$ H7 U" ]支持IAR、KEIL、GCC编译器
5 J3 ~! Q* k1 H& o  _/ C5 C& s! r+ y7 m6 ]- ~* n# a7 k
下面我们以实例过程移植及使用(Keil)
8 G' H4 |# [% ^. t1、下载源码,解压,如下图1 E" w7 @) O2 }; @% r
& W+ X0 w3 T0 B6 |
微信图片_20240729134829.png
2 Q# G2 P/ v7 U% @+ o( @
, j1 }3 ?' R  F! Q: M8 d
其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。* {4 m2 W' t  E( t( Y7 p& r
3 c0 U1 {* ~9 S. W  y5 z  y
2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件0 S: M$ X; u1 W' h
1 H, q5 ~+ F4 ]  y0 u3 p
微信图片_20240729134826.png
! b* M( L; q/ _0 ~1 T
6 P! Z$ B$ ]! I& b
3、添加到工程中,添加头文件、勾选C99模式1 z3 z# N" D- d6 F  {; J9 }

2 a$ R( b4 X0 @/ H/ _' }0 j
微信图片_20240729134823.png
- G  \  R# Q/ y6 _/ `6 R. F5 P- L4 ]& P0 I

6 u: e/ {) r5 ]( [" K
微信图片_20240729134820.png
+ X3 A+ P) V0 S$ e( G5 H7 D) e
. x4 l  G# R& \( L4 h- V9 t
4、这时我们可以编译一下工程,编译后提示比较多错误* c: [# U3 M/ k  H; @* D

* E, l: H" `# ]6 [% E! H  y2 \% W
微信图片_20240729134817.png
) V; q; @3 n. H: @
& l/ ^0 }2 \. w" s
5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:! z! W; v, p! b0 m

5 h; Q" ]" m" J! ^- `% p2 l
微信图片_20240729134814.png

- c+ R$ l1 G* g+ O% f/ S2 q: \4 l

  Q% S& ]. [6 p  P6 w" w6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了
& @5 Z, I8 D2 G4 E

8 ], q* h- D# Q7 ?
微信图片_20240729134811.png
3 b4 t: j! a% g2 G( o% x4 F& a

( l- u- w& x5 h  r6 [: q: w# a! [7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽
; S; y. c- ]( g! w" q; f
+ S6 o* d: ]1 q' X0 H# d/ ]" A
微信图片_20240729134808.png

# [8 y9 L1 g( {1 Y
  B, C0 l! e5 v+ H- O& ]
8、这时我们重新编译,错误消除。5 ^' r- ~+ _* z& O! [2 v% q

# A- w- v# i5 H我们在main.c文件里编写需要测试的代码,如下:
( m+ s& a" n# L% ^" b
/ }% T! l6 {/ X) @+ g
微信图片_20240729134805.png

1 v" D8 M  _: q) T0 N1 B! Q- y+ P" S" Z; S/ a# e  \. I

6 S* J. v, z- S8 ?4 ^7 y3 X  `0 ~
8 {" O# k' K2 a
9、下载并运行程序:
' _8 ^# r. i9 g# A/ Q0 i8 A" I: E/ o" X! x# o- D, ~) V. o) \* _
微信图片_20240729134801.png

% i$ y& e2 d, o' r9 ^7 i9 w
" B7 M+ X1 `) ~) P) W+ F
10、可以看到串口输出的错误信息,我们根据提示运行命令:9 H9 k" h6 Q4 B+ S2 `* ]
addr2line -e USART_TEST.axf -a -f 0800157e 080015ce
  v* q" _2 a/ d$ S2 K: ]1 ?  ^" p: T" X
运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,
$ l5 s3 \2 w0 Z3 M9 y
! e! ^4 G0 P4 N4 X. P
微信图片_20240729134758.png
$ i3 e; y  t- a$ U" Y: x' Z! s

- T$ P7 n1 l% Y$ ^8 J7 z% z11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:
4 L- ?/ e0 f3 f9 `
6 V3 @; Q6 ~- z
微信图片_20240729134755.png

( X/ F: c  ]) v7 n, W- V9 S3 [! _
% x. G6 Z- ~7 m5 v" n2 {12、在该文件夹中,我们按下shift键同时点击鼠标右键* G  b- `1 m! h9 G

7 |) z8 U# t' m: U- P7 E. K) b
微信图片_20240729134752.png

  W# s+ Q( q* U3 Q( i. Z7 Q, c$ I6 h

( `8 n/ u) A3 F3 I, e7 R13、在powershell中,输入 start cmd并回车运行
% U; j& ~2 ]/ D$ Q" b
. F8 N, D$ o" N8 W0 Z6 n+ E: G
微信图片_20240729134749.png $ z! j* a0 u) ~  x( m! W, j
, A$ i& p! V- F  t$ \0 W9 E7 @
" ]! V: a4 X. Q" y
14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行
" @# N  m7 S; }2 B6 a: i3 l6 `
微信图片_20240729134746.png
9 L4 q* l1 |7 {2 f1 w
1 H6 }' b. D7 L7 g4 L/ K
15、可以看到addr2line.exe工具给我们定位出的错误代码行数
; r, l" e5 D6 d# C. D1 L+ H8 ?" O9 k! {, G7 g
微信图片_20240729134743.png

- L, o' R$ J& T9 ?1 J( @# z) J( s) x7 e
% w8 j( _. }( @. d4 s% T& D* _
使用CmBacktrace库能帮助我们有效快速地定位HardFault错误
5 X6 L0 X' z+ ~1 e5 T, U4 h/ S% P! Q; U
转载自:创客技术日记
$ [! F& E/ h- [如有侵权请联系删除+ @4 p& c- B, P. S2 ?0 c0 \/ @% V
* P" u( r- _2 e' ~% a( x& U- v" m
收藏 评论0 发布时间:2024-7-29 13:50

举报

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