
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult 常见的导致单片机进入hardfult有以下原因:6 o' `. _( `+ O' ^( G4 B 堆栈溢出、数组越界、野指针、非对齐访问 " E% U1 D# k( F5 ` 接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题8 V7 j! \ Z K# f ' d5 n; D( n% R# t* w' p 定位错误$ g- A; T' E I, ^: u 方法一 Show Caller Code) y% d# ?8 f7 K 在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。( H, T7 A) W1 n* Y6 F ![]() & H2 w8 U+ F; q7 {3 j 方法二 开源库CmBacktrace CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: ! |6 J: L1 S) f; \! F; h" _, X 支持的错误包括: 断言(assert)( |7 q! ~) M8 {) C: P 故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)5 J$ N# [5 b! a6 G l7 w0 } 故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。2 h8 W8 C# y0 G1 c) t ! R9 i1 b7 x3 R# i" ?5 b 输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈; s& Q2 e: x1 n$ b- j" ~8 Z8 l1 V1 [ + H' U+ ~2 n9 t$ Q3 @% x( l2 [ 适配Cortex-M0/M3/M4/M7 MCU- _) y% Y5 s+ S8 U( \ 支持IAR、KEIL、GCC编译器 下面我们以实例过程移植及使用(Keil)7 m1 c7 \+ z3 t1 P7 p! m0 ^, M. @ 1、下载源码,解压,如下图 ![]() 其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。7 z4 J( U, M5 S; L. h 2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件 ![]() 3、添加到工程中,添加头文件、勾选C99模式 , D+ R/ v% F0 Z9 w* D0 L ![]() ![]() 4、这时我们可以编译一下工程,编译后提示比较多错误! r" b& ?, J& @% ] ( d0 {3 W- y; D3 ^ ![]() 0 j. {/ k0 ]3 G$ G3 y5 r; B 5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下: 3 B. X8 A+ j% z- C, b7 D8 T* v ![]() , F+ Y* x8 S$ Y" ?7 ?% ` 6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了 ![]() # l; [6 m- Y& k0 h# {. ^ 7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽8 w! A# p: ?, d* r 1 a! a0 D: F2 o. Y/ e! W ![]() 8、这时我们重新编译,错误消除。 ; p A: j4 i! l. ]5 ]! e 我们在main.c文件里编写需要测试的代码,如下: ![]() + g/ ?" c# e9 h) q j1 J- A+ ^: m7 E 3 P0 _% `9 J9 j, o( C7 J3 T $ {0 m3 [+ r1 h6 Y 9、下载并运行程序: 3 _4 _( @5 Z/ ? ![]() 10、可以看到串口输出的错误信息,我们根据提示运行命令:. S& E0 H8 A3 c) O6 P addr2line -e USART_TEST.axf -a -f 0800157e 080015ce1 f& e6 x6 d* e% K! B6 G( B 运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,# R$ G6 t, n* N 9 ^( L$ p& M$ u+ R4 n+ C ![]() 11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:2 B8 M w- n# |6 k ![]() 12、在该文件夹中,我们按下shift键同时点击鼠标右键 ) r9 l# E+ U' U/ `7 Z5 g ![]() - P& L, W: f0 E' V' ` 13、在powershell中,输入 start cmd并回车运行 5 E3 o9 h0 E/ `% }* h ![]() 14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行; _! p) n# \/ t + D f( m1 G) g! k Q7 B8 r ![]() 15、可以看到addr2line.exe工具给我们定位出的错误代码行数 ![]() 、( {7 \+ h/ ^0 u+ I/ O3 W7 t( M 使用CmBacktrace库能帮助我们有效快速地定位HardFault错误 转载自:创客技术日记 如有侵权请联系删除. B2 j; E6 r8 q8 V$ k - f. l z8 x4 l. y0 N |
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测评】外部中断控制小灯