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();
}

HardFault_Handler问题查找方法相关推荐

  1. Go语言中字符串的查找方法小结

    这篇文章主要介绍了Go语言中字符串的查找方法小结,示例的main函数都是导入strings包然后使用其中的方法,需要的朋友可以参考下 1.func Contains(s, substr string) ...

  2. 基于bs4库的HTML内容查找方法

    一.信息提取实例 提取HTML中所有的URL链接 思路:1)搜索到所有的<a>标签 2)解析<a>标签格式,提取href后的链接内容 >>> import r ...

  3. 父类可以调用子类的方法吗_python类的继承、多继承及查找方法顺序

    讲解类的继承,先用无__init__()方法的类讲解,会更容易理解 分三部分讲解 1.单继承(无__init__()方法) 继承方式:子类(父类): 方法重写:防止执行父类的方法.不想继承父类的某个方 ...

  4. spring aop示例_Spring查找方法示例

    spring aop示例 当一个bean依赖于另一个bean时,我们使用setter属性或通过构造函数注入bean. getter方法将向我们返回已设置的引用,但是假设您每次调用getter方法时都想 ...

  5. Spring查找方法示例

    当一个bean依赖于另一个bean时,我们使用setter属性或通过构造函数注入bean. getter方法将向我们返回已设置的引用,但是假设您每次调用getter方法时都想要一个依赖bean的新实例 ...

  6. python list方法说明_对python中list的五种查找方法说明

    Python中是有查找功能的,五种方式:in.not in.count.index,find 前两种方法是保留字,后两种方式是列表的方法. 下面以a_list = ['a','b','c','hell ...

  7. java 基于类路径搜索_一种基于ClassLoader的自定义类查找方法与流程

    本发明涉及IT技术领域,特别是指一种基于ClassLoader的自定义类查找方法. 背景技术: 随着信息系统的复杂性日益增大,使用反射机制设计的系统越来越多.根据不同的业务需要通过反射去获得相应的处理 ...

  8. jQuery学习(十二)—jQuery中对象的查找方法总结

    jQuery学习(十二)-jQuery中对象的查找方法总结 一.find方法 作用:在元素1中查找元素2,类似于选择器中的后代选择器 格式:元素1.find(元素2),元素2为CSS选择器或者jQue ...

  9. python list find函数_对python中list的五种查找方法说明

    Python中是有查找功能的,五种方式:in.not in.count.index,find 前两种方法是保留字,后两种方式是列表的方法. 下面以a_list = ['a','b','c','hell ...

最新文章

  1. nuxt 头部引入js文件 第一次进入页面不加载js文件的解决方法
  2. RocketMQ-初体验RocketMQ(05)_RocketMQ架构解读
  3. VTK:可视化之ElevationBandsWithGlyphs
  4. akka_Akka的字数统计MapReduce
  5. 百度DuerOS与高通合推手机语音交互解决方案,谁会欢喜谁要愁?
  6. 猝不及防,iOS9.3测试版已经遭到越狱?
  7. hadoop使用mapreduce统计词频_Hadoop自带WordCount进行词频统计(mapreduce)
  8. linux下离线安装gcc详细教程
  9. 实验六 教务管理数据库的设计
  10. 最详细的 UART协议 分析在这里!
  11. 每天学点统计学——指数
  12. 4.29 笔记+day7作业
  13. 苹果在研发屏下 Face ID 和 Touch ID该技术可能最终不会商用
  14. 农场周围的道路c语言编程,[蓝桥杯][2013年第四届真题]农场阳光 (C语言)
  15. 我们距离实现通用人工智能还有多远?
  16. 看完小i机器人诉苹果,惊呼这也行?
  17. 查询出部门名称、部门的员工数、部门的平均工资、部门的最低收入雇员姓名和最高收入雇员的姓名...
  18. c++中“ error C2953: “XXXXx”: 类模板已经定义”的另类方式错误
  19. 分表添加字段,添加注释,存储过程及游标
  20. eos bp节点 超级节点搭建

热门文章

  1. linux 运行 chom,Hadoop安装-单节点/伪分布(2.7.3)
  2. oracle 会话 lock,相克军_Oracle体系_随堂笔记014-锁 latch,lock
  3. 控制usb扫码枪_无线也可以很牢靠-世达SATA热熔胶枪评测
  4. python选择排序从大到小_Python实现选择排序
  5. java)_Java NIO系列教程(一) Java NIO 概述
  6. tableau获取筛选器值_认识Tableau中的筛选器
  7. 简单人物画像_你真的理解用户画像吗?| 船说
  8. Wordpress基础:精简头部wp_head
  9. ActiveX控件打包成Cab置于网页中自动下载安装
  10. 《言简意赅之Linux设备驱动编程》 前言