在MDK(Keil)下STM32进入“HardFault”异常错误查错调试方法

STM32进入HardFault的调试方法 STM32进入HardFault的调试方法 我们在设计STM32程序时,经常由于内存越界等,使得程序意外进入了HardFault中断。但我们一时半会又不知道,这个中断,究竟是代码运行到哪里,才触发的。常规的做法,我们只能在线调试,一步步寻找异常点,但由于发生异常的时机是不确定的,有可能在线调试的时候就不出现异常了,所以相当头疼。但本文介绍一种方法,可以直接定位到异常点,节省排查问题的时间。 这个方法的关键是,由于STM32中断前会由硬件保护现场,这个所谓的“现场”正是中断前程序运行的位置。我.. 阅读详情
AI摘要

本文详细介绍了在MDK工程中定位HardFault异常的具体步骤。通过分析栈中的寄存器值,如SP、PC、xPSR及LR,可以快速定位到异常代码。文章还展示了如何利用.map文件进一步确认异常发生的准确位置。

1、导致异常的原因有很多,例如:直接使用未分配空间的指针、栈溢出等异常非法操作便会使程序进入“HardFault”异常状态。

接下来在MDK工程中,编译代码,并debug,之后全速运行,可以看到如下图所示程序进入HardFault异常。

如下所示我们找到SP寄存器,0x200045B8即为栈地址,栈里面的值依次为R0~R3、R12、PC(Return address)、xPSR(CPSR或SPSR)、LR。如图我们看到划红线的地方,注意从右往左看。分别为0x0800427D和0x08004BFA。

在show code at address中输入0x08004BFA,点击go to即找到出现异常的代码段附近下面要执行的程序。

我们用同样的方法在show code at address中输入0x0800427D,找到如下代码段

可以发现异常代码就在uart_send_noackdata这个函数里,这个函数里我们定义了一个指针,没有给他分配空间便开始使用了。由此我们掌握了第一种查找异常的方法。只要记录栈里面第21~24以及25到28字节的内容即可方便的找到异常代码。下面介绍使用.map文件查找异常。.map文件在keil工程里面随着程序的编译会自动生成。

、

在.map文件里我们查找0x08004BFA,找到了0x08004bd8指示是uart_send_noackdata函数,到此我们找到了异常代码所在的位置。

 由此我们知道我们只要找到栈里面PC(Return address)、xPSR(CPSR或SPSR)寄存器里的内存地址便可以找到异常代码。

CPSR

当前程序状态寄存器 (Current Program State Register)

SPSR

保存的程序状态寄存器 (Saved Program State Register), 有6个,主要是在处理异常的时候使用。

每一种处理器模式下都有一个专用的物理寄存器作为备份的程序状态寄存器SPSR , 当特定的异常发生时,这个物理寄存器负责保存CPSR当前程序状态寄存器的内容, 当异常处理程序返回时,再将内容恢复到当前程序状态器中,继续向下执行原来程序。

PC

程序计数器,是用来计数的,指示指令在存储器的存放位置,也就是个地址信息。

【ARM】MDK出现HardFault_Handler硬件中断的排查方法 用于排查使用MDK进入开发过程中,是否是因为堆栈溢出导致出现HardFault_Handler硬件中断。 阅读详情

相关推荐

hardfault_handler处理硬件中断错误

1.检查代码中的情况。2.检查是否有的情况,可以通过增加堆栈大小或者减少函数调用深度来解决。3.检查是否有的情况,可以通过调整中断优先级来解决。4.检查是否有外设配置不当的情况,可以通过重新配置外设来解决。5.检查是否有,例如芯片损坏等情况,可以更换芯片来解决。

m0_61973119的博客 3248

(五)stm32工程代码HardFault异常查错调试方法

