Привет всем. Помогите, пожалуйста, разобраться с этим EXTI. Ситуация такая - есть 2 кнопки (button2 и button3). Висят они на порту D
Процедура инициализации такая:
|
Код:
|
#define Button_2_Pin GPIO_PIN_4
#define Button_2_GPIO_Port GPIOD
#define Button_3_Pin GPIO_PIN_5
#define Button_3_GPIO_Port GPIOD
GPIO_InitStruct.Pin = Button_2_Pin|Button_3_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/* EXTI interrupt init Button3 */
HAL_NVIC_SetPriority(EXTI4_IRQn, 4, 0);
HAL_NVIC_EnableIRQ(EXTI4_IRQn);
/* EXTI interrupt init Button2 */
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 4, 0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); |
Есть обработчики прерываний:
|
Код:
|
// Button2 (Send/Save)
void EXTI4_IRQHandler(void)
{
HAL_NVIC_ClearPendingIRQ(EXTI4_IRQn);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
CLEAR_BIT(EXTI-›RTSR, EXTI_IMR_IM4);
HAL_NVIC_DisableIRQ(EXTI4_IRQn);
Button2Tick = HAL_GetTick();
if(Pausa)
{
SaveFile = 1;
}
}
// Button3 (Start/Stop)
void EXTI9_5_IRQHandler(void)
{
HAL_NVIC_ClearPendingIRQ(EXTI9_5_IRQn);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
CLEAR_BIT(EXTI-›RTSR, EXTI_IMR_IM5);
HAL_NVIC_DisableIRQ(EXTI9_5_IRQn);
Button3Tick = HAL_GetTick();
Pausa = !Pausa;
} |
в основном (main) коде в цикле:
|
Код:
|
if((HAL_GetTick() - Button3Tick) ›= 200)
{
if(READ_BIT(EXTI-›RTSR, EXTI_IMR_IM5) == 0)
{
SET_BIT(EXTI-›RTSR, EXTI_IMR_IM5);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
}
}
if((HAL_GetTick() - Button2Tick) ›= 200)
{
if(READ_BIT(EXTI-›RTSR, EXTI_IMR_IM4) == 0)
{
SET_BIT(EXTI-›RTSR, EXTI_IMR_IM4);
HAL_NVIC_EnableIRQ(EXTI4_IRQn);
}
} |
Ситуация такая:
1. Хоть и указываю что надо срабатывать по фронту, но в железе прерывания срабатывают и по фронту и по спаду.
2. Если нажать на Button3 иногда срабатывает и прерывание EXTI4_IRQHandler. Если нажать на Button2, почти всегда в регистре EXTI-›PR устанавливаются флаги PR4, PR5 и как следствие по очереди попадаю сначала в EXTI4_IRQHandler а потом в EXTI9_5_IRQHandler
Я уже не знаю куда копать. Может кто сталкивался с подобным?
P.S. в проекте используется HAL