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

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

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

出现问题时排查的方法:

1、添加软件断点,一旦在调试过程中出现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)
{
}
}

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

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

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

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

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

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

最新文章

  1. oracle 密码有效期
  2. 数据库一些常用的SQL语句
  3. hiveserver2以及beeline客户端的使用
  4. MySql中使用日期函数获取昨天的数据
  5. aspose.word 查找文本并加下划线
  6. 每日一“酷”之Cookie
  7. ubuntu1204上不能正常用emacs配合gocode进行自动补全
  8. (转)Libevent(3)— 基础库
  9. dpkg -P xx
  10. robotframework学习笔记(七)------筛选执行用例
  11. 控件的基本使用-iOS—UI笔记
  12. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第6章编程练习6
  13. Java就业班 mysql02
  14. DOM操作插入新的子节点
  15. Application Initialization UI for IIS 7.5
  16. 关于移动端及flex
  17. Program terminated with signal 6, Aborted,有可能啥原因呢?
  18. C# 类库调试 启动外部程序无法调试
  19. exe4j 安装
  20. js上传文件带参数,并且,返回给前台文件路径,解析上传的xml文件,存储到数据库中

热门文章

  1. 实战Jquery(一)--username校验
  2. 通过特定获取获取电脑外网IP地址
  3. mongoDB DOS窗口显示中文
  4. python单元测试框架 pyunit
  5. Docker Push 镜像到公共仓库
  6. 自定义ListView和GridView
  7. spark standlone 伪分布式安装
  8. php 微信开发之新增上传/获取下载临时素材
  9. linux下apache+php搭建配置记录
  10. Gradle 的配置和引用