怎样调试STM32硬件错误HardFault

发布者:MysticSerenade最新更新时间:2024-08-09 来源: elecfans关键字:调试  STM32  硬件错误  HardFault 手机看文章 扫描二维码
随时随地手机看文章

在用 Keil 对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler 函数里的死循环while(1)中。

这说明 STM32 出现了硬件错误。

45321a80-24bb-11ee-962d-dac502259ad0.png?imageView2/2/w/1000硬件错误中断

STM32出现硬件错误可能有以下原因:

数组越界操作;

内存溢出,访问越界;

堆栈溢出,程序跑飞;

中断处理错误;

遇到这种情况,可以通过以下2种方式来定位到出错代码段。

方法1:

在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击STOP停止仿真。

45440ca4-24bb-11ee-962d-dac502259ad0.png?imageView2/2/w/1000示例

在Keil菜单栏点击View——Registers Window,在寄存器查看窗口查找R14(LR)的值。

如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值;如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值;

我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。

 4558d3fa-24bb-11ee-962d-dac502259ad0.png?imageView2/2/w/1000寄存器信息

在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”;

在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。

地址一般以 0x08 开头的32位数。本例中,地址为0x08003CB9。

456ea59a-24bb-11ee-962d-dac502259ad0.png?imageView2/2/w/1000内存信息

在Keil菜单栏点击View——Disassembly Window,在Disassembly窗口中右击,在下拉菜单中选择Show Disassemblyat Address...。

在弹出框Show Code atAdress的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。

仔细查看附近区域的相关代码来排查错误具体原因。

4581abae-24bb-11ee-962d-dac502259ad0.jpg?imageView2/2/w/1000

方法2:

在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。

459f26b6-24bb-11ee-962d-dac502259ad0.jpg?imageView2/2/w/1000CallStack

在Keil菜单栏点击View——Call Stack Window弹出Call Stack + Locals对话框。

然后在对话框中右键选择Show Caller Code,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。

关键字:调试  STM32  硬件错误  HardFault 引用地址:怎样调试STM32硬件错误HardFault

上一篇:STM32工程上printf()函数的方法实现
下一篇:STM32F407 基本定时器使用

推荐阅读最新更新时间:2026-03-24 11:09

