Cortex-M3 内核HardFault错误调试定位方法

Hard_Fault_Handler处理 出现原因: 内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。 堆栈溢出。增加堆栈的大小 步骤: 找到程序进异常的地方 在固定的地方进异常 在不确定的地方进异常 ... 阅读详情

首先更改startup.s的启动文件

把里面的HardFault_Handler代码段换成下面的代码:

HardFault_Handler\     
    PROC     
    IMPORT  hard_fault_handler_c ;函数申明
    TST LR, #4  ;根据LR.2判断使用的什么堆栈
    ITE EQ     
    MRSEQ R0, MSP ;使用MSP堆栈
    MRSNE R0, PSP ;使用PSP堆栈
    B  hard_fault_handler_c ;执行函数                
ENDP

添加hard_fault_handler_c函数

然后把hard_fault_handler_c函数放在c文件的代码中。代码如下:

void hard_fault_handler_c(unsigned int * hardfault_args) 
{  
    static unsigned int stacked_r0;
    static unsigned int stacked_r1;  
    static unsigned int stacked_r2;  
    static unsigned int stacked_r12;  
    static unsigned int stacked_lr;  
    static unsigned int stacked_pc;  
    static unsigned int stacked_psr;  
    static unsigned int SHCSR;  
    static unsigned char MFSR;  
    static unsigned char BFSR;   
    static unsigned short int UFSR;  
    static unsigned int HFSR;  
    static unsigned int DFSR;  
    static unsigned int MMAR;  
    static unsigned int BFAR;   
    stacked_r0 = ((unsigned long) hardfault_args[0]);  
    stacked_r1 = ((unsigned long) hardfault_args[1]);  
    stacked_r2 = ((unsigned long) hardfault_args[2]);  
    stacked_r3 = ((unsigned long) hardfault_args[3]);  
    stacked_r12 = ((unsigned long) hardfault_args[4]);  
/*异常中断发生时,这个异常模式特定的物理R14,即lr被设置成该异常模式将要返回的地址*/  
    stacked_lr = ((unsigned long) hardfault_args[5]);   
    stacked_pc = ((unsigned long) hardfault_args[6]);  
    stacked_psr = ((unsigned long) hardfault_args[7]); 

    MFSR = (*((volatile unsigned char *)(0xE000ED28))); //存储器管理fault状态寄存器   
    BFSR = (*((volatile unsigned char *)(0xE000ED29))); //总线fault状态寄存器   
    UFSR = (*((volatile unsigned short int *)(0xE000ED2A)));//用法fault状态寄存器    
    HFSR = (*((volatile unsigned long *)(0xE000ED2C)));  //硬fault状态寄存器     
    DFSR = (*((volatile unsigned long *)(0xE000ED30))); //调试fault状态寄存器  
    MMAR = (*((volatile unsigned long *)(0xE000ED34))); //存储管理地址寄存器  
    BFAR = (*((volatile unsigned long *)(0xE000ED38))); //总线fault地址寄存器  
    while (1);  
}

根据寄存器值判断出错函数
执行程序后,若发生内核错误,则程序会运行到最后的while(1)处。此时观察相应的堆栈和故障寄存器值

  • LR即为故障发生时进入故障中断前pc的值,可以通过生成的.map文件来查找出错函数
STM32 Cortex-M3 HardFault异常定位 STM32 HardFault定位 阅读详情

相关推荐

STM32 HardFault调试实战:利用LR与PC寄存器精准定位内存访问错误

在嵌入式系统开发中,内存访问错误是导致程序崩溃的常见原因,常表现为HardFault异常。其本质是CPU试图执行非法指令或访问非法内存地址,触发了内核的硬件保护机制。理解这一原理对嵌入式开发至关重要,因为它直接关系到系统的稳定性和可靠性。从技术价值看,掌握HardFault调试方法能显著提升问题排查效率,减少系统宕机时间。在实际应用场景中,电机控制、工业自动化等对实时性要求高的领域尤其需要快速定位此类错误。本文以STM32 Cortex-M内核为例,深入解析如何通过LR(链接寄存器)和PC(程序计数器)这两

