EXTI中断STM32错误HardFault_Handler

问题描述

前提
我正在使用 STM32G071KBU .. 我想使用带有硬件中断的引脚来分析快速脉冲。

对于我的测试,我连接了一个按钮,该按钮在按下时将引脚连接到 VCC,并在“具有下降沿触发检测的外部中断模式”中将 GPIO 配置为“GPIO 模式”,并将优先级保持在0.

测试
在我的主要内容中,当拦截按钮事件时,我会交换 LED 的状态......

问题
当我按 10 次中的 1 次按钮时,程序有可能进入 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(&EXTI_InitStruct);

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

  /**/
  LL_GPIO_SetPinMode(BUTTON_GPIO_Port,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,&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 & 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 库!!
感谢阅读。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)