一、导致异常的原因很多,例如:直接使用未分配空间的指针、栈溢出等一场非法操作便会使程序进入HardFault异常状态。下面介绍怎么找出程序中的异常。 接下来在keil_MDK工程中,编译代码,并debug,之后全速运行,可以看到如下图所示程序进入HardFault异常。 如下所示我们找到SP寄存器,0x200045B8即为栈地址,栈里面的值依次为R0~R3、R12、PC(Return ...

weixin_30325071的博客 966

单片机选型方法论:从开发适配到量产配套的完整指南

在嵌入式产品开发中,MCU选型往往决定了项目的成败,但很多工程师习惯性地只关注主频、Flash容量和芯片单价,忽视了工具链成熟度、应用环境验证以及量产供货稳定性等更深层次的因素。真正的选型应基于产品生命周期倒推需求,将开发适配、应用验证、量产配套三个维度纳入统一评估框架:开发阶段需要重点考察IDE、编译器、调试器以及SDK例程的完善程度;验证阶段则需要通过评估板实测功耗、温度和EMC表现,而不能轻信数据手册的理想参数;量产阶段还要综合计算BOM成本、批次稳定性以及供货渠道风险。掌握一套系统化的选型方法,能显

weixin_34009794的博客 403

单片机程序调试出现Hardfault 的一些原因及其解决方法

背景 调试mcu这一类程序时,时常遇到程序进入到hardfault中,下面分享一些常见引起hardfault的原因 常见原因 (1) 数组越界 (2)野指针 (3)任务堆栈溢出 (4)未初始化硬件却开始操作,或无中断服务函数等 常用调试方法 mcu在keil中的调试方法 在仿真状态下,调出Call Stack Window,可直接跳转到调用代码 Linux中的调试方法 调试日志输出 待补充 ...

路过的熊的博客 5478

数据仓库的复用性:设计和构建一个高复用性的数仓

数据仓库的复用性是指在数据仓库的设计和使用过程中,能够实现数据、模型、流程、工具等多个层面的重复利用,减少重复开发,提高开发效率,降低维护成本,并增强灵活性和可扩展性。

z1941563559的博客 1307

STM32F0实现数字化SPWM纯正弦波逆变器

这个没啥好说的,搭电路的事。其核心思想是两边桥臂分别由两个180度相位差的正弦波与三角载波比较来控制,优点是在开关器件工作频率一样的情况下,输出PWM频率是单极性SPWM的2倍,能够明显减少谐波,因此只需要相对较小的电感和电容滤波器件就可以起到很好的滤波效果,提升了系统的性能,也精简了系统体积,降低了成本。而双极性pwm则是在整个正弦周期内,四只管子都在高频开关状态工作,对角线上的管子一起导通,另一对角线上管子互补导通,实际上只需要一路互补的PWM控制,负载上电压在正电压和负电压之间切换,不出现0v。

forlifefor的专栏 1万+

从Keil MDK到STM32Cube IDE:HAL库项目迁移全指南

嵌入式开发中,工具链的切换往往牵一发动全身。从编译器原理看,ARMCC与GCC在关键字、内联汇编和优化策略上存在本质差异,而工程结构、启动文件与链接脚本的差异更是迁移的关键。STM32CubeIDE凭借免费跨平台、图形化配置及HAL库自动生成能力,正成为越来越多团队的选择。理解这些底层概念,不仅能解释为什么“另存为”无法完成迁移,更能指导实际的项目改造。本文以HAL库为切入点,系统梳理外设API改写、头文件宏定义处理、GCC兼容性调整、编译链接报错排查及烧录调试等完整链路,适用于产品级老工程工具链升级、国产

weixin_34043301的博客 375

项目经理面试 5 大高频题 + 实战回答模板,帮你稳拿 offer

项目经理面试5大高频问题及应答技巧 摘要:本文总结了项目经理岗位常见的5个面试问题及回答策略,帮助求职者更有针对性地准备面试。核心问题包括:1)描述负责过的典型项目;2)常用项目管理工具;3)项目遇到的挑战及解决方案;4)风险管理方法;5)项目成功标准。每个问题都从面试官考察重点、回答技巧、实战案例三个维度进行分析,强调要用STAR法则(情境-任务-行动-结果)结构化表达,突出解决问题的能力而非简单罗列经历。特别提醒要量化项目成果(如提前2周上线、节省8%预算等),并注意展示商业思维和团队协作能力。

逸尘谈PM 2106

STM32C0x1实战:Cortex-M0+入门32位MCU的低功耗设计与应用

32位MCU作为嵌入式系统的核心,凭借ARM Cortex-M系列内核的普及,正逐步替代传统8位单片机成为主流选择。其中Cortex-M0+内核以精简指令集、单周期IO访问和低中断延迟著称,在保证性能的同时显著降低功耗与成本,特别适合对资源敏感的小家电、传感器节点和工业控制面板等场景。理解时钟树、启动流程、外设配置和调试方法,是发挥这类入门级MCU价值的关键。本文结合实际工程经验,从架构、时钟、Bootloader到低功耗设计,系统梳理STM32C0x1这颗入门级32位MCU的典型应用,并给出从8位机迁移时

weixin_30460489的博客 348

从零开始:在Unity中使用Dynamic Bone实现角色骨骼自然抖动(以女性角色胸部为例)

本文详细介绍了在Unity中使用Dynamic Bone插件实现角色骨骼自然抖动的完整流程,特别以女性角色胸部为例。从插件导入、骨骼系统基础到Dynamic Bone组件配置和参数调优,提供了全面的技术指导。文章还包含性能优化技巧和常见问题解决方案,帮助开发者快速掌握这一物理效果实现方法。

weixin_28728495的博客 457

WPF毛玻璃效果别再写C#代码了!纯XAML用Border+VisualBrush+BlurEffect三步搞定

本文详细介绍了如何在WPF中通过纯XAML实现毛玻璃效果,无需编写C#代码。通过VisualBrush、BlurEffect和Clip的黄金组合,开发者可以快速创建专业级的毛玻璃面板,提升UI的现代感和视觉层次。文章还提供了性能优化技巧和实战案例,帮助开发者在各种场景中高效应用这一技术。

