
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult# y! y8 m5 k! x6 K6 ] 常见的导致单片机进入hardfult有以下原因:% n0 d/ B9 \) B, b1 a 堆栈溢出、数组越界、野指针、非对齐访问0 @# k' P4 c5 o5 G+ S. l ! S9 u4 o# j. O7 z! u7 I) ] 接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题 9 \8 B' I* x2 z3 M O6 | 定位错误: E& G3 T" V9 t: [: F2 I7 M2 L, _ 方法一 Show Caller Code* s& U# @8 |5 c& M2 S- s9 {2 q 在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。 + r" v I& h; ^9 Y- t& ^0 N ![]() ( Z1 G' `5 z5 F, r) [4 a# K# C0 P) H) p 方法二 开源库CmBacktrace CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: ' W" M; e: C4 e( C; i 支持的错误包括: 断言(assert)* [/ z. ^3 R7 M: y, |7 r. q 故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)# f' i. [# q( u# r8 B+ X* b- B 故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。 输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈 适配Cortex-M0/M3/M4/M7 MCU' }6 B- W3 v" i9 L# ?7 N2 i$ p: w2 f 0 x- e, z4 b5 k* ^" a/ j 支持IAR、KEIL、GCC编译器9 V$ z, e6 C& L1 I 下面我们以实例过程移植及使用(Keil) 1、下载源码,解压,如下图4 f/ e; y& G: q# o ![]() 其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。+ C% I2 H# {0 j6 f0 \9 v8 |: z# q ( r' Y- {3 [/ k2 Q4 X 2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件 0 [! H6 p4 ^- U( ] ![]() 3、添加到工程中,添加头文件、勾选C99模式 ![]() ! ~ i& w# m) a5 F! l3 c5 c+ T ![]() $ l; K c% x/ `3 F$ c 4、这时我们可以编译一下工程,编译后提示比较多错误0 W5 o$ S% Q0 N5 Z$ B( x3 g6 e5 [ 1 A& q1 E$ F0 H# v' \ ![]() 5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下: ![]() 6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了$ V5 B5 ^6 s1 Z6 b* ] ![]() 7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽3 c7 |/ i+ j' H ![]() 8、这时我们重新编译,错误消除。" N4 F" y/ r- u: \9 @6 b J$ W# q 我们在main.c文件里编写需要测试的代码,如下:2 Y3 J& K& h3 D ![]() 5 r2 i/ p; t$ T& I 9、下载并运行程序: , q% ]0 [% m# C$ ~! k, e. w( {0 \ ![]() 10、可以看到串口输出的错误信息,我们根据提示运行命令:3 O, V! b, c& B% ~" d addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内, ![]() 11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中: ![]() 1 Q* L) }- X! n 12、在该文件夹中,我们按下shift键同时点击鼠标右键 ![]() ' B0 \5 ?5 F" F; Q 13、在powershell中,输入 start cmd并回车运行3 o% b' B' r& u0 }. D ![]() % r* v5 G; k2 t, }$ ~ 14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行1 L r# h6 m2 ]6 a/ v# s ![]() 0 ?5 p5 u5 }* E @ 15、可以看到addr2line.exe工具给我们定位出的错误代码行数 # A& o+ ]7 U$ g2 Z: C, w" Y ![]() 、' @( s) {3 S0 z& l 使用CmBacktrace库能帮助我们有效快速地定位HardFault错误9 d7 ^5 S1 k! r+ z $ @- F: a& }. K$ Z5 [, U 转载自:创客技术日记3 C, S3 I4 t3 Q: F5 m& } 如有侵权请联系删除/ F3 Z8 { P/ P* c7 R$ { & i; ^, L, T# B/ _# [( ~, M* M2 q |
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测评】外部中断控制小灯