STM32开发学习——使用 Cortex-M3M4M7 故障异常原因与定位

STM32开发学习——使用 Cortex-M3/M4/M7 故障异常原因与定位

文章目录

  • STM32开发学习——使用 Cortex-M3/M4/M7 故障异常原因与定位
    • 文档说明:
    • 官方参考文档线上链接(可在线阅读与下载):
    • 故障异常处理程序
    • HardFault
    • 优先级升级说明
    • 故障状态寄存器
      • 硬故障状态寄存器 (HFSR)
      • UsageFault 状态寄存器 (UFSR)
      • 总线故障状态寄存器 (BFSR) 和总线故障地址寄存器 (BFAR)
      • MemManage 故障状态寄存器 (MMFSR) 和 MemManage 故障地址寄存器 (MMFAR)
      • 堆栈恢复
      • CPU 寄存器恢复

文档说明:

分享一下在Stm32学习过程收集到的一些值得记录的好资料,以便自己保留印象和尽可能的应用到工作中,达到事半功倍的效果。

这是一篇关于Cortex-M内核故障异常原因的说明与定位的分享。

官方参考文档线上链接(可在线阅读与下载):

  • MDK:AN209

  • SEGGER:AN00016_AnalyzingHardFaultsOnCortexM

  • Cortex-M故障 - SEGGER Wiki

故障异常处理程序


  • HardFault:是默认异常,检测指令获取、数据读/写、中断向量获取和中断(进入/退出)的寄存器堆叠(保存/恢复)时的内存访问错误。

    HardFault 的固定优先级为 -1,即它比除 NMI 之外的所有其他中断和异常具有更高的优先级。 因此,当应用程序代码中发生错误、中断或其他异常时,始终可以输入 HardFault 异常处理程序。 HardFault 是 IRQ 编号为 -13 的向量表中的异常编号 3。

  • MemManage:检测内存管理单元 (MPU) 中定义的区域的内存访问冲突;例如,从仅具有读/写访问权限的内存区域执行代码。

    MemManage 是向量表中的异常编号 4,IRQ 编号 -12,具有可配置的优先级。

  • BusFault:检测指令获取、数据读/写、中断向量获取和中断(进入/退出)寄存器堆叠(保存/恢复)时的内存访问错误。

    BusFault 是向量表中的异常编号 5,IRQ 编号为 -11,具有可配置的优先级。 可以在系统控制块 (SCB) 中显式启用总线故障。当未启用 BusFault 时,将引发 HardFault

  • UsageFault:检测未定义指令的执行,加载/存储多个的未对齐内存访问。启用后,将检测到除以零和其他未对齐的内存访问。

    UsageFault 是向量表中的异常编号 6,IRQ 编号为 -10,并且具有可配置的优先级。 如果未启用 UsageFault,则会引发 HardFault。


HardFault

HardFault 异常始终处于启用状态,并具有固定的优先级(高于其他中断和异常,但低于不可屏蔽中断 NMI)。因此,在禁用故障异常或在执行故障异常处理程序期间发生故障时,将执行 HardFault 异常。所有其他故障异常(MemManage 故障BusFault UsageFault)都具有可编程的优先级。复位后,这些异常将被禁用,并且可以使用系统控制块 (SCB) 中的寄存器在系统或应用软件中启用。

优先级升级说明

通常,异常优先级与异常掩码寄存器的值一起确定处理器是否进入错误处理程序,以及错误处理程序是否可以抢占另一个错误处理程序。在某些情况下,具有可配置优先级的故障被视为 HardFault。这称为优先级升级,故障被描述为升级为 HardFault。在以下情况下,将升级到 HardFault:

  • 故障处理程序导致的故障类型与它所处理的故障类型相同。之所以发生这种向 HardFault 升级的原因是处理程序无法抢占自身(它必须具有与当前优先级相同的优先级)。
  • 故障处理程序导致的故障优先级与其所处理的故障相同或更低。这是因为新错误的处理程序无法抢占当前正在执行的错误处理程序。
  • 异常处理程序会导致优先级等于或低于当前正在执行的异常的错误。
  • 发生故障,但未启用该故障的处理程序。

故障状态寄存器

硬故障状态寄存器 (HFSR)

HFSR 位于 SCB 的地址 0xE000ED2C。 它是一个 32 位寄存器。

[31] DEBUGEVT - Reserved for use by debugger/debug probe. Always write 0.
[30] FORCED   - If 1, HardFault has been caused by escalation of another exception, because it is disabled or because of priority.
[1]  VECTTBL  - If 1, a BusFault occurred by reading the vector table for exception processing.

UsageFault 状态寄存器 (UFSR)

UFSR 是一个 16 位伪寄存器,是地址 0xE000ED28 处可配置故障状态寄存器 (CFSR) 的一部分。 它也可以直接访问,半字访问0xE000ED2A

