STM32F4(KEIL) HardFault_Handler()調試方法


STM32F4, ARM Cortex-M4處理器。

問題:STM32F4板子仿真時,進入硬件異常中斷處理函數HardFault_Handler(),如何調試?

HardFault_Handler()可能原因

1) 內存溢出或訪問越界

2) 堆棧溢出

關於調試方法,以下基於一個例子說明。

1)查看異常寄存器:Peripherals>>Core Peripherals>>Fault Reports

關鍵寄存器:R15(PC),記錄被異常中斷打斷前正在執行的指令地址。

Hard Faults:硬件錯誤。

FORCED置位:上訪引起。表示產生了其他類型的異常,但由於某些原因導致無法處理異常,升級為硬件錯誤異常。其真實原因參考其他錯誤狀態。

此處,Bus Faults:總線錯誤。

PRECISERR置位:發生一個數據總線錯誤,PC值指向引起錯誤的指令。

BFARVALID置位:BFAR中保留一個有效故障地址。

2)查看寄存器:

view>>registers window

查看寄存器R14(LR)的值。如果是0XFFFFFFF9,使用的是MSP,中斷返回用戶程序。如果是0XFFFFFFFD,使用的是PSP,中斷返回用戶程序。如果是0XFFFFFFF1,使用MSP,從中斷返回另一個中斷。此處使用的是PSP。

(MSP:主堆棧指針;PSP:進程堆棧指針。)

3)在內存中查看PSP的值。

view>>memory windows>>memory 1

 

從堆棧地址開始的8個32位數值,依次是:R0, R1, R2, R3, R12, R14(LR), R15(PC), XPSR。

此處R15(PC)=0X0804EC90,在此地址基礎上,偶數對齊,並向上減去8字節,=0X804EC88。

KEIL中調出show code at address窗口。

view>>disassembly window

空白處點右鍵,選擇show disassembly at address...

輸入地址0X804EC88,可定位到可能出問題的代碼。

4)另一種測試方法

__asm void wait()
{
      BX lr
}

 void HardFault_Handler(void)
{
       wait();
}

在此設置斷點,可以返回到出錯位置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM