STM32F205 rev.Y, IAR 6.50 Странное различие в обработке внешних прерываний EXTI9_5 и EXTI15_10. На входа PB14 и PA9 подаю один и тот же сигнал - пачки импульсов 1 КГц, инициализация GPIO и EXTI одинаковая, обработчики прерываний также одинаковы, результат
наблюдается на светодиодах и осциллографом, прерывание от PA9 - все ОК (форма импульсов на LED совпадает со входной), прерывание же от PB14 происходит хаотично, кроме того операция EXTI_ClearITPendingBit(EXTI_Line14) не очищает соответствующий бит(в случае с PA9 опять таки все ОК). Вместо PB14 пробовал использовать PC14, результат не меняется, вместо вызова библиотечной функции EXTI_ClearITPendingBit пробовал работать напрямую с регистром, эффекта нет. Приоритетами игрался. В эррате на эту тему ничего нет, бьюсь третий день, голова кругом..
инициализацию GPIO не привожу по причине полной банальности, проверено неоднократно
LED_R, LED_Y и т.д. - макросы описывающие bit-banding адреса ножек GPIO к которым подключены светодиоды, там тоже все однотипно и проверено, в том числе и переменой led в прерываниях
инициализация EXTI:
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource14);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource9);
EXTI_StructInit(&EXTI_InitStruct);
EXTI_InitStruct.EXTI_Line = EXTI_Line9;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x03;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
EXTI_StructInit(&EXTI_InitStruct);
EXTI_InitStruct.EXTI_Line = EXTI_Line14;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
обработчики прерывания:
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line9))
{
LED_Y = !LED_Y;
EXTI_ClearITPendingBit(EXTI_Line9);
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9))
{
LED_R = 1;
}
else
{
LED_R = 0;
}
}
}
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line14))
{
LED_G = !LED_G;
EXTI_ClearITPendingBit(EXTI_Line14);
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14))
{
LED_B = 1;
}
else
{
LED_B = 0;
}
}
}