Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何修复在EXTI9-5上多次触发的中断?_C_Interrupt_Stm32 - Fatal编程技术网

C 如何修复在EXTI9-5上多次触发的中断?

C 如何修复在EXTI9-5上多次触发的中断?,c,interrupt,stm32,C,Interrupt,Stm32,我正在研制STM32F303CC。在这个mcu上,我使用6个按钮作为中断。其中5个按钮连接到EXTI15-10,1个连接到EXTI9-5。EXTI15-10上的按钮工作正常。尽管如此,当我按下EXTI9-5上的按钮时,它会触发难以置信的次数(随机在1500到4000次之间) 它清除标志,当中断函数中添加了断点时,它只触发一次 我试着看看是否是硬件反弹,但没有反弹,用示波器检查。它也有下降沿和上升沿触发检测的问题 我希望在按下按钮后只触发一次中断,相反,它触发的次数非常多 有什么问题吗 提前感谢,

我正在研制STM32F303CC。在这个mcu上,我使用6个按钮作为中断。其中5个按钮连接到EXTI15-10,1个连接到EXTI9-5。EXTI15-10上的按钮工作正常。尽管如此,当我按下EXTI9-5上的按钮时,它会触发难以置信的次数(随机在1500到4000次之间)

它清除标志,当中断函数中添加了断点时,它只触发一次

我试着看看是否是硬件反弹,但没有反弹,用示波器检查。它也有下降沿和上升沿触发检测的问题

我希望在按下按钮后只触发一次中断,相反,它触发的次数非常多

有什么问题吗

提前感谢,, 鲁本

GPIO配置:

  /*Configure GPIO pins : BUTTON_6_Pin BUTTON_5_Pin BUTTON_4_Pin BUTTON_3_Pin 
                       BUTTON_2_Pin BUTTON_1_Pin BUTTON_7_Pin */
  GPIO_InitStruct.Pin = BUTTON_6_Pin|BUTTON_5_Pin|BUTTON_4_Pin|BUTTON_3_Pin 
                          |BUTTON_2_Pin|BUTTON_1_Pin|BUTTON_7_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HANDLER1:

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}
手柄2:

    void EXTI9_5_IRQHandler(void)
        {
          /* USER CODE BE

GIN EXTI9_5_IRQn 0 */

      /* USER CODE END EXTI9_5_IRQn 0 */
      HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
      /* USER CODE BEGIN EXTI9_5_IRQn 1 */

      /* USER CODE END EXTI9_5_IRQn 1 */
    }

    /**
      * @brief This function handles EXTI line[15:10] interrupts.
      */
    void EXTI15_10_IRQHandler(void)
    {
      /* USER CODE BEGIN EXTI15_10_IRQn 0 */

      /* USER CODE END EXTI15_10_IRQn 0 */
      HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
      HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);
      HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
      HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
      HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
      HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
      /* USER CODE BEGIN EXTI15_10_IRQn 1 */

      /* USER CODE END EXTI15_10_IRQn 1 */
    }
有什么问题吗

你有没有考虑过它可能是由弹跳引起的

它清除标志,当中断函数中添加了断点时,它只触发一次

对我来说,这听起来像是你需要去抖动按钮[1][2]或添加模拟滤波

你能和我们分享一下电路图吗

[1]


[2]

如果您不显示代码,我们如何知道代码有什么问题?您的作用域可能提供了足够的行上限(10-15 pf)来隐藏去抖动。此代码非常不完整。
按钮定义了什么?