weixin_28630185的博客 353

mbed OS源码解析:从HAL到RTX5的嵌入式系统设计

嵌入式系统开发中,硬件抽象与实时内核的协同设计是提升代码可移植性与工程效率的关键。HAL层通过PinName与统一C++接口,将GPIO、UART、I2C等外设操作抽象为平台无关的对象,让工程师无需直接操作寄存器;RTOS层基于CMSIS-RTOS2标准集成RTX5内核,采用抢占式调度与事件标志、消息队列等同步原语,解决多任务时序冲突。CMSIS作为Arm生态的通用公约数,进一步确保了不同MCU间的软件兼容性。此类分层架构在物联网节点、多传感器融合及低功耗设备等场景中应用广泛,能够显著缩短产品开发周期。mb

weixin_34221332的博客 397

Neo4j桌面版导入CVS文件

我们的relation.csv是这样的。

m0_53573725的博客 818

stm32进入HardFault的异常定位方法

首先导致HardFault的原因有很多。堆栈溢出、未分配空间的指针(野指针)、等等。下面介绍几种找出导致HardFault异常的比较实效有用的方法。 1、通过地址分析查找。 如下图所示,程序进入HardFault异常。 可以看到SP寄存器,0x200045B8即为栈地址,该地址里面的值依次为R0~R3、R12、PC(Return address)、xPSR(CPSR或SPSR)、LR。每...

Lin的博客 6649

从零玩转GD32单片机CAN总线:手把手实战配置与源码解析

本文提供了一份基于GD32单片机的CAN总线实战入门指南。从硬件连接(GD32F103C8T6与TJA1050收发器)到软件配置,详细解析了CAN初始化、波特率计算、过滤器设置及中断收发等核心源码。通过手把手的回环测试示例与常见问题排查,帮助开发者快速掌握CAN总线通信的关键配置与调试技巧。

g5h6i7j的博客 481

Android 13 Settings蓝牙列表卡顿问题排查及优化过程

此时我们的卡顿优化基本完成了,我们应该要考虑内存是否会泄漏,如果大家不知道哪些需要回收可以用leakcanary和android profiler进行内存检测,看代码有没有内存泄漏。

龚礼鹏的博客 2547

Keil环境下STM32定位hardfault位置方法(addr2line工具)和遇到的情况

本章主要记录下我实践过的hardfault定位办法。后续遇到hardfault相关问题,也一并补充到本文中,方便自己查阅。

u014448875的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

HardFault错误排查

嵌入式HardFault错误排查

yplwrt的博客 1520

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

stm32进入硬件错误中断hardfault的原因剖析以及如何定位(必看)

指令集方面:arm一般高端处理器,比如cortex-a系列,都是32位的arm指令。而cortex-m0,1,3,4等低端处理器,也叫做单片机,为了增加代码密度(同样存储器内可以存更多指令),用的是thumb指令集(而且仅支持这个指令集),这个指令集大多数指令是16位的,少数是32位的。这就是为什么上面的调试图中,看到指令都是两个字节,而有的是4个字节。比较老的arm7,arm9等处理器,支持thumb指令和arm指令,需要通过指令告诉处理器,显式的进行指令转换,这个因此需要编译器提供支持。 注意:stm

biao2488890051的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

[STM32]KEIL调试程序进入HardFault_Handler异常处理总结

分析说明:由于CM3在进入异常服务程序后,LR的值被自动更新为特殊的EXC_RETURN(附图),按照文件说明这是一个高28位全为1的值,只有[3:0]的值有特殊含义,如果主程序在线程模式下运行,并且在使用MSP时被中断,则在服务例程中LR=0xFFFF_FFF9(主程序被打断前的LR已被自动入栈)。任何未对齐的访问等等。3.6 如果不是函数语句的问题,可以通过查看编译后的.map的文件中heap与STACK所占用的地址,通过Memory内存窗口来观察堆栈的使用情况,来看是不是堆栈内存有溢出导致的。

ic2121的博客 4928

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

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

bandaostart 3928

keil、IAR下如何解决HardFault_Handler中断问题

调试过程中难免会遇到各种异常,hardfault算是比较常见的一种。在最开始学习的时候,一度很害怕这种情况,不知道怎么定位,摸不清是哪里导致了问题,全靠猜测。网上有很多定位hardfault问题的教程,基本大差不差,方法就那些。 最近有点时间,我也整理下。本章主要记录下我实践过的hardfault定位办法。后续遇到hardfault相关问题,也一并补充到本文中,方便自己查阅。

weixin_44057803的博客 5612

stm32cube出现Hardfault的调试方法(emwin死机)

使用stm32cube,在emwin框架下死机,出现hardfault的处理方法

weixin_38411122的博客 3189
上一篇: Altium Designer 18 定义异形板子形状及异形开槽
下一篇: 天线座和连接器SMA、U.FL、IPX、IPEX
并行处理器
博客等级 码龄14年 22粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值