stm32 常见错误及原因【持续更新】
生活随笔
收集整理的這篇文章主要介紹了
stm32 常见错误及原因【持续更新】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
stm32 開發中,經常會出現一些錯誤,下面總結一些常見錯誤及可能原因:
1,Default_Handler?
出一這個錯誤 最常見的原因是 開啟了中斷,但沒有對應的中斷響應函數
2,HardFault_Handler,這個錯出現在原因最多,用mdk工具調試時可以通中Peripherals-->Core Peripherals-->Fault Reports 來查看具體的錯誤類型:
其中MemManage fault 狀態寄存器提供的訊息
| 位 | 可能的原因 |
| MSTKERR | 入棧時發生錯誤(異常響應序列開始時) 1) 堆棧指針的值被破壞 2) 堆棧容易過大,已經超出 MPU 允許的 region 范圍 |
| MUNSTKERR | 出棧時發生錯誤(異常響應序列終止時)。入棧時沒有發生錯誤,出棧時卻出 錯,總令人有些匪夷所思,可能的原因是 1. 異常服務例程破壞的堆棧指針 2. MPU 配置被異常服務例程更改 |
| DACCVIOL | 內存訪問保護違例。這是 MPU 發揮作用的體現。常常是用戶應用程序企圖訪 問特權級 region 所致 |
| IACCVIOL | 1. 內存訪問保護違例。常常是用戶應用程序企圖訪問特權級 region。入棧的 PC 給出的地址,就是產生問題代碼之所在 2. 跳轉到不可執行指令的 regions 3. 異常返回時,使用了無效的 EXC_RETURN 值 4. 向量表中有無效的向量。例如,異常在向量建立之前就發生了,或者加載 的是用于傳統 ARM 內核的可執行映像 5. 在異常處理期間,入棧的 PC 值被破壞了 |
總線 fault 狀態寄存器提供的訊息
| 位 | 可能的原因 |
| STKERR | (自動)入棧期間出錯 1. 堆棧指針的值被破壞 2. 堆棧容易太大,到達了未定義存儲器的區域 3. PSP 未經初始化就使用 |
| UNSTKERR | (自動)出棧期間出錯。如果沒有發生過 STKERR,則最可能的就是在異常處 理期間把 SP 的值破壞了 |
| IMPRECISERR | 與設備傳送數據的過程中發生總線錯誤。可能因為設備未經初始化而引起; ? 如,USB未初始化而進行數據傳輸,IWDG未初始化確去喂狗等!! |
| PRECISERR | 在數據訪問期間的總線錯誤。通過 BFAR 可以獲取具體的地址。發生 fault 的 原因同上。 |
| IBUSERR | 同 MemManage fault 中的 IACCVIOL |
用法 fault 狀態寄存器提供的訊息
| 位 | 可能的原因 |
| DIVBYZERO | 當 DIV_0_TRP 置位時發生除數為零。導致此 fault 的指令可以從入棧的 PC 讀 取 |
| UNALIGNED | 當 UNALIGN_TRP 置位時發生未對齊訪問。導致此 fault 的指令可以從入棧的 PC 讀取 |
| NOCP | 企圖執行一個協處理器指令。導致此 fault 的指令可以從入棧的 PC 讀取 |
| INVPC | 1. 異常返回時使用了無效的 EXC_RETURN,例如 1) 當 EXC_RETURN=0xFFFF_FFF1 時卻要返回線程模式 2) 當 EXC_RETURN=0xFFFF_FFF9 時卻要返回 handler 模式 2. 無效的異常活動狀態,例如 1) 當前異常的活動狀態已經清除了,卻在此時執行異常返回。往往是因 為濫用 VECTCLRACTIVE 或清除了 SHCSR 中活動狀態所致 2) 在還有其它異常的活動位置位時,卻要返回線程模式 3. 由于堆棧指針錯誤導致了 IPSR 的值不正確。對于 INVPC fault,入棧的 PC 指出了該 fault 服務例程在何處搶占了其它的代碼。這個問題往往是比較 隱晦的程序錯誤造成的,欲詳細調查該問題的原因,最好使用 ITM 的跟 蹤功能。 4. ICI/IT 位對當前指令無效。當 LDM/STM 指令被異常打斷后,在異常服務 例程中又更改了入棧的 PC。結果在中斷返回時,非零的 ICI 位段作用到了 不使用 ICI 位段的指令上。如果是其它原因破壞了 PSR 的值,也可能導致 此 fault。 |
| INVSTATE | 1. 加載到 PC 中的跳轉地址值是偶數(LSB=0)。通過檢查入棧 PC 的值,一 下子就可以查出該問題。 2. 向量地址的 LSB=0,診斷方法同上。 3. 入棧的 PSR 在異常處理過程中被破壞,使得在返回時內核嘗試進入 ARM 狀態。 |
| UNDEFINSTR | 1. 使用了 CM3 不支持的指令 -- 如M3內核確下載了M4內核的代碼等 2. 代碼段中的數據被破壞 3. 連接時加載了 ARM 目標碼。請檢查編譯階段的設置 4. 指令對齊的問題。例如,在使用 GNU 工具鏈時,忘記了在.ascii 后使 用.align,就有可能導致下一條指令沒有對齊 |
硬 fault 狀態寄存器提供的訊息
| 位 | 可能的原因 |
| DEBUGEVF | 因調試事件導致的 fault 1. 斷點/觀察點事件 2. 如果在硬 fault 服務例程的執行過程中,沒有使能監視器異常(MON_EN=0) 也沒有使能停機調試(C_DEBUGEN=0),卻執行了 BKPT 指令。缺省時,有 些 C 編譯器可能會在半主機代碼中使用 BKPT 指令。 |
| FORCED | 這是 fault“上訪”的情況 1. 試圖在 SVC/監視器服務例程中執行 SVC/BKPT,或者在其它擁有相同或更高 優先級的服務例程中執行 SVC/BKPT。 2. 發生了 fault,但是它的服務例程被除能 3. 發生了 fault,但是當前處理器在響應同級或更高優先級的異常 4. 發生了 fault,但是它被掩蔽了 |
| VECTBL | 取向量失敗, 1. 在取向量過程中發生總線 fault 2. 向量表偏移量設置有誤 |
調試 fault 狀態寄存器提供的訊息
| 位 | 可能的原因 |
| EXTERNAL | EDBGREQ 信號置為有效 |
| VCATCH | 發生了向量抓捕事件 |
| DWTTRAP | 發生了 DWT 觀察點事件 |
| BKPT | 1. 執行了 BKPT 指令 2. FPB 單元產生了斷點事件 |
?
總結
以上是生活随笔為你收集整理的stm32 常见错误及原因【持续更新】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32 电机教程 1 - 用ST M
- 下一篇: STM32 进阶教程 4 - 软件实现