诞怪 2023-07-17 22:29 采纳率: 0%
浏览 16

关于#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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-18 08:28
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 以下回答来自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毫秒,然后再返回。这样保证了程序能够继续执行其他代码。

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


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

报告相同问题?

问题事件

  • 创建了问题 7月17日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错