文档章节

STM32F4 Hard Fault调试

coreyggj
 coreyggj
发布于 2017/09/07 13:28
字数 625
阅读 44
收藏 1
点赞 0
评论 0

    最近移植一个IAR的UVC工程到STM32F4上进行开发,花费了些时间调试了下一个HardFault问题,在此mark下。

    现象描述

    Reset上电后直接进入HardFault处理函数,无法进入C环境的main函数

    调试过程

  • 捕获异常现场

    进入Keil Debug模式Reset程序,等待程序跑飞后按下Stop,此时程序应该会停在HardFault_Handler函数处。查看硬fault状态寄存器(地址: 0xE000ED2C)确认hard fault类型,如下图,发现BIT30(FORCED)被置位,手册指示此hard fault是由于上访导致。

    继续查看用法fault状态寄存器(UFSR,地址: 0xE000ED2A),存储器管理fault状态寄存器(MFSR,地址: 0xE000ED28),总线fault状态寄存器(BFSR,地址: 0xE000ED29)确认异常类型,如下图,发现UFSR的BIT3(NOCP)置位,手册解释为 “试图执行协处理器相关指令”,不过貌似还是一头雾水,但至少有点眉目。

  • 寻找异常触发点

    为了找到触发异常的指令,我们先在异常发生前设置断点,然后使能usage fault中断(BIT18,地址:0xE000ED24),点击RUN,等待程序跑飞,然后STOP程序,不出意外的话会发现PC停在UsageFault_Handler(说明我们之前的判断是正确的^_^),查看当前SP的地址,然后根据中断入栈规则去寻找中断前的PC值。我这边的SP是0x20003600,那么我们就到该地址去寻找PC值吧。

可以获取到触发异常的指令位置在0x80032C4, 异常处理的返回地址在0x800024B,下图红色标记处LR的入栈位置,PC比其先入栈。

通过反汇编窗口发现是由于VMSR这条指令导致,单步调试下可以发现这条指令在_fp_init中 

现在可以确认是FPU指令导致的Usage Fault上访为Hard Fault

  • 寻找对策

    知道原因后找寻解决方法就比较简单了,FPU指令不可用应该就是FPU相关的有效位没使能导致的,在SystemInit中追加FPU的初始化操作即可。在最新的CMSIS中已经追加,不清楚为什么我用的库里没有,好无奈,又是一坑

void SystemInit(void)
{
  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif
  
.............
}

    这个问题还有一个workaround大家可以试下,就是勾选上" Use MacroLIB ",这是我最开始的对策。

    

© 著作权归作者所有

共有 人打赏支持
coreyggj
粉丝 1
博文 41
码字总数 19193
作品 0
无锡
程序员
TinyCLR的this赋值语句的缘起和解决

//===================================================================== //TITLE: // TinyCLR的this赋值语句的缘起和解决 //AUTHOR: // norains //DATE: // Wednesday 12-January-2011 ......

鉴客 ⋅ 2012/03/09 ⋅ 0

CmBacktrace 0.2.0 发布,ARM Cortex-M MCU 错误追踪库

0、CmBacktrace 是什么 CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: 支持的错...

armink ⋅ 2017/04/21 ⋅ 4

armink/CmBacktrace

CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪库 0、CmBacktrace 是什么 CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错...

armink ⋅ 2017/01/12 ⋅ 0

ARM Cortex-M 系列 MCU 错误追踪库--CmBacktrace

0、CmBacktrace 是什么 CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: 支持的错...

armink ⋅ 2017/04/20 ⋅ 5

STM32系统时钟树分析

下面是一个STM32芯片的时钟树图 1、LSI是低速内部时钟,RC振荡器,频率为32kHz左右。供独立看门狗和自动唤醒单元使用。 2、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。这个主要是RTC...

silent_f ⋅ 2017/05/07 ⋅ 0

【应用笔记】小白也能玩转RT-Thread之 SPI设备

本应用笔记以驱动SPI接口的OLED显示屏为例,说明了如何添加SPI设备驱动框架及底层硬件驱动,使用SPI设备驱动接口开发应用程序。并给出了在正点原子STM32F4探索者开发板上验证的代码示例。 本...

RTThread物联网操作系统 ⋅ 04/13 ⋅ 0

使用GDB调试segment fault

在Linux下编写C/C++程序,经常会遇到segment fault的错误。 segment fault出现有下列原因: + 坏指针错误 :在指针赋值之前就用它来引用内存+ 改写错误 :越过数组边界写入数据,在动态分配的...

兔之 ⋅ 2015/10/10 ⋅ 0

STM32F4Discovery上手

刚入手STM32F4Discovery,迫不及待的开始入门摸索...* 开发环境搭建 我是基于Mac OS X 10.10.4的PC环境 使用brew安装依赖工具 安装st-link git clone https://github.com/texane/stlink.git ...

coreyggj ⋅ 2015/07/02 ⋅ 0

STM32开发 -- STM32初识

一、STM32 32 位 MCU 系列概述 参看:STM32 微控制器 参看:维基百科 – STM32 STM32 系列 32 位闪存微控制器基于 ARM® Cortex® M 处理器。 它提供的 32 位产品系列,具有超高性能、实时功...

qq_29350001 ⋅ 05/19 ⋅ 0

Win7 C#下使用DirectShowLib的问题

使用下载的示例(DxSnap、PlayCap)调试时运行正常,运行时直接停止工作。 描述: Stopped working 问题签名: 问题事件名称: APPCRASH Application Name: PlayCap.exe Application Version: 1...

lujing_j ⋅ 2010/12/21 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 30分钟前 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

C++难点解析之const修饰符

C++难点解析之const修饰符 c++ 相比于其他编程语言,可能是最为难掌握,概念最为复杂的。结合自己平时的C++使用经验,这里将会列举出一些常见的难点并给出相应的解释。 const修饰符 const在c...

jackie8tao ⋅ 昨天 ⋅ 0

聊聊spring cloud netflix的HystrixCommands

序 本文主要研究一下spring cloud netflix的HystrixCommands。 maven <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-clo......

go4it ⋅ 昨天 ⋅ 0

Confluence 6 从其他备份中恢复数据

一般来说,Confluence 数据库可以从 Administration Console 或者 Confluence Setup Wizard 中进行恢复。 如果你在恢复压缩的 XML 备份的时候遇到了问题,你还是可以对整个站点进行恢复的,如...

honeymose ⋅ 昨天 ⋅ 0

myeclipse10 快速搭建spring boot开发环境(入门)

1.创建一个maven的web项目 注意上面标红的部分记得选上 2.创建的maven目录结构,有缺失的目录可以自己建立目录补充 补充后 这时候一个maven的web项目创建完成 3.配置pom.xml配置文件 <proje...

小海bug ⋅ 昨天 ⋅ 0

nginx.conf

=========================================================================== nginx.conf =========================================================================== user nobody; #......

A__17 ⋅ 昨天 ⋅ 0

645. Set Mismatch - LeetCode

Question 645. Set Mismatch Solution 思路: 遍历每个数字,然后将其应该出现的位置上的数字变为其相反数,这样如果我们再变为其相反数之前已经成负数了,说明该数字是重复数,将其将入结果r...

yysue ⋅ 昨天 ⋅ 0

Python这么强?红包杀手、消息撤回也可以无视,手机App辅助!

论述 标题也许有点不好理解,其实就是一款利用Python实现的可以监控微信APP内的红包与消息撤回的助手。不得不说,这确实是一款大家钟意的神器。 消息撤回是一件很让人恶心的事,毕竟人都是有...

Python燕大侠 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部