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

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

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

出现问题时排查的方法:

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

注意:寄存器均是32位,且STM32是小端模式。(参考Cortex-M3权威)

编写问题代码如下:

void StackFlow(void)
{
 int a[3],i;
 
 for(i=0; i<10000; i++)
 {
  a[i]=1;
 }
}

void SystemInit(void)
{
  /* Reset the RCC clock configuration to the default reset state ------------*/
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

/* Reset CFGR register */
  RCC->CFGR = 0x00000000;

/* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

/* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x24003010;
 
 StackFlow();

/* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

。。。。。。。。。。。。。。

}

DEBUG如下图

SP值为0x20008560,查看堆栈里面的值依次为R0~R3、R12、LR、PC、XPRS, 例如R0(10 27 00 00),  显然堆栈后第21个字节到24字节即为LR,该地址0x08001FFD即为异常前PC将要执行的下一条指令地址(即StackFlow()后面的语句处 RCC->CR &= (uint32_t)0xFFFBFFFF)

另一种方法:

默认的HardFault_Handler处理方法不是B .这样的死循环么?楼主将它改成BX LR直接返回的形式。然后在这条语句打个断点,一旦在断点中停下来,说明出错了,然后再返回,就可以返回到出错的位置的下一条语句那儿

__asm void wait()
{
      BX lr
}

void HardFault_Handler(void)
{
    /* Go to infinite loop when Hard Fault exception occurs */
       wait();
}

STM32如何查找hardfault原因相关推荐

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

    (五)stm32工程代码HardFault异常查错调试方法 参考文章: (1)(五)stm32工程代码HardFault异常查错调试方法 (2)https://www.cnblogs.com/zhan ...

  2. stm32 常见错误及原因【持续更新】

    stm32 开发中,经常会出现一些错误,下面总结一些常见错误及可能原因: 1,Default_Handler 出一这个错误 最常见的原因是 开启了中断,但没有对应的中断响应函数 2,HardFault ...

  3. STM32跳入HardFault Handler中断分析

    为什么80%的码农都做不了架构师?>>>    ARM芯片STM32出现HardFault Handler硬件中断一般有两种情况: 访问越界导致的Acess Violation或者内 ...

  4. 酒店管理系统软件测试找bug,软件测试查找bug原因

    想要修复bug,首先面临找到bug原因的难题,好比一根针掉到地上,怎么找到这根针?这个问题就交给各国大妈去解决了 中国大妈会根据针掉落的方向,落地点等,去确定查找范围,然后目测去寻找到针 德国大妈会把 ...

  5. 利用万用表查找漏电原因

    电器是我们日常生活中不可分割的一部分,形形色色的日用电器,随着时间的增加,部分电器电路零件老化与问题,再加上阴雨潮湿的天气,电器电路难免会出现漏电的状况.漏电问题的原因有很多,经常会报修检查,相信在检 ...

  6. 快速排序为何先要从右向左查找的原因

    假设我们现在对"6 1 2 7 9 3 4 5 10 8"这个10个数进行排序.首先在这个序列中随便找一个数作为基准数.为了方便,就让第一个数6作为基准数吧.接下来,需要将这个序列 ...

  7. stm32怎么查看什么原因引起的nmi_为什么会有口臭,口臭是什么原因引起的,口臭是怎么回事...

    口臭是让人尴尬的问题,严重影响了我们的日常生活,说话总是被嫌弃,不说谈恋爱被嫌弃,工作更是各种不顺,关键是试了各种偏方,却都没用,这才是最让人苦恼的. 一般健康的体质是不会有口臭的,天生自带口臭的很少 ...

  8. Android Studio查找错误原因

    为什么80%的码农都做不了架构师?>>>    gradlew compileDebugSources --stacktrace -info 参考: https://www.cnbl ...

  9. STM32串口通讯数据丢失原因分析及解决办法

    在进行串口通讯实验时,一时不仔细可能会发现通讯不正常,数据丢失的现象,包括丢失第一个字符,或只收到最后一个字符等等,本文接下来将就这类问题展开讨论. 首先是通过MCU向上位机发送数据: 若程序如下图所 ...

最新文章

  1. 【ABAP】SUBMIT程序相互调用
  2. 面向.NET开发人员的Dapr——分布式世界
  3. 11 MM配置-主数据-定义物料类型的编码范围
  4. 蚂蚁金服开源服务注册中心 SOFARegistry
  5. springboot添加ojdbc6报错
  6. labeltool标注工具使用说明
  7. STM32F4 + HAL库 + W25Q256的验证
  8. 【学习总结匈牙利算法到KM算法】
  9. 显著性水平与p值的区别
  10. 计算机键盘怎么输入平方,word里平方2怎么打_在word里输入㎡符号的方法
  11. Python基础 [...,]三点切片
  12. VS2013使用教程总结(1)---忽略安全检查
  13. ArcGIS工具 - 批量删除空图层
  14. scale-free
  15. matlab ax=b x=,matlab 求解 Ax=B 时所用算法
  16. html的音频在线地址,HTML 音频(Audio)
  17. 人工神经网络原理及应用,人工神经网络教程PDF
  18. java 面试题带答案,大量教程
  19. Greenplum集群部署和架构优化,我总结了5000字的心得
  20. DELL PC服务器PowerEdge 管理工具OMSA的使用

热门文章

  1. 不是技术也能看懂搜索引擎
  2. 阿里巴巴P9大佬雷卷与中间件小哥重新定义:高段位程序员的学习之道
  3. Java线程详解(13)-锁
  4. 03.native方法(JNI)
  5. python json库安装_win 安装python的cjson库
  6. 成功解决ModuleNotFoundError: No module named ‘sklearn.lda‘
  7. DL之Panoptic Segmentation:Panoptic Segmentation(全景分割)的简介(论文介绍)、全景分割挑战简介、案例应用等配图集合之详细攻略
  8. DL之CNN优化技术:学习卷积神经网络CNN的优化、实践经验(练习调参)、从代码深刻认知CNN架构之练习技巧
  9. ML之DR之PCA:利用PCA对手写数字图片识别数据集进行降维处理(理解PCA)
  10. BC:带你温习并解读《中国区块链技术和应用发展白皮书》—概述