如何解决在EXTI9-5上多次触发的中断?

时间:2019-06-06 09:49:01

标签: c interrupt stm32

我正在开发STM32F303CC。在这个单片机上,我使用6个按钮作为中断。这些按钮中的5个连接到EXTI15-10,一个连接到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);
  }
}

HANDLERS2:

    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 */
    }

2 个答案:

答案 0 :(得分:1)

  

可能是什么问题?

您是否认为它可能是由弹跳引起的?

  

它清除标志,并且当在中断函数中添加一个断点时,它只会触发一次。

对我来说,这听起来像您需要对按钮[1] [2]进行反抖动或添加模拟滤波。

您可以和我们分享电路图吗?

[1] https://www.allaboutcircuits.com/technical-articles/switch-bounce-how-to-deal-with-it/

[2] https://en.wikipedia.org/wiki/Keyboard_technology#Debouncing

答案 1 :(得分:0)

This 来自 community.st.com 说...

<块引用>

确保它在例程早期检查并清除标志,然后做其他事情。如果您在返回前立即清除它,则会出现尾链问题。

由于这是一个时序/缓存问题,增加编译器优化可以使问题出现,而单步调试器可以使问题消失。 HAL 可以掩盖问题,因为它是额外的代码(回调等)。

一些解决方案:

  • 在离开 ISR 之前插入同步屏障 (DSB)(提到 herehere
  • 尽早清除中断位 (here)
  • 读/写另一个位置 (here)

我在较新的 STM32H7 变体上看到了同样的问题。