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.pswp.cn/web/10715.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10715.shtml
英文地址,請注明出處:http://en.pswp.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;并初始化…