
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult, B# p3 p$ d4 j% i' m 常见的导致单片机进入hardfult有以下原因: 堆栈溢出、数组越界、野指针、非对齐访问 ; u- \8 s6 r* B- n! {/ v 接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题4 ]! c, {1 u) L) ~2 j% z; a 7 G) {% e6 n1 r& Y6 w K" c+ U. G 定位错误# X" Z$ E6 z, E! H [) V, _. y7 z9 r 方法一 Show Caller Code 在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。8 L8 I( W' y( P1 ^# _3 Q1 b" P, h, y ![]() 6 x% K3 f) [; ]: s: |: e 方法二 开源库CmBacktrace6 N) T# [; |2 d9 q I/ W* N CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: 支持的错误包括: 断言(assert) 故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault) 故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。1 ?+ V( o: ?, |. I, S/ V- ^ ' }' P6 ?: V$ }+ u2 l9 X" B 输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈 适配Cortex-M0/M3/M4/M7 MCU 5 f9 O; I3 y& l 支持IAR、KEIL、GCC编译器 3 ^3 A f! j$ H9 _: T 下面我们以实例过程移植及使用(Keil). ^0 a1 X8 ?3 e0 c1 M) S 1、下载源码,解压,如下图 ![]() - V6 i6 {" e7 f 其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。* L6 S" O* ]- ^. C( ] 2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件 ![]() 3、添加到工程中,添加头文件、勾选C99模式 ![]() r* u5 n0 ?9 J2 t ![]() " `5 W* ~, X/ n 4、这时我们可以编译一下工程,编译后提示比较多错误- V/ u( y' v' e- G5 |% f2 \ ![]() 6 x6 s! B+ V( J, g 5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下: ![]() 0 @+ f4 B: `* y 6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了' x$ B) X$ R2 c ![]() 7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽 ![]() 8、这时我们重新编译,错误消除。. t* M! s- J( { 我们在main.c文件里编写需要测试的代码,如下:% w9 O/ B2 P; ^ & O1 s7 a1 c; q% i j ![]() # F$ b( K( v/ _( z" \- Y 9 u1 G, }, V/ f9 s* s0 l: h! U Z" M- f( ?9 H/ m# B: c6 C/ s; M 9、下载并运行程序:# ]7 K* I' d# q$ f- \4 { 3 S$ n; J' v# T# y5 ~3 H: A' \ ![]() 10、可以看到串口输出的错误信息,我们根据提示运行命令: addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,2 G" K4 s* I6 u5 I ![]() ( E7 w0 w# | L5 R7 M; i 11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:2 P o" ?1 O! d! q1 ]* q! t ' o8 n+ g" D/ ~% z4 h0 |+ ] ![]() 12、在该文件夹中,我们按下shift键同时点击鼠标右键, n- _; c9 t+ p8 P * c8 K# U7 I* A; V ![]() 13、在powershell中,输入 start cmd并回车运行 ) ~: d' A; T& u* L- J% i9 Q4 C ![]() # F8 f5 F9 `. B- R2 ~ 14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行' `6 }) |9 c) ]; V6 V2 o! w" h ![]() 9 E4 }2 _( n2 _+ p 15、可以看到addr2line.exe工具给我们定位出的错误代码行数 * q* ]6 b* _5 W# w% x, g l ![]() 、 使用CmBacktrace库能帮助我们有效快速地定位HardFault错误 转载自:创客技术日记8 W+ J# H; [4 l& b+ H! m+ O 如有侵权请联系删除; x% O# g9 @, v* M2 x , I' E) B! A1 u& n; I0 a3 ]9 ` |
【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测评】外部中断控制小灯
【STM32C0评测】1、开箱,芯片介绍以及后续的评测计划