
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult 1 k( w" n( b, f( n; ?# O9 W 常见的导致单片机进入hardfult有以下原因: 堆栈溢出、数组越界、野指针、非对齐访问 接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题 定位错误 方法一 Show Caller Code 在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。; R; o4 L0 u4 k# Q+ q) w ![]() 方法二 开源库CmBacktrace CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: 支持的错误包括: 断言(assert)5 M' M; X3 g& _7 H; V5 a! E 故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault) 故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。5 o8 S) F- Z Z7 {5 S e4 K! Q ! D8 R2 {( c2 h, R/ [+ [7 F2 P# r 输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈2 ]% H& A( j7 z9 i1 f5 z1 U# G 适配Cortex-M0/M3/M4/M7 MCU 3 ?" U: @ r4 r0 z0 D8 } Z 支持IAR、KEIL、GCC编译器; P j+ h+ q6 h R' r4 [ 下面我们以实例过程移植及使用(Keil); Q/ U8 ^& y- X; t 1、下载源码,解压,如下图/ |5 q& z2 F4 t : P3 E2 F7 z3 N$ |% n/ ` ![]() 其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。 2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件 p0 q! R2 C5 \! \8 t* r ![]() 3、添加到工程中,添加头文件、勾选C99模式1 W# n, y3 i [1 w% ?+ O # |6 {+ `3 ]4 k/ p ![]() ' J/ l) ?! T8 i! S5 D ![]() - q6 ^$ N3 Z1 G+ O4 s' Y; J 4、这时我们可以编译一下工程,编译后提示比较多错误 ' S# Y! b B7 R0 K/ S4 M8 T ![]() 5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:4 }* e# z% T* C# K$ K0 @ : X9 _9 J+ p f# X2 X( I, K. y ![]() $ C" i5 T- u- V 6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了: j& [' S( l9 S7 ~% c- s + v5 h# h) a! q- E% g& f ![]() 0 X! x$ D- K8 T: k2 W 7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽 & \* C3 e0 }' q6 w" C5 l& Y3 E/ D ![]() * Q* Y- o$ v5 C! k6 Q 8、这时我们重新编译,错误消除。; V* G) v+ u. q$ h k . q5 h/ w; D; ~4 n 我们在main.c文件里编写需要测试的代码,如下:7 s6 J( d/ k8 D/ E2 w 4 Q/ i4 C3 C6 {1 d2 C: q ![]() 9、下载并运行程序: ![]() 0 [& k1 y: i( ~& o 10、可以看到串口输出的错误信息,我们根据提示运行命令: addr2line -e USART_TEST.axf -a -f 0800157e 080015ce* R! s6 S6 e6 d; F6 F * B P: f, t# `2 G& _- h 运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内, ![]() @5 [3 I1 V5 ?- n5 W0 d" s+ L7 t 11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中: ![]() 12、在该文件夹中,我们按下shift键同时点击鼠标右键9 l; ?9 g7 c0 M& W: @3 e$ G# } ![]() 13、在powershell中,输入 start cmd并回车运行 ![]() , J% C. P/ H# b3 A. H 14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行 D" D4 N4 o% a' u; ^" i8 G ![]() ; ]6 j) x9 `* m+ O+ o9 r 15、可以看到addr2line.exe工具给我们定位出的错误代码行数 ![]() 、 使用CmBacktrace库能帮助我们有效快速地定位HardFault错误 转载自:创客技术日记 如有侵权请联系删除 u6 f* y! Z" g2 [ |
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测评】外部中断控制小灯