
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult8 U: H! y" J8 ] 8 L( J& w' H4 \; k- S 常见的导致单片机进入hardfult有以下原因:6 Z7 m% K0 ^/ e( [/ Z' ~ 堆栈溢出、数组越界、野指针、非对齐访问: }5 X: `/ j* @$ G 接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题 定位错误9 \' m6 l6 F2 h" @3 q4 S$ n 方法一 Show Caller Code 在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。/ b& `& q3 C. Z7 H% X/ X+ o ![]() 方法二 开源库CmBacktrace3 F9 ~4 X* K: _1 M: N& r ] CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:! \& z7 v r# Y6 |* g& Q ' V7 H1 O, o {( s/ s; t2 v5 [ 支持的错误包括: 断言(assert) 故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault) 故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。 9 ~* |3 [/ T" `% l- C7 R6 K 输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈 * K7 v9 L) z0 _( e' d* A 适配Cortex-M0/M3/M4/M7 MCU 支持IAR、KEIL、GCC编译器) I& u6 }1 O5 ]( x9 U6 b 下面我们以实例过程移植及使用(Keil)1 t; m" P8 u9 d5 B% R 1、下载源码,解压,如下图5 V1 g5 C" W& n0 J+ k% M 6 s7 S+ o4 E# i ![]() / T/ W4 ]8 X- O+ C3 U+ A1 e* E- i 其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。 ! D3 Q8 Q! f6 y: F6 L 2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件4 w# S# {7 @4 S) i! X + _! e8 ^5 N) h+ A0 J ![]() 3、添加到工程中,添加头文件、勾选C99模式 + e; P3 Q+ ]6 N' H+ B; K ![]() ![]() 6 u6 e8 ]( L O/ q1 w 4、这时我们可以编译一下工程,编译后提示比较多错误 ![]() O- a8 q) E* k0 H. D 5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:, q8 l# S$ A# j . W/ N: O7 o% ]* S4 L( g+ N4 x ![]() 6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了! p4 T. b$ f' i$ s! y' x; S 3 u0 M7 q1 }2 H7 U) d* |+ ~. q ![]() 4 w6 M0 ?, n2 S# D 7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽6 ^( ^! ]2 }3 _- o ![]() 8、这时我们重新编译,错误消除。 2 O1 E7 A1 ~& L' T3 g 我们在main.c文件里编写需要测试的代码,如下: , y. F# i8 r7 h0 s/ ~$ H ![]() - Y3 h6 D, \2 Z1 L) C; x. h % _# S" e: H" E- `* ] 9、下载并运行程序: 8 o& r- H$ x: \ ![]() 7 D* w. e$ n5 D9 ?, u7 } 10、可以看到串口输出的错误信息,我们根据提示运行命令: g0 I0 z! [8 R7 _ addr2line -e USART_TEST.axf -a -f 0800157e 080015ce % J$ b9 a/ @( f( K 运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内, ' r1 w0 r# {7 m+ M* W* }: I5 N& p) O ![]() . G3 U7 `( u: h 11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中: ![]() ; w; X) r4 T- \! D 12、在该文件夹中,我们按下shift键同时点击鼠标右键! ~3 T5 }+ J' W- n ![]() 13、在powershell中,输入 start cmd并回车运行 ![]() 14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行 ; Y7 J' U5 t4 _0 j3 w* Y ![]() , D3 D. Y& R+ z* |0 P 15、可以看到addr2line.exe工具给我们定位出的错误代码行数 . E; c( e* a/ C! q1 Y6 { ![]() 、+ S; e" R% N" O/ d" v6 j. T 使用CmBacktrace库能帮助我们有效快速地定位HardFault错误 转载自:创客技术日记 如有侵权请联系删除 |
Keil下的STM32N6之RAM运行工程配置说明
【STM32MP257-DK】01开发板开箱、ST MPU 生态资源使用、环境搭建以及镜像更新
兔哥的初代M33【002】-H503Nucleo 内部flash操作
兔哥的杂谈【002】——如何性价比更高地去编译STM32
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
FreeRTOS学习笔记2
【NUCLEO-H533RE评测】+05 调试PWM
基于STM32在线升级OTA经验分享
【NUCLEO-C0评测】硬件OLED显示
【STM32C0测评】外部中断控制小灯