STM32F4-用户按钮的异常行为(两次中断弹出)

时间:2018-12-23 01:27:07

标签: button interrupt bounce stm32f4

我正在使用NUCLEO-F401RE板,每次按下用户按钮时都需要运行一个功能。 Button与下面的代码一起使用,但有时中断会弹出两次,该函数也会运行两次。这是我的代码:

main.c

int main(void)
{
    HAL_Init();

    SystemClock_Config();

    ...

    activateButton();

    while (1)
    {

    }
}
void buttonFunction(void)
{
    // UART Communication
}
static void activateButton(void)
{
    GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;

    HW_GPIO_Init(USER_BUTTON_GPIO_PORT, USER_BUTTON_PIN, &GPIO_InitStruct);
    HW_GPIO_SetIrq(USER_BUTTON_GPIO_PORT, USER_BUTTON_PIN, 1, buttonFunction);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_PIN)
{
    if(GPIO_PIN == USER_BUTTON_PIN)
    {   
        buttonFunction();
    }
}

stm32f4xx_it.c

void EXTI15_10_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(USER_BUTTON_PIN);
}

hw_gpio.c

void HW_GPIO_SetIrq( GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, uint32_t prio,  GpioIrqHandler *irqHandler )
{
  IRQn_Type IRQnb;

  uint32_t BitPos = HW_GPIO_GetBitPos( GPIO_Pin ) ;

  if ( irqHandler != NULL)
  {
    GpioIrq[ BitPos ] = irqHandler;

    if(GPIO_Pin == USER_BUTTON_PIN)
    {
        IRQnb = EXTI15_10_IRQn;
    }

    HAL_NVIC_SetPriority( IRQnb , prio, 0);

    HAL_NVIC_EnableIRQ( IRQnb );
  }
  else
  {
    GpioIrq[ BitPos ] = NULL;
  }
}

我不知道代码有什么问题。

感谢您的帮助。预先谢谢你!

0 个答案:

没有答案