weixin_33377602的博客 239

从网上学习到的适用于M3/M33/M4的HardFault故障判断方法

使用该HARDFAULT检查,在汇编文件的HARDFAULT函数中插入此段(替换原本汇编文件中的HardFault跳转),适用于M3/M33/M4

weixin_45720681的博客 1528

MCU HardFault学习小记(一)——基于Arm Cortex-M系列

HardFault(硬件错误)是一类在嵌入式系统开发中较为常见的系统异常,优先级仅低于复位和NMI(不可屏蔽中断)。当系统运行过程中遇到了某些错误时程序就会跳转至HardFault_Handler函数中,引发程序故障进而影响程序的正常运行。本文介绍了HardFault问题的背景和解决HardFault问题所需的理论知识,并在此基础上介绍了两种HardFault问题的查找和分析法。

青渡QAQ的博客 4960

Cortex-M3/M4/M7 内核HardFault错误调试定位方法

参考文章链接:Cortex-M3 / M4 Hard Fault Handler – Frank's Random Wanderings (frankvh.com) 1.更改startup.s的启动文件 把里面的HardFault_Handler代码段换成下面的代码: ;/********************************************************************* ;* ;* Forward declarations of segments us

pingxiaozhao的博客 4283

Cortex-M系列HardFault_Handler()最强分析“CmBacktrace”

一、简介 先引用一句话 “俗话说,工欲善其事,必先利其器。所以有时候做事效率低的原因也许是,你会用的工具种类太少。” 对于从 C51 、MSP430 等简单单片机转而使用更加复杂的 ARM 新人来说,时不时出现的 "hard falut" 死机会让新人瞬间懵掉。定位错误的方法也往往是连接上仿真器,一步步 F10/F11 单步,定位到具体的错误代码,再去猜测、排除、推敲错误原因,或者使用“屏蔽大法”,这种过程往往浪费几天时间且十分痛苦。 慢慢的大家知道可以通过故障寄存器信息来定位故障原因及故障代码地址,

风吹花中花吹风的博客 6827

Cortex-M内核HardFault_Handler底层原理图解说明

深入剖析Cortex-M内核中hardfault_handler的触发机制与底层响应流程,结合图解揭示异常入口与堆栈行为,帮助开发者快速定位硬故障根源。

weixin_42575505的博客 1012

Cortex-M 处理器 hardfault 定位方法和步骤(基于Keil mdk)

一. 问题的产生 Hard fault (硬错误,也有译为硬件错误的)是在STM32上编写程序中所产生的错误,造成Hard Fault错误的可能原因较多,排除硬件问题,如何在代码量较大的情况下,快速定位造成的hardfault的问题代码,就成为比较关键的问题。 本文将基于STM32处理器(stm32f091),keil-MDK开发环境,总结hardfault的调试定位方法。在其他Cor...

musclegao的博客 2万+

嵌入式开发报错「HardFault_Handler」:ARM Cortex-M内存访问越界的调试工具

调试工具选择场景推荐工具快速定位CmBacktrace(自动化回溯,支持RTOS)实时调试SEGGER_HardFaultHandle(JTAG/SWD接口,支持IDE集成)手动分析寄存器分析与堆栈回溯(适用于无调试工具的场景)

shejizuopin的博客 1526

ARM Cortex-M内核单片机HardFault异常详解

HardFault是ARM Cortex-M处理器异常模型中的一个最高优先级、不可屏蔽的异常。它属于“系统异常”类别。当处理器检测到严重错误,且该错误无法被其他异常处理程序(如MemManage、BusFault、UsageFault)捕获或这些异常处理程序本身被禁用时,便会“升级”为HardFault。简单来说,HardFault是系统最后的“安全网”,用于捕获那些可能导致系统完全失控的底层硬件或软件错误。

