HardFault_Handler問題查詢方法
STM32出現HardFault_Handler故障的原因主要有兩個方面:
1、記憶體溢位或者訪問越界。這個需要自己寫程式的時候規範程式碼,遇到了需要慢慢排查。
2、堆疊溢位。增加堆疊的大小。
出現問題時排查的方法:
發生異常之後可首先檢視LR暫存器中的值,確定當前使用堆疊為MSP或PSP,然後找到相應堆疊的指標,並在記憶體中檢視相應堆疊裡的內容。由於異常發生時,核心將R0~R3、R12、LR、PC、XPRS 暫存器依次入棧,其中LR即為發生異常前PC將要執行的下一條指令地址。
注意:暫存器均是32位,且STM32是小端模式。(參考Cortex-M3權威)
編寫問題程式碼如下:
void StackFlow(void) { int a[3],i; for(i=0; i<10000; i++) { a[i]=1; } }
void SystemInit(void) { /* Reset the RCC clock configuration to the default reset state ------------*/ /* Set HSION bit */ RCC->CR |= (uint32_t)0x00000001;
/* Reset CFGR register */ RCC->CFGR = 0x00000000;
/* Reset HSEON, CSSON and PLLON bits */ RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset PLLCFGR register */ RCC->PLLCFGR = 0x24003010; StackFlow();
/* Reset HSEBYP bit */ RCC->CR &= (uint32_t)0xFFFBFFFF;
。。。。。。。。。。。。。。
}
DEBUG如下圖
SP值為0x20008560,檢視堆疊裡面的值依次為R0~R3、R12、LR、PC、XPRS, 例如R0(10 27 00 00), 顯然堆疊後第21個位元組到24位元組即為LR,該地址0x08001FFD即為異常前PC將要執行的下一條指令地址(即StackFlow()後面的語句處 RCC->CR &= (uint32_t)0xFFFBFFFF)
另一種方法:
預設的HardFault_Handler處理方法不是B .這樣的死迴圈麼?樓主將它改成BX LR直接返回的形式。然後在這條語句打個斷點,一旦在斷點中停下來,說明出錯了,然後再返回,就可以返回到出錯的位置的下一條語句那兒
__asm void wait() { BX lr }
void HardFault_Handler(void) { /* Go to infinite loop when Hard Fault exception occurs */ wait(); } --------------------- 作者:zyboy2000 來源:CSDN 原文:https://blog.csdn.net/zyboy2000/article/details/7668331?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!