
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult 常见的导致单片机进入hardfult有以下原因: 堆栈溢出、数组越界、野指针、非对齐访问8 X. K( f, F* [1 K4 S, v: p( Z i* y p S: h2 c 接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题7 K$ O7 O A- l; k8 ^ , O; ~5 L& M+ @0 U7 A) T9 N 定位错误7 u1 @ {! Y* t7 `% H' L 方法一 Show Caller Code 在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。( N6 f: c2 D/ m! i4 y5 z ![]() , ~5 d9 {: T" o }2 f5 W* h/ I6 u$ A 方法二 开源库CmBacktrace* Z* O5 p% k! `4 ]9 S4 N- P) _% f% V CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: 支持的错误包括:# O8 C/ \2 v, O: V+ L# y4 d( L0 X3 U 断言(assert)) t/ a; I/ l, I4 S; A7 ^2 [3 p+ P 故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault); i! @2 Z/ a Z8 I: r1 u 故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。 6 a8 |/ O1 P- p. A" c& h' D9 C7 c5 n 输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈 + H4 t' o8 R1 C) h& c* v 适配Cortex-M0/M3/M4/M7 MCU! \/ t6 [( \* J4 ]4 N% k * { T, f% H4 K5 U! O 支持IAR、KEIL、GCC编译器 下面我们以实例过程移植及使用(Keil)! A7 ~ F9 B$ E1 L' ?' Z* ~& z 1、下载源码,解压,如下图4 i- q9 M/ c C 9 i6 }" H- J0 v) o7 \ ![]() 其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。 2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件; q' u$ O5 Y' P/ Y8 \( k& ?# D$ N, v ![]() 3、添加到工程中,添加头文件、勾选C99模式 ![]() ![]() 4、这时我们可以编译一下工程,编译后提示比较多错误 ![]() ! l! A) E" B4 d" q1 H 5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下: 8 m9 f# l) f* l5 h( w% h0 t& i ![]() 6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了 ; J$ F0 W* O$ P" I. l9 J ![]() 6 n' e+ a+ ~! |2 i9 n* n8 `$ [ 7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽 + f( ~# I$ y' o$ \; F ![]() 5 \ _' w1 h8 }5 G4 M 8、这时我们重新编译,错误消除。 6 X: r5 @* Y4 |% i6 I 我们在main.c文件里编写需要测试的代码,如下: ' C5 }0 T% `) g- C; f ?. `8 L' ] ![]() 9 U5 K4 @+ f" j$ p A: t' h 2 d& {6 Z9 B. W 9、下载并运行程序: ![]() 10、可以看到串口输出的错误信息,我们根据提示运行命令: addr2line -e USART_TEST.axf -a -f 0800157e 080015ce/ ?7 K' }4 f$ W5 K 0 H3 R4 V* j0 w" x- C7 P$ j- A 运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,, e. }3 d O. t ![]() % N2 \' b6 a2 n: Y7 Z 11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:/ e, |/ y- p- ~/ u" ~2 W, w) p : H1 l a/ w" V. n( | ![]() 2 a& _/ V" f7 V) ~0 W: m6 ^6 U 12、在该文件夹中,我们按下shift键同时点击鼠标右键 ![]() 13、在powershell中,输入 start cmd并回车运行 ![]() 14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行 , T/ s# A O/ W' w& ^. I ![]() 5 v& B. _, N; `0 g( E& o 15、可以看到addr2line.exe工具给我们定位出的错误代码行数; o @4 B8 ?" f7 A5 h, w, G8 B# Z . R- v- u x) ^6 @; A ![]() 、: Y. v! x2 o1 G 使用CmBacktrace库能帮助我们有效快速地定位HardFault错误 转载自:创客技术日记 如有侵权请联系删除 0 f! b8 h4 Q0 x. |2 j& A- u' A3 \ |
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测评】外部中断控制小灯