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

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

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult
0 q# ~; |) A" _7 p# T) n9 y, r, S
常见的导致单片机进入hardfult有以下原因:
/ ^: ^6 C; e: r  \1 h+ g5 V堆栈溢出、数组越界、野指针、非对齐访问
+ n3 ~6 c+ x  e& {+ F
$ k9 H5 {6 W% X4 ~- p% z3 k0 t

4 j' C$ b! x$ m2 o% D' j8 Z接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题# Y% b7 r2 p( B; V& C: H

2 w) L/ v# ]2 m; U. i( V% n) |3 q定位错误
& F1 N/ |4 u  B! e# K7 L方法一  Show Caller Code; P8 C3 U0 x* j7 P* H
在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。
  Q) E+ e- k- `: n" f0 N" ^

1 Z% v4 `' _* V& G" [3 E$ h0 x6 J
微信图片_20240729134833.png

( |( l, I! t- P& ^0 x
6 D4 U& V/ E& H2 j6 U- N+ @方法二  开源库CmBacktrace# U9 A6 ^+ n$ o, ?* L# e
CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
/ Z0 `1 Z7 O( o0 [6 b' _. g3 Q* E# }( n+ g
支持的错误包括:4 d5 a/ S/ q: C
断言(assert)/ z* H8 f, p$ q7 I  p& T
故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)
$ {/ T: S! x1 n2 t4 @故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。& w# B/ t+ n2 E/ H7 e; k0 D

, d1 X! F, X0 r. _% m) \4 h# V9 I输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈
9 |2 X5 w6 Y2 v; I$ K* O) I: O! ?+ h. a0 o, ^" s, C7 x% U9 w, ^5 n6 e
适配Cortex-M0/M3/M4/M7 MCU7 b& Q5 A, @, Z% q
; k4 W2 q$ V' z8 e: O6 I
支持IAR、KEIL、GCC编译器" s7 T6 x# a1 U7 [/ d
+ K/ l( c: l  l( ^5 ^
下面我们以实例过程移植及使用(Keil)" L: @4 Y; j2 x: X) B
1、下载源码,解压,如下图
* T+ R# e: u/ V9 C% b7 ]
/ Z; a/ Q5 y; i
微信图片_20240729134829.png
% o. f2 J% ~4 A( |2 O' @; c
* N: s) Z5 ]" D  ^2 t, p
其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。& V" l. z5 ?2 X0 T; y

7 o+ S/ w0 V: ?# V8 p' @, Q2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件
8 M( I4 O( y! O+ E. |: w" m
5 e( C8 W* L5 b: X
微信图片_20240729134826.png

( }: o3 y9 r/ @9 R! S' o
# M0 g) N) H4 W2 w/ ^
3、添加到工程中,添加头文件、勾选C99模式: b) {7 i. l6 J1 _$ N8 N

& o/ F# o* Q2 K4 I; i1 F
微信图片_20240729134823.png

8 s" w# X+ S! J" m* ~& T9 S, Z; A: ~6 m4 Y
微信图片_20240729134820.png
' x$ m% |, c5 }' c

9 H9 C& z9 q. i" J4、这时我们可以编译一下工程,编译后提示比较多错误2 T: [$ {3 ]; _1 z" P) l; H
3 O0 C: p. N/ ?$ t4 s
微信图片_20240729134817.png

! Q* F* g) q; t, ?! Z7 b
  }) ?6 [8 v! U
5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:6 I* m5 b3 q4 S2 Y
$ b& S" G6 s6 X  N/ U9 P
微信图片_20240729134814.png
3 l0 w, }& D4 @- D2 b

0 W# `/ x4 l9 p# Z: ?  C2 o) @6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了
6 D+ X" t5 S; f8 k+ w0 E. B! ~+ E
$ M  Q, L7 \, F5 {7 N# K: V
微信图片_20240729134811.png

9 I- {" q8 \3 A2 w3 j& Q0 ]; m: _: A% D) ^+ F5 V
7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽
& ?# J0 N  C1 k: g- ]! `$ G5 ^5 w  R
微信图片_20240729134808.png
. ]) w' W" R1 R2 L, Y) d
4 K% R$ U8 |# v" u; A; X
8、这时我们重新编译,错误消除。
5 |7 V. G0 W4 z9 W- B
" j8 q6 a0 O1 e2 ^我们在main.c文件里编写需要测试的代码,如下:$ p' O8 R+ N7 U; }

0 x  k* I: N$ b7 v7 s& L! z
微信图片_20240729134805.png

7 j% v7 e* d! M1 u$ L$ r4 j% ~$ N9 H; B6 k/ c
/ @! f4 y( q" V9 f7 t3 r

/ y4 h, x' |0 T5 {' R9、下载并运行程序:
0 a: Q: @3 _  }% \/ z. q* L  A5 T! U6 p3 R2 m. [( b8 c/ x
微信图片_20240729134801.png

" H( m5 r0 }+ W8 d  L! j
  x$ ^- ?5 P$ A% \
10、可以看到串口输出的错误信息,我们根据提示运行命令:
9 K3 p) S, S+ _* P7 A! ]addr2line -e USART_TEST.axf -a -f 0800157e 080015ce6 `* m+ C5 y' y" H
$ I1 g% S; n* o% K. D' r* n+ R
运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,/ ^7 ~3 B0 N0 Q
8 j& N. F. ], c" U5 q) t1 f
微信图片_20240729134758.png

# g9 j- F/ m) ~5 x+ `( M( |# F: U$ A  m) k5 i  b) K
11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:
; e6 d# ^6 Z; z) D  j( ~

" `) e3 G9 Y, v! V
微信图片_20240729134755.png

: F5 w  ]# T4 S: r3 ]/ u/ ~9 K
) d/ P& I! ?* j4 L12、在该文件夹中,我们按下shift键同时点击鼠标右键
3 A$ F, f; A& o9 S$ s
9 O9 d* E1 N7 J
微信图片_20240729134752.png
- D1 k" N, R  N2 H" C! C# C/ J
! ^' R/ _) M' {7 M1 p
13、在powershell中,输入 start cmd并回车运行
) b  b  l- `5 I/ ^1 B9 Z& u& {% `/ k  r
微信图片_20240729134749.png 8 X) w% e4 I* G" R  M

/ z0 E* {2 _6 `4 |& D' s3 I

6 z4 A6 V$ c6 m& z! Z% q14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行$ y9 a0 W# x0 ~" T

: K, G  Z& F0 L# L
微信图片_20240729134746.png
! L  u4 v" |# O* v% u6 Q# ]( L

1 c, n, ?3 w6 y15、可以看到addr2line.exe工具给我们定位出的错误代码行数
4 e+ ?- H1 y( q! `6 F
6 }' g0 P* G: S+ u: p. @
微信图片_20240729134743.png

: O- K2 Z7 d6 O$ x. n
、2 X! S, t6 t. }0 p
使用CmBacktrace库能帮助我们有效快速地定位HardFault错误0 x/ P/ \; j' `8 c* j

8 K* k* t9 C8 c" Y! x
转载自:创客技术日记% Y( f- D8 f- ^4 K  {
如有侵权请联系删除. f  i0 {; V$ |% f; b

# F- l" P7 W5 n  [8 t
赞 收藏 评论0 发布时间:2024-7-29 13:50

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版