qq_43767426的博客 217

ARM Cortex-M硬错误处理:HardFault_Handler问题定位通俗解释

深入解析ARM Cortex-M架构中hardfault_handler问题定位的机制与方法,帮助开发者快速排查系统崩溃根源,掌握常见触发原因和调试技巧,提升嵌入式开发效率。

weixin_33506815的博客 936

stm32-hardfault产生的原因分析

前言 关于定位hardfault产生之前的程序运行情况,有如下两种方法: 在keil里单步调试时在hardfault入口处打个断点,然后通过看寄存器的值,或直接用鼠标操作就能回退到上一层出错的位置;具体方法有很多人都分享过; 使用armink的工具cmbacktrace,这是朱天龙老师在github上的一个开源项目,特意为cotex-m系列MCU做的异常追踪库; hardfault,有些时候找到触发路径,也不知道原因。其实触发hardfault的原因在《权威指南》里都说的很清楚了,并且cmbacktra

qq_25355591的博客 1万+

Cortex-M4 HardFault原因查找方法

Cortex-M4 HardFault原因查找方法 文章目录Cortex-M4 HardFault原因查找方法写此博客背景思想简说我的做法Step 1:Step 2:Step 3:Step 4:Step 5:Step 5:结果分析 写此博客背景 最近几日在Github上看到一个叫Armink的大神做了一个追踪Cortex-M系列的HardFault项目,具体连接:请点击这里 看完之后感觉很是方便,大大的简化了我们查找出现HardFault的原因,由于我手边有的是一个STM32F407IG的开发板,便想尝试一

Moon~ 2942

STM32开发实战:从嵌入式系统到硬件控制 | 你必须得会

🏆本文收录于「编程与技术实战」专栏,此专栏涵盖了C/C++编程、人工智能、数据结构、机器学习等技术领域的内容,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 1045

cortex内核hardfault错误的定位方法实战

单片机一般是cortex-m3之类的内核,其实其他内核也是一个道理。hardfault错误一般是操作了不该操作的内存,或者执行了不该执行的动作,例如一个非法的函数指针,你非要去调用。 调试这个错误的原理是: 发生hardfault错误后就会进入相应的hardfault中断,进入中断前会在被中断的地址执行压栈动作,将当时的工作环境(就是系统的一些寄存器,r0,r1,r2,r3,lr,pc,r12)压进堆栈,将lr赋值非法数据,然后跳到hardfault中断执行中断服务程序。那么只需要将压栈后的lr读出来,

oushaojun2的专栏 1879

K210视觉项目上位机避坑指南:解决C#解析ESP8266 TCP图像流的乱码、卡顿与连接中断

本文详细解析了K210与ESP8266在视觉项目中的上位机开发问题,重点解决TCP图像流解析中的乱码、卡顿与连接中断问题。通过自定义协议、JPEG流重组、TCP连接优化等实战技巧,提升系统稳定性和性能,适用于嵌入式视觉开发者和C#上位机程序员。

weixin_28730131的博客 402

STM32H743 LAN8720网口配置避坑指南:用CubeMX v6.5.0快速搞定LWIP+FreeRTOS

本文详细介绍了使用CubeMX v6.5.0配置STM32H743与LAN8720网口的LWIP+FreeRTOS方案,涵盖硬件连接、时钟配置、ETH外设初始化及LWIP协议栈调优等关键步骤。特别针对常见陷阱提供解决方案,帮助开发者快速实现稳定网络通信,适用于嵌入式网络开发场景。

weixin_33739523的博客 357

HardFault IAR定位方式

摘要:HardFault是Cortex-M架构中最严重的系统异常,通常由非法内存访问、栈溢出、执行非法指令等操作触发。它会在三种可屏蔽错误(内存管理、总线、用法错误)未被处理时自动升级产生。当HardFault发生时,CPU会保存R0-R3、R12、LR、PC和xPSR到栈中。调试方法包括:1)通过调试器查看异常时寄存器状态和PC地址;2)在中断处理函数中提取出错的堆栈信息,分析PC指向的故障指令位置。常见解决方法是检查指针有效性、确保栈空间充足并验证指令执行环境。