STM32死机 调试时进入HardFault_Handler定位错误的方法
STM32在运行不正常的时候我们一般会进行调试看看问题出在了哪里。但是当STM32卡死后进行调试的时候会发现进入到了一个HardFault_Handler函数里,这是一个硬件错误处理函数。通过它和MDK配合可以定位程序最后卡死的原因。 STM32卡死的原因有以下几种:数组越界操作;内存溢出,访问越界;堆栈过小;中断处理错误;电压供电异常。 现在实验一个堆栈过小的错误,让MDK来检测这个问题然后定位错误。 这个程序基于UCOSII 系统 #define TFTLCD_STK_PRIO 8 //任务的优先级 #define TFTLCD_STK_SIZE 2 //任务的堆栈大小 OS_STK TFTLCD_TASK_S
[单片机]
<font color='red'>STM32</font>死机 <font color='red'>调试</font>时进入<font color='red'>HardFault</font>_Handler定位<font color='red'>错误</font>的方法
stm32调试,进入 HardFault_Handler
一、现象: 进入调试之后程序要不就进入void HardFault_Handler(void),要么就是进入void MemManage_Handler(void), 二、原因: cstack溢出。heap不够。 三、修改: stm32f10x_startup.s Stack_Size EQU 0x0001000 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ;// ;// ;// Heap_Size EQU 0x00008000
[单片机]
关于调试STM32进入HardFault_Handler的问题
最近调试UCGUI和UCOSII,程序莫名其妙的死掉了,用JLINK调试,发现进入了HardFault_Handler,主要原因有两个,堆栈溢出和数组越界,很不幸的是这两种情况都被我碰到了。 第一次是用UCGUI在一个button上显示文字,发现字符串显示不全,只显示第一个字符,在启动文件startup_stm32f10x_md.s中修改 Stack_Size EQU 0x00000200 ,将堆栈改大点,改为 Stack_Size EQU 0x00000400 后显示正常。 第二次是UCGUI和UCOSII联合调试时,也进入了HardFault_Handler,这次原因是数组越界,在一个函数中定义了一个
[单片机]
STM32遭遇HardFault_Handler异常,问题定位方法与技巧解析
刚开始初学STM32时,每当程序进入HardFault_Handler时,心中就会犯怵,不知怎么解决,当时网上搜到的一些大佬的帖子,问题也能得到解决,但不知道底层机理是什么,所以对这一块的掌握一直不深,之前跟着导师做项目,大冬天在外面调试设备时,又出现这样的报错,当时阴差阳错发现是FreeRTOS任务栈溢出了,现场问题解决了,后面也暗自下决心,要把这类问题深学一下。在看了Cortex-M3内核手册和STM32芯片手册以及大佬们的帖子后,整理一下,将我这个问题的解决方案做个记录。如有不对,烦请各位大佬指出! 1、前置知识 1.1、为什么会进入HardFault_Handler? HardFault_Handler
[单片机]
<font color='red'>STM32</font>遭遇<font color='red'>HardFault</font>_Handler异常,问题定位方法与技巧解析
STM32 HardFault_Handler处理方法
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。这说明STM32出现了硬件错误。 STM32出现硬件错误可能有以下原因: (1)数组越界操作; (2)内存溢出,访问越界; (3)堆栈溢出,程序跑飞; (4)中断处理错误; 遇到这种情况,可以通过以下2种方式来定位到出错代码段。 方法1: 1.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。 1.2 在Keil菜
[单片机]
<font color='red'>STM32</font> <font color='red'>HardFault</font>_Handler处理方法
STM32学习笔记11——HardFault_Handler处理方法
根据网络资料及自己调试经验总结如下: STM32 出现 HardFault_Handler 故障的原因主要有两个方面: 1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。 2、堆栈溢出。增加堆栈的大小。 排查方法: 发生异常之后可首先查看 LR 寄存器中的值,确定进入异常前一刻使用的堆栈为 MSP 或 PSP,然后找到相应堆栈的指针? 注:在 HardFault_Handler(void)中断里第一条语句打断点,进入中断后,查看 LR 寄存器的值,如果是 0XFFFFFFF9,那么中断前使用的是 MSP,如果是 0XFFFFFFFD,那么中断前使用的是 PSP; 根据找到的堆栈指针, 在内存中查
[单片机]
<font color='red'>STM32</font>学习笔记11——<font color='red'>HardFault</font>_Handler处理方法
解决stm32进入HardFault_Handler的定位办法
1、首先在HardFault_Handler的while(1)处打上断点。 2、等待代码运行到此,这时查看寄存器LR,在左边一个是工程,一个是寄存器。 上面的LR是我正常时copy的,一般在进入hardfault时,会变成下图的值,这时就可以知道该看那个寄存器的值,当时我那里是0xFFFFFFFD,所以是看PSP的地址。 3、找到该看的地址后然后如下图打开内存,输入上面找到的寄存器的地址,在右键选择以long型查看地址,如下图。 然后查看这个地址,向下面数6个long地址,大概是0x08xxxxx这样开始的则为出错代码的位置,可以反汇编查看,如下图。 这样上下对应找到这个地址值对应函数代码,在汇
[单片机]
解决<font color='red'>stm32</font>进入<font color='red'>HardFault</font>_Handler的定位办法
STM32出现HardFault_Handler故障的原因及处理方法整理
STM32出现HardFault_Handler故障的原因主要有两个方面: 1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。 2、堆栈溢出。增加堆栈的大小。 出现问题时排查的方法: 1、发生异常之后可首先查看LR寄存器中的值,确定当前使用堆栈为MSP或PSP,然后找到相应堆栈的指针,并在内存中查看相应堆栈里的内容。由于异常发生时,内核将R0~R3、R12、Return address、PSR、LR寄存器依次入栈,其中Return address即为发生异常前PC将要执行的下一条指令地址,因此在堆栈中反数第三个字即为出错位置。 2、默认的HardFault_Handler处理方法是B .将它
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved