STM32에서 Hardfault 만들기

 

우리가 아주 끔찍하게 싫어하는 Hardfault를 임의로 만들어 보겠습니다.

 

아래 코드를 넣으면 PC가 수행할 수 없는 주소로 변경되면서 Hardfault로 Jump 하게됩니다. 

typedef void (*Function_Pointer)(void);
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  /* USER CODE BEGIN 2 */
  Function_Pointer Wrong_Address_Function;
  Wrong_Address_Function = (Function_Pointer)(*(__IO uint32_t *)(0xFF000000));
  Wrong_Address_Function();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 

Wrong_Address_Function을 실행하면 아래처럼 Hardfault Handler로 진입하게 됩니다. 물론 Wrong_Address_Function에 실행될 수 없는 Address를 asign 해주어야 합니다.

Hardfault Handler가 제대로 처리되는지 확인 할 때나 혹은 Hardfault 발생시 언스태킹을 추척하는 공부용으로 사용할 수 있을 거 같습니다.

 

감사합니다.