EXTI прерывание STM32 ошибка HardFault_Handler

#c #stm32 #interrupt #firmware

Вопрос:

Предпосылка
Я использую STM32G071KBU .. Я хочу использовать pin — код с аппаратными прерываниями для анализа быстрого импульса.

Для своих тестов я подключил кнопку, которая при нажатии соединяет вывод с VCC, и настроил GPIO в раскрывающемся меню с «Режимом GPIO» в «Режиме внешнего прерывания с обнаружением триггера с падающим краем» и сохранил уровень приоритета на 0.

тест
В основном я обмениваюсь статусом светодиода при перехвате события кнопки ….

проблема
Когда я нажимаю кнопку 1 раз из 10, есть вероятность, что программа перейдет в HardFault_Handler.

EXTI2_3_IRQHandler : управление прерываниями

 /**
  * @brief This function handles EXTI line 2 and line 3 interrupts.
  */
void EXTI2_3_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI2_3_IRQn 0 */

  /* USER CODE END EXTI2_3_IRQn 0 */
  if (LL_EXTI_IsActiveFallingFlag_0_31(LL_EXTI_LINE_2) != RESET)
  {
    LL_EXTI_ClearFallingFlag_0_31(LL_EXTI_LINE_2);
    /* USER CODE BEGIN LL_EXTI_LINE_2_FALLING */
    m_led_status  ;
  }
  /* USER CODE BEGIN EXTI2_3_IRQn 1 */
  /* USER CODE END EXTI2_3_IRQn 1 */
}
 

НАСТРОЙКА GPIO

 void MX_GPIO_Init(void)
{    
  LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);
  LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);

  /**/
  LL_GPIO_ResetOutputPin(LED1_GPIO_Port, LED1_Pin);

  /**/
  LL_EXTI_SetEXTISource(LL_EXTI_CONFIG_PORTB, LL_EXTI_CONFIG_LINE2);

  /**/
  EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_2;
  EXTI_InitStruct.LineCommand = ENABLE;
  EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
  EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_FALLING;
  LL_EXTI_Init(amp;EXTI_InitStruct);

  /**/
  LL_GPIO_SetPinPull(BUTTON_GPIO_Port, BUTTON_Pin, LL_GPIO_PULL_DOWN);

  /**/
  LL_GPIO_SetPinMode(BUTTON_GPIO_Port, BUTTON_Pin, LL_GPIO_MODE_INPUT);

  /**/
  GPIO_InitStruct.Pin = LED1_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  LL_GPIO_Init(LED1_GPIO_Port, amp;GPIO_InitStruct);

  /* EXTI interrupt init*/
  NVIC_SetPriority(EXTI2_3_IRQn, 0);
  NVIC_EnableIRQ(EXTI2_3_IRQn);

}
 

главное управление

 // GENERAL MACRO
#define GPIO_PIN_SET(a,b)       (((GPIO_TypeDef*)(a))->BSRR = b)
#define GPIO_PIN_CLR(a,b)       (((GPIO_TypeDef*)(a))->BRR = b)
#define LED1_L()                GPIO_PIN_SET(LED1_GPIO_Port, LED1_Pin)
#define LED1_H()                GPIO_PIN_CLR(LED1_GPIO_Port, LED1_Pin)

volatile static uint8_t m_led_status;

void app_main_loop(void) {

    if (m_led_status amp; 0x01) {
        LED1_H();
    } else {
        LED1_L();
    }
}

int main(void)
{
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);   
  LL_SYSCFG_DisableDBATT(LL_SYSCFG_UCPD1_STROBE);
  SystemClock_Config();
  MX_GPIO_Init();

  while (1)
  {
    app_main_loop();
  }
}
 

Я пробовал использовать библиотеки LL и HAL !!
Спасибо за чтение.

Комментарии:

1. Вы задавали этот же вопрос час или около того назад? Я помню, что видел точно такое же название раньше. Если это так, пожалуйста, не повторяйте один и тот же вопрос снова, отредактируйте вопрос, который у вас есть, чтобы улучшить его.

2. Старый пост был удален администрацией, я не смог его улучшить

3. Довольно сложно отладить жесткую ошибку, посмотрев на исходный код. Хорошо, довольно сложно отладить жесткую ошибку вообще 🙂 Возможно, некоторые из приведенных здесь предложений помогут вам? interrupt.memfault.com/blog/cortex-m-fault-debug