stm32 HardFault_Handler调试及问题查找方法

发布者:sdlg668最新更新时间:2017-11-07 来源: eefocus关键字:stm32  调试  查找方法 手机看文章 扫描二维码
随时随地手机看文章

stm32 HardFault_Handler调试及问题查找方法

 STM32出现HardFault_Handler故障的原因主要有两个方面:

1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。

2、堆栈溢出。增加堆栈的大小。

出现问题时排查的方法:

发生异常之后可首先查看LR寄存器中的值,确定当前使用堆栈为MSP或PSP,然后找到相应堆栈的指针,并在内存中查看相应堆栈里的内容。由于异常发生时,内核将R0~R3、R12、Returnaddress、PSR、LR寄存器依次入栈,其中Return address即为发生异常前PC将要执行的下一条指令地址。

在stm32f4xx_it.c中,添加软件断点,一旦调试时出现Hard Fault则会在停在__breakpoint(0)处。
void HardFault_Handler(void)  

{  

   

  if (CoreDebug->DHCSR & 1) {  //check C_DEBUGEN == 1 -> Debugger Connected  

      __breakpoint(0);  // halt program execution here         

  }  

  while (1)  

  {  

  }  

}  

DEBUG如下图

SP值为0x20008560,查看堆栈里面的值依次为R0~R3、R12、Return address、PSR、LR, 例如R0(1027 00 00), 显然堆栈后第21个字节到24字节即为Returnaddress,该地址0x0801C907即为异常前PC将要执行的下一条指令地址。

stm32 <wbr>HardFault_Handler调试及问题查找方法

当进入HardFault断点后,菜单栏Peripherals >Core Peripherals >FaultReports打开异常发生的报告,查看发生异常的原因。

stm32 <wbr>HardFault_Handler调试及问题查找方法

stm32 <wbr>HardFault_Handler调试及问题查找方法

上面的报告发生了BUS FAULT,并将Fault的中断服务转向Hard Fault。


相对于检测发生了什么异常,定位异常发生位置显得更重要。
(1)打开Call Stack窗口(如下图左侧,断点停在Hard Fault服务程序中)

stm32 <wbr>HardFault_Handler调试及问题查找方法


(2)在Call Stack的HardFault_Handler上右键Show CallerCode(有的Keil版本也可以直接双击)

stm32 <wbr>HardFault_Handler调试及问题查找方法


这时将跳转到发生异常的源代码位置(如上图),异常发生在p->hour=0这一行。这里错误很明显:指针p尚未为成员变量分配内存空间,直接访问未分配的内粗空间肯定出错。

再说明2点:
[1] 在复杂的情况下,即使定位了异常发生位置也很难容易的改正错误,要学会使用Watch窗口对发生错误的指针变量进行跟踪;
[2]在问题不明晰的情况下,尝试分析反汇编代码,就自己遇到的,部分情况下的异常发生在BL等跳转指令处,BL跳转到了不合法的内存地址产生异常


关键字:stm32  调试  查找方法 引用地址:stm32 HardFault_Handler调试及问题查找方法

上一篇:使用STM32F4的CCM内存
下一篇:STM32一种从用户代码调用系统存储器中Bootloader 的方法

推荐阅读最新更新时间:2024-03-16 15:43

