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();
}
在此設置斷點,可以返回到出錯位置。