qq_61917871的博客 1716

使用ExcelJS向XLSX单元格居中插入图片

本文记录了使用ExcelJS库向XLSX单元格里居中写入图片的方法。本文内容包括:xlsx 文件格式;xlsx 图片定位的长度单位;使用nativeColOff和nativeRowOff进行定位,不要使用官网给的定位方式;添加图片到数据表的总体流程和样例代码;注意事项等。

weixin_43678000的博客 3456

Cortex-M3开发经验:确定发生HardFault的地方

Cortex-M3开发经验(二):确定发生HardFault的地方 我们在调试时,最害怕就是出现HardFault错误了。因为我们不知道是从哪个地方跳到这里的?单步调试起来太过于麻烦,特别在代码量大的时候,更是费时间。 那么有没有一种方法,可以快速定位到发生HardFault错误的代码位置(函数)呢?Cortex-M3中断/异常的响应过程我们知道,HardFault实质上是一个中断,中断的过程如下图: 在这里我就有一个疑问了:既然FUNC1和IRQ_Handler之间不存在调用关系,那IR..

自由的天空 1097

传感器:MQ-5燃气模块测量燃气值(底部附代码)

本篇文章介绍使用MQ-5燃气模块测量燃气值,CPU还是选择单片机,MQ-5主要使用的技术为ADC,燃气对于单片机来说是模拟信号,需要转换为数字信号,再经过相关计算公式将燃气模拟值转换成对应的燃气数值,便于人们方便查看。例如家庭使用燃气模块测量燃气值,如果燃气值超过一定的范围,可以外设一个报警装置,保证家庭的生命安全。(1)ADC(analog to digital converter)即模数转换器,它可以将模拟信号转换为数字信号。按照其转换原理主要分为逐次逼近型、双积分型、电压频率转换型三种。STM32F1

Mr_zhang1911116的博客 1万+

I2C通信协议SCL与SDA引脚特性:核心要点总结

深入讲解I2C通信协议中SCL和SDA引脚的工作机制与电气特性,帮助理解i2c通信协议的稳定传输原理,掌握上拉电阻配置与信号时序控制要点。

weixin_42103128的博客 2740

ARM Cortex-M4 HardFault终极排查手册:以S32K146精确总线错误为例

本文深入解析ARM Cortex-M4 HardFault异常机制,以NXP S32K146微控制器为例,详细讲解如何通过SCB和HFSR寄存器捕获总线错误地址(BFAR),区分精确与不精确错误,并提供系统化排查流程和调试技巧,帮助开发者快速定位和解决嵌入式系统中的HardFault问题。

fox11的博客 644

45.qt quick-qml虚拟软键盘详解(一)

1.qml虚拟键盘介绍 Qt虚拟键盘的主要功能包括: 可定制的键盘布局和风格与动态切换。 带有单词选择的预测性文本输入。 角色预览和替代角色视图。 自动大小写和空格插入。 不同分辨率的可伸缩性。 支持不同的字符集(拉丁,简体/繁体中文,印地语,日语,阿拉伯语,希伯来语,韩语和其他)。 支持大多数常见的输入语言,可以轻松扩展语言支持。 从左到右和从右到左的输入。 硬件键支持2路和5路导航。 手写支持,带有全屏输入的手势。 音频反馈。 跨平台功能。 支持多国语言,高达40多个语言 本

抵抗时间扭曲,坚持做一件有意义的事 3560
上一篇: 随机数在密码学中生成Salt的用法
下一篇: .wav文件详解,PCM数据格式,.wav生成C语言数组
技术在路上
博客等级 码龄16年 644粉丝 160原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术在路上

帮助需要的人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值