Привет всем. Помогите, пожалуйста, разобраться с этим 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.
Отредактировано AlexWonder (2017-10-17 20:41:10)