Я работаю с платой 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;
}
}
У меня нетзнать, что не так в коде.
Любая помощь приветствуется.Заранее спасибо!