[9] DIVBYZERO  - If 1, SDIV or UDIV instruction executed with divisor 0.
[8] UNALIGNED  - If 1, LDM, STM, LDRD, STRD on unaligned address executed, or single load or store executed when enabled to trap.
[3] NOCP       - If 1, access to unsupported (e.g. not available or not enabled) coprocessor.
[2] INVPC      - If 1, illegal or invalid EXC_RETURN value load to PC.
[1] INVSTATE   - If 1, execution in invalid state. E.g. Thumb bit not set in EPSR, or invalid IT state in EPSR.
[0] UNDEFINSTR - If 1, execution of undefined instruction.

总线故障状态寄存器 (BFSR) 和总线故障地址寄存器 (BFAR)

BFSR 是 CFSR 中的 8 位伪寄存器。它可以通过字节访问地址0xE000ED29直接访问。 BFAR 是一个 32 位寄存器,0xE000ED38

[7] BFARVALID   - If 1, the BFAR contains the address which caused the BusFault.
[5] LSPERR      - 1f 1, fault during floating-point lazy stack preservation.
[4] STKERR      - If 1, fault on stacking for exception entry.
[3] UNSTKERR    - If 1, fault on unstacking on exception return.
[2] IMPRECISERR - If 1, return address is not related to fault, e.g. fault caused before.
[1] PRECISERR   - If 1, return address instruction caused the fault.
[0] IBUSERR     - If 1, fault on instruction fetch.

MemManage 故障状态寄存器 (MMFSR) 和 MemManage 故障地址寄存器 (MMFAR)

MMFSR 是 CFSR 中的 8 位伪寄存器。它可以通过字节访问地址xE000ED28直接访问。 MMFAR 是一个 32 位寄存器,xE000ED34

[7] MMARVALID - If 1, the MMFAR contains the address which caused the MemManageFault.
[5] MLSPERR   - 1f 1, fault during floating-point lazy stack preservation.
[4] MSTKERR   - If 1, fault on stacking for exception entry.
[3] MUNSTKERR - If 1, fault on unstacking on exception return.
[1] DACCVIOL  - If 1, data access violation.
[0] IACCVIOL  - If 1, instruction access violation.

堆栈恢复

在异常输入时,异常处理程序可以检查故障发生时使用了哪个堆栈。 当设置位 EXC_RETURN[2] 时,已使用 MSP,否则已使用 PSP。

堆栈可用于恢复 CPU 寄存器值。

CPU 寄存器恢复

在异常输入时,一些 CPU 寄存器存储在堆栈中,可以从那里读取以进行错误分析。 以下寄存器是可恢复的:

 r0       = pStack[0];  // Register R0r1       = pStack[1];  // Register R1r2       = pStack[2];  // Register R2r3       = pStack[3];  // Register R3r12      = pStack[4];  // Register R12lr       = pStack[5];  // Link register LRpc       = pStack[6];  // Program counter PCpsr.byte = pStack[7];  // Program status word PSR

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java项目之相亲网站的设计与实现源码(springboot+mysql+vue)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的相亲网站的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 相亲网站的设计与实…

连升三级!openGauss单机版从2.1.0经停3.0.0升级至5.0.0

前言 如前文所述,我们的小demo项目起初安装了openGauss的2.1.0版本,由于2.1.0不是长期维护(LTS)版本,所以要升级到5.0.0LTS。考虑到虽然是DEMO项目,但也有些体验用户,所以为了保障业务连续性&a…

2023版brupsuite专业破解安装

安装教程,分两部分: 1、安装java环境、参考链接JAVA安装配置----最详细的教程(测试木头人)_java安装教程详细-CSDN博客 2、安装2023.4版本brupsuite:参考链接 2023最新版—Brup_Suite安装配置----最详细的教程&…

Java---类和对象第一节

目录 1.面向对象初步认识 1.1什么是面向对象 1.2面向对象和面向过程的区别 2.类的定义和使用 2.1简单认识类 2.2类的定义格式 2.3类的实例化 2.4类和对象的说明 3.this关键字 3.1访问本类成员变量 3.2调用构造方法初始化成员变量 3.3this引用的特性 4.对象的构造以…

一文弄懂 Linux 系统调用函数之 exec 函数族

目录 简介函数原型参数说明返回值函数区别使用示例采用参数列表传递参数,以 execl 为例采用参数数组传递参数,以 execv 为例调用 PATH 下可执行文件,以 execlp 为例使用新的环境变量给新进程,以 execle 为例 更多内容 简介 exec …

【Java】/*方法的使用-快速总结*/

