STM32F4 - непредвиденное поведение кнопки пользователя (прерывание прерывается дважды) - PullRequest
0 голосов
/ 23 декабря 2018

Я работаю с платой NUCLEO-F401RE, и мне нужна функция для запуска при каждом нажатии пользовательской кнопки.Кнопка работает с кодом ниже, но иногда прерывание выскакивает дважды, и функция также запускается дважды.Это мой код:

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;
  }
}

У меня нетзнать, что не так в коде.

Любая помощь приветствуется.Заранее спасибо!

...