1. 程式人生 > >HardFault_Handler問題查詢方法

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  版權宣告:本文為博主原創文章,轉載請附上博文連結!