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

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

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult
' I9 t& Q: u4 @9 t/ v# v6 D* i7 d, f. m; [: u7 ]
常见的导致单片机进入hardfult有以下原因:
' ?' r! r+ |4 v2 x8 c1 K3 X2 @堆栈溢出、数组越界、野指针、非对齐访问% [( M0 y7 M' s5 Z+ i1 G

+ s: }, J7 F( u  O# W1 k

% {" I" q* Q$ [5 i接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题
5 n* T& z! r4 n. r# i. Y, t- ~0 R/ F" T  ]- H
定位错误/ V! a* F2 D' b
方法一  Show Caller Code0 {7 c, {1 R9 X0 ^
在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。9 P" E% q. }3 I8 u2 y3 w! t6 |

0 R* x0 b, h- z3 s
微信图片_20240729134833.png

- q; N* w! P1 h: R) p( X6 A
7 R5 q& w" D0 n9 ]* X! v& y2 P, U方法二  开源库CmBacktrace
5 y. g* B9 R' lCmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
' t; y/ D* j5 V
. g; x. }, W! z; @- L$ F支持的错误包括:
$ J# i! i( K" M9 y' _! C1 z2 g断言(assert)( T1 k2 Z1 f+ T5 L4 J# \
故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)" z. |+ ~3 f! F8 Z
故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。
8 W  U# e+ T7 J) U( H5 p8 n& N8 b
! v; l8 R5 e# U- J, i: I输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈5 V6 b! \. m. Z' i0 Y8 ]7 s: j

+ o+ t# H- p6 H( z- ]# ^7 F, K. v4 `适配Cortex-M0/M3/M4/M7 MCU( H% w7 s2 B+ ^3 D/ f' H

& e7 F5 Z6 c- U支持IAR、KEIL、GCC编译器3 H& I: g9 |, l. {3 Y- ^) D; ~: S8 v
) ^  R4 ]& o  @+ v) \" ~- q
下面我们以实例过程移植及使用(Keil)( i. `# @7 q8 Y' v, K' M
1、下载源码,解压,如下图: b7 {' F8 M. `9 O4 u( H9 K& W) G* p

# p8 n. q4 U/ @  O+ h0 ]
微信图片_20240729134829.png

: w# \) i0 B" |, P
: t( n/ U- }7 W5 K7 Z9 X
其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。
- m/ K/ m4 ?( f: X6 \. z! |4 [: B& Y. ]( A
2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件
% L9 O6 F0 H1 s, T( B4 X2 M0 t0 ^+ X$ ~5 X" c
微信图片_20240729134826.png
0 E, |  w. W( \# M+ M

  ?) y$ @5 g; H& ^" A9 q, P( t8 q1 g3 n3、添加到工程中,添加头文件、勾选C99模式
( s$ z" H4 P7 d* O7 O: M7 J+ z
" Q% a' Q8 e- ~1 Z5 G) o9 `
微信图片_20240729134823.png

. c7 K. p3 K/ ?: W  Y' O2 `* i4 J9 ?0 k" ]1 a# J
微信图片_20240729134820.png

+ g- v! r6 f4 `3 z  }6 O

  G& j1 _/ g0 U* u5 e7 B4、这时我们可以编译一下工程,编译后提示比较多错误
2 z% P/ l5 l0 B
- D( e4 R4 Z4 Q
微信图片_20240729134817.png
9 g: e6 X# u) n* K' f( B1 k4 x

, Q/ a6 |7 r5 o& X3 f- k5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:
" Q2 O: y( P! I8 _
, ?0 X# k- T7 e6 v) ~7 C
微信图片_20240729134814.png

6 X! [8 C  W! |: Z8 a
0 R6 F; O5 {4 y0 H' {6 I+ k
6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了4 V* f6 M2 |" N8 ^

* C- v0 s- l1 _5 p( ]
微信图片_20240729134811.png
" L1 }+ r5 A  Y7 f0 k
; B3 Q  O4 e& S# \# x1 I- |
7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽
: H5 p  @2 q* @
4 X  ?3 z4 l& g
微信图片_20240729134808.png
' o2 j, ]2 P5 b/ R$ p7 T
6 L; _) G8 @8 y
8、这时我们重新编译,错误消除。
. g7 H4 i# Q0 F( k- @4 B* a
  m# {: R( A/ ^# K/ I2 b我们在main.c文件里编写需要测试的代码,如下:
2 y/ z" M8 k* C8 |
  t, B% F  `) u1 p1 r
微信图片_20240729134805.png

* H6 j( {; m2 Y" N
6 D' e: ^- v0 h1 i' @3 L) f, \, N6 a# B+ d! q
( f3 w( }3 S9 S4 f8 F
9、下载并运行程序:8 w; g5 f0 C" E
3 s0 j# X) t8 a
微信图片_20240729134801.png

( X( y7 ^1 j7 q* x0 Z

/ J+ q: G' i; |, O( l6 y1 |7 L2 l! k7 h10、可以看到串口输出的错误信息,我们根据提示运行命令:$ j, P4 ^3 N/ o" G& J5 P3 J
addr2line -e USART_TEST.axf -a -f 0800157e 080015ce- z! I! U( J. f7 g3 y" K" }
. i4 w5 F% I& G
运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,3 g0 V7 L6 B: X( r5 a& ^" O" B

! s# {( G) B3 a$ F  T
微信图片_20240729134758.png
5 R0 A0 U4 C( ?% x
7 }* d3 N& b+ N' [0 z
11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:
% w9 L  X5 y) ?+ x. `
4 D& ~; t6 [/ }
微信图片_20240729134755.png

3 n2 x9 k0 [' O7 A0 D* [+ I$ T* N* D3 F) E) b; n
12、在该文件夹中,我们按下shift键同时点击鼠标右键, ?# ]% Z$ ^4 n& @$ {. _. u
& K1 G) h0 x8 B3 n
微信图片_20240729134752.png
1 v0 N0 Y$ B8 y$ I" \+ f" @: W1 O
8 f) y* U2 p6 c. z, e* K( V
13、在powershell中,输入 start cmd并回车运行
9 R% w3 f* k% w8 f$ M+ M/ l: Z- c  Y9 `2 h2 p
微信图片_20240729134749.png
9 J  b2 z) Y% s3 \# ]1 o* X8 b
2 Y, Q( h5 V5 H; W+ j( l& q
7 e4 o9 [$ \/ K0 t* n" g: \
14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行
1 ?1 q! j8 f" y# Z, k0 A2 C2 h/ `7 f- z! D, Y4 D
微信图片_20240729134746.png
1 {, E( P$ w5 C) a9 e

: M; ?! I/ y& X- x15、可以看到addr2line.exe工具给我们定位出的错误代码行数
2 g; J9 p: R' z4 a4 F7 T
8 f0 z& |; F* _- l7 C* f" _
微信图片_20240729134743.png
8 `$ {' c% t1 ^8 f/ m
、9 @0 ~" J! ]; i. N4 u( `
使用CmBacktrace库能帮助我们有效快速地定位HardFault错误
' |+ G0 D$ D& X7 z3 h- _- C" y) V
转载自:创客技术日记
. R9 E) b6 n' x3 v+ s* [. r& `如有侵权请联系删除
! D" [$ X* p7 l" w/ b9 ^& z/ ?( u' x* {! H
赞 收藏 评论0 发布时间:2024-7-29 13:50

举报

0个回答

所属标签

相似技术帖

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