我正在使用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;
}
}
我不知道代码有什么问题。
感谢您的帮助。预先谢谢你!