关于#stm32#的按键中断问题

在是stm32的hal库中定义了一个按键外部中断,可按下后其它程序就不在执行了,定义了一个断点调试,每次按下后都会在这里停下,说明一直处于中断吗?有没有解决方法?
这是中断回调函数,可B1的按键中断是没有问题的

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    for(uint16_t i =0;i<50;i++);
    switch(GPIO_Pin)
    {
        case GPIO_PIN_1:
//           if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==RESET)
//           {
//               for(uint16_t i =0;i<500;i++);
//               while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==RESET);
//               HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);
////               led1_turn();
//           }
           if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==RESET)
           {
               for(uint16_t i =0;i<500;i++);
               while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==RESET);
               HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);
//               led2_turn();
           }
           break;
           case GPIO_PIN_2:
               if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2)==RESET)
           {
               for(uint16_t i =0;i<500;i++);
               while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2)==RESET);
               HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);
               i++;
           }
//               led1_turn();       
           break;
        default:
            return;
       }
}

这里是引脚定义PB1,PA2

  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  GPIO_InitStruct.Pin = GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 1);
  HAL_NVIC_EnableIRQ(EXTI1_IRQn);
   HAL_NVIC_SetPriority(EXTI2_IRQn, 0, 2);
  HAL_NVIC_EnableIRQ(EXTI2_IRQn);

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    问题回答:

    根据你描述的问题,我了解到你遇到了一个按键中断引起程序无响应的问题。你想知道每次按下按键后是否一直处于中断状态,并且想了解解决这个问题的方法。

    首先,我需要看一下你的代码,特别是涉及到中断注册和中断处理的部分。请提供按键中断回调函数的代码,以及相关的中断注册部分的代码。

    根据提供的代码,我看到你定义了两个引脚PB1和PA2。你可以尝试将按键中断引脚连接到PB1或PA2引脚,然后重新测试一下。

    同时,为了确保程序不会一直停在中断状态,你需要在按键中断回调函数中添加一些处理逻辑。你可以在回调函数中添加一段延时代码(例如使用HAL_Delay函数),让回调函数在处理完中断后延时一段时间再返回。这样可以确保程序能够继续执行其他代码。

    以下是对你提供的按键中断回调函数的代码进行修改的示例:

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
      if(GPIO_Pin == B1_Pin)
      {
        // 处理B1按键的中断
        // ...
        HAL_Delay(500); // 延时500毫秒
      }
      else if(GPIO_Pin == PB1_Pin)
      {
        // 处理PB1按键的中断
        // ...
        HAL_Delay(500); // 延时500毫秒
      }
      else if(GPIO_Pin == PA2_Pin)
      {
        // 处理PA2按键的中断
        // ...
        HAL_Delay(500); // 延时500毫秒
      }
    }
    

    这样修改后,当按下任意一个按键之后,回调函数会执行相应的处理逻辑,并在处理完后延时500毫秒,然后再返回。这样保证了程序能够继续执行其他代码。

    希望这些解决方案能帮助到你。如果你还需要提供更多的信息或者有其他问题,请告诉我。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^