Всем привет.
Столкнулся с такой проблемой в STM32F407: Если сделать критическую секцию для внешнего прерывания, то если его отключить на время выполнения кода, а потом опять включить, но за время выполнения кода пришло внешнее прерывание, то при последующем включении внешнего прерывания, прерывание не сработает. Т.е. получается будет пропущенное прерывание на время его отключения. Как сделать чтобы при включении внешнего прерывания его сработавший флаг был активен?
Код инициализации
CODE
#define TEST_IRQ_PIN GPIO_Pin_14
#define TEST_IRQ_GPIO_PORT GPIOE
#define TEST_EXTI_Line EXTI_Line14
#define TEST_IRQChannel EXTI15_10_IRQn
#define TEST_EXTI_PortSource EXTI_PortSourceGPIOE
#define TEST_GPIO_PinSource GPIO_PinSource14
// отключение обработки внешнего прерывания
#define ENTER_NOIRQ_REGION() { ITStatus exti_status = EXTI_GetIRQStatus(TEST_EXTI_Line); \
EXTI_Disable_IRQ(TEST_EXTI_Line); \
// включение обработки прерывания
#define LEAVE_NOIRQ_REGION() if(exti_status != RESET) \
EXTI_Enable_IRQ(TEST_EXTI_Line); \
}
GPIO_InitStructure.GPIO_Pin = TEST_IRQ_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(TEST_IRQ_GPIO_PORT, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG_EXTILineConfig(TEST_EXTI_PortSource, TEST_GPIO_PinSource);
EXTI_InitStructure.EXTI_Line = TEST_EXTI_Line;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TEST_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
Такой вид имеет код приложения
Код
ENTER_NOIRQ_REGION();
...
Копирование данных
...
LEAVE_NOIRQ_REGION();
Сообщение отредактировал IgorKossak - Dec 2 2014, 19:55
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!