stm32的DMA空闲中断数据配置
对于串口2的示例: void USART2_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; DMA_InitTypeDef DMA_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_AHBPeriphClockCmd(
[单片机]
飞思卡尔单片机(MC9S12xs128)TBDML调试
飞思卡尔单片机用TBDML调试时,联系不到目标板:There is currently no communication with the hardware.Please try to connect before loading an executable file. 驱动也安装完成了(JB16-JM** USBDM(OSBDM mode)),问题原因:安装路径 步骤一: 步骤二: 步骤三:打开调试工具调试后问题解决。 可能问题太幼稚了,大神门都不搭理这种小儿科的问题,我自己只能憋屈了一晚上,今早刚弄出来,刚开始就这么坎坷,有意思。开始我的编程之路了,O(∩_∩)O哈哈~。希望对大家有用,特此呈现,诚惶诚恐。
[单片机]
飞思卡尔单片机(MC9S12xs128)TBDML<font color='red'>调试</font>
STM32学习之通用定时器的使用
简介:STM32一共有8个通用16位Timer,其中TIMER1和TIMER8是高级定时器,其它的TIMER2~TIMER7是普通定时器。此外还有一个Systick(系统滴答定时器),这个定时器通常在操作系统中作为系统的任务切换周期。还有一个RTC,是一个毫秒定时器,支持秒级中断,用来做实时时钟计数器。看门狗定时器 也可以算一个。 8个定时器中,Timer1 和Timer8是由APB2(输出最高频率为72MHZ)预分频后,再通过一个倍频器得到时钟频率,最高为72MHz。Timer2~Timer7则是由APB1(输出最高频率为36MHZ)预分频后,再通过一个倍频器得到时钟频率,最高为36MHz。 1、如何进行程序编写 这
[单片机]
<font color='red'>STM32</font>学习之通用定时器的使用
STM32 的timers中断处理 两种方式
在固件库函数里面,用来读取中断状态寄存器的值判断中断类型的函数是: ITStatusTIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t) 该函数的作用是,判断定时器TIMx的中断类型TIM_IT是否发生中断。比如,我们要判断定时器3是否发生更新(溢出)中断,方法为: if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){} 固件库中清除中断标志位的函数是: voidTIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT) 该函数的作用是,清除定时器TIMx的中断TIM_IT标志位。
[单片机]
STM32入门开发: 介绍IIC总线、读写AT24C02(EEPROM)(采用模拟时序)
一、环境介绍 编程软件: keil5 操作系统: win10 MCU型号: STM32F103ZET6 STM32编程方式: 寄存器开发 (方便程序移植到其他单片机) IIC总线: STM32本身支持IIC硬件时序的,本文采用的是模拟时序,下篇文章就介绍配置STM32的IIC硬件时序读写AT24C02和AT24C08。 模拟时序更加方便移植到其他单片机,通用性更高,不分MCU;硬件时序效率更高,单每个MCU配置方法不同,依赖硬件本身支持。 目前器件: 采用AT24C02 EEPROM存储芯片 完整的工程源码下载地址,下载即可编译运行测试(包含了模拟IIC时序、STM32硬件IIC时序分别驱动AT24C0
[单片机]
<font color='red'>STM32</font>入门开发: 介绍IIC总线、读写AT24C02(EEPROM)(采用模拟时序)
学习STM32(2)-IO-AFIO(复用功能IO和调试配置)
最近在学习STM32,在BZ上一篇关于的串口通信文章里有这么一段代码:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE); 当初是参考开发的里子写的一直对GPIOD或上 RCC_APB2Periph_AFIO 这句话的意思没搞懂,通过这几天在网上查找资料和看手册,终于高清楚了,不敢独享,希望能对跟我一样的新手有所帮助吧o( _ )o... STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特
[单片机]
学习<font color='red'>STM32</font>(2)-IO-AFIO(复用功能IO和<font color='red'>调试</font>配置)
[Linux 底层]U-boot调试命令使用技巧
如果在uboot阶段调试驱动,可以充分利用uboot已有的资源,这样比较方便,也能加速开发的速度,站在巨人的肩膀上做事,才能事半功倍。 1、uboot提供了操作命令覆盖了 2、Nand Flash的操作,读写,擦除,以及状态打印; 3、DDR的操作,内存字节打印; 4、网络的操作,ping命令,ftp下载功能,命令码详见,《 U-boot烧录脚本介绍SecureCRT》 = ping 192.168.2.108 5、MAC控制器的操作,MII 可以读取MAC控制器的数据,和改变MAC控制的数据; //双网卡,激活当前网卡设置 ethprime=ethernet@f0028000,当前网卡 = seten
[单片机]
STM32单片机I/O的工作模式
最近有个朋友在设计低功耗设备,用的是STM32的主控,他知道我做过很多类似的超低功耗项目,于是向我咨询了一些问题,其中就包括I/O口的几种工作模式。今天我就详细的来总结一下这几种工作模式,让大家在以后的设计中知其然也知其所以然。 先说说GPIO 在聊这8种工作模式之前,我想先说一下GPIO的概念—通用输入输出GeneralPurposeInputOutput简称GPIO,就是芯片引脚可以通过它们输出高、低电平,也可以通过他们输入、读取引脚的电压、电平状态。 下面的8种工作模式我将围绕下图进行分析介绍,读懂这一张图大家基本就可以完全理解STM32的GPIO了。希望大家仔细的看一看。 四种不同的输出模式 推挽输出:该模式下引脚
[单片机]
<font color='red'>STM32</font>单片机I/O的工作模式
热门资源推荐
热门放大器推荐
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved