ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
2 июля
390740
nanorobot (25.02.2013 10:47 - 10:49, просмотров: 3112)
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;  
    }  
  }
}