目录 一、什么是方法 二、方法的定义 三、实参和形参的关系 四、方法重载 五、方法签名 一、什么是方法 Java中的方法可以理解为C语言中的函数,只是换了个名称而已。 二、方法的定义 1. 语法格式: public static 返回类型 方法名 (形参列表) { //方…

windows server 2019 安装 docker环境

一、根据官方说明进行安装 , 看起来过程相当简单, 但问题还是有的 准备 Windows 操作系统容器 | Microsoft Learn // 一个 powershell 脚本,该脚本配置环境以启用与容器相关的 OS 功能并安装 Docker 运行时。 Invoke-WebRequest -UseBasicParsing "https://r…

【Docker】Ubuntu下Docker的基本使用方法与常用命令总结

【Docker】docker的基本使用方法 镜像image与容器container的关系基本命令- 查看 Docker 版本- 拉取镜像- 查看系统中的镜像- 删除某个镜像- 列出当前 Docker 主机上的所有容器,包括正在运行的、暂停的、已停止的,以及未运行的容器- 列出当前 Docker 主机…

【信息系统项目管理师知识点速记】沟通管理:管理沟通

管理沟通是确保项目信息流通顺畅的关键流程,涉及到信息的收集、生成、传播、存档、检索、监管及最终处理,以促进项目团队与利益相关者的有效互动。这一过程不仅关乎信息的发布,更侧重于信息的恰当格式与精准送达,同时鼓励利益相关者的积极参与,包括信息补充、澄清和讨论。…

《二十一》QT QML编程基础

QML概述 QML(Qt Meta-Object Language)是一种声明性语言,它被用于描述Qt框架中用户界面的结构和行为。QML提供了一种简洁、灵活的方式来创建动态和交互式的界面。 QML基于JavaScript语法,通过使用QML类型和属性来定义界面的元素…

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (三)

基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 大家继续看 https://lilianweng.github.io/posts/2023-06-23-agent/的文档内容 第二部分:内存 记忆的类型 记忆可以定义为用于获取、存储、保留以及随后检索信息的过程。人脑中有多…

Mac 使用:Micosoft Remote Desktop 远程优化

Micosoft Remote Desktop远程优化 服务器 远程会话环境设置 WinR打开运行,输入gpedit.msc 找到计算机配置->管理模板->Windows组件->远程桌面服务->远程桌面会话主机->远程会话环境。下面这几个打开,有效提高rdp性能。 rdp协议同时使用…

自动驾驶---Behavior Planning之EUDM

1 背景 在前面的博客中,为读者朋友们阐述了自动驾驶Planning模块基于MCTS行为规划的文章《自动驾驶---Behavior Planning之MCTS》,博客中引用的论文的主要思想是以蒙特卡洛树来实现行为规划。今天,我们继续探寻另一种行为规划的策略,主角依然是香港科技大学。 熟悉的读者大…

vim 文件内容替换 cat 合并文件

vim 文件内容替换 第一步:首先要进入末行模式(在命令模式下输入冒号:) 第二步:根据需求替换内容 ① 只替换光标所在这一行的第一个满足条件的结果(只能替换1次) :s/要替换的关键词/替换后的关键词 回…

计数排序,基数排序,桶排序

目录 计数排序: 基数排序: 桶排序: 计数排序: 计数排序是一种非比较型整数排序算法,特别适用于一定范围内的整数排序。它的核心思想是使用一个额外的数组(称为计数数组)来计算每个值的出现次数,然后根据这些计数信…

C语言中错误处理的基本实现

引入头文件依赖&#xff1a; 标准输入输出流&#xff1a;#include <stdio.h>获取错误信息&#xff1a;#include <string.h>&#xff0c;strerror通过这个头文件获取文件流&#xff1a;#include <stdlib.h>&#xff0c;fprintf通过这个头文件获取错误编号&…

hadoop生态圈集群搭建(持续更新240512)

Hadoop生态圈 Linux1.修改ip地址2.重启network服务3.安装插件4.关闭防火墙5.创建用户6.创建目录7.修改目录的所属主和所属组为lxy8.修改主机名:hadoop102 (注意名字后面不要加空格)9.修改hosts文件10.等插件都装完后再重启Linux11.把xshell的登录用户换成lxy &#xff08;注意&…

【TC3xx芯片】TC3xx芯片时钟监控

目录 前言 正文 1.时钟监控概念 1.1 时钟监控原理 1.2时钟监控配置寄存器

Node.js 的补充适用场景

Node.js 的适用场景相当广泛&#xff0c;以下再补充一些具体的使用场景&#xff1a; 服务器端应用开发&#xff1a; Node.js特别适合于构建高性能、高并发、低延迟的服务器端程序。它可以用来开发Web服务器、API服务器、实时通讯服务器等。Node.js的高性能和事件驱动的非阻塞I…

day09-常用API异常

1.时间日期类 1.1 Date类&#xff08;应用&#xff09; 计算机中时间原点 1970年1月1日 00:00:00 时间换算单位 1秒 1000毫秒 Date类概述 Date 代表了一个特定的时间&#xff0c;精确到毫秒 Date类构造方法 方法名说明public Date()分配一个 Date对象&#xff0c;并初始化…