Как исправить прерывание, которое срабатывает несколько раз на EXTI9-5? - PullRequest
0 голосов
/ 06 июня 2019

Я работаю над STM32F303CC.на этом MCU я использую 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 */
    }

1 Ответ

1 голос
/ 06 июня 2019

в чем может быть проблема?

Рассматривали ли вы, что это может быть вызвано отскоком?

он очищает флаг, а когда к функции прерывания добавляется точка останова, он срабатывает только один раз.

Для меня это звучит так, как будто вам нужно отменить кнопку [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

...