Easyelectronics.ru

Электроника для всех
Текущее время: 29 окт 2020, 21:22

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: STM32F4 несколько внешних прерываний
СообщениеДобавлено: 30 май 2012, 22:33 
Старожил

Зарегистрирован: 11 окт 2010, 13:10
Сообщения: 302
Откуда: г.Караганда, РК
Нужно отловить прерывание от пинов PE0-PE6, PE11-PE14.
Вот инициализация:
Код:
GPIO_InitTypeDef GPIO_InitStruct2;
EXTI_InitTypeDef   EXTI_InitStructure;
NVIC_InitTypeDef   NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); //клок
//Конфигурация порта E на вход с прерыванием прерыванием
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //включаю тактирование для включения внешних прерываний
GPIO_InitStruct2.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitStruct2.GPIO_Mode=GPIO_Mode_IN;//перевожу на вход, далее сделаю прерывание; GPIO_Mode_AF
GPIO_InitStruct2.GPIO_PuPd=GPIO_PuPd_NOPULL; //GPIO_PuPd_NOPULL;      //без подтяжки
GPIO_InitStruct2.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_DeInit(GPIOE);   
GPIO_Init(GPIOE, &GPIO_InitStruct2);  //настраиваю порт на вход с подтяжкой и 100МГц
EXTI_DeInit();
   
//Пресоединяю линию внешних прерывния EXTI к GPIOE.0-GPIOE.6,GPIOE.11-GPIOE.14
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource0);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource1);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource5);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource6);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource11);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource12);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource13);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource14);
EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1|EXTI_Line2|EXTI_Line3|EXTI_Line4|EXTI_Line6|EXTI_Line11;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; 
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

  /* Enable and set EXTI Line0 Interrupt to the lowest priority */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
   
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
   
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
   
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
   
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
   
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x06;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
   
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x07;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

Вот обработчик прерывания:
Код:
void EXTI0_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line0) != RESET)
  {
    /* Clear the EXTI line 0 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line0);
  }
}

void EXTI1_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line1) != RESET)
  {
       
    /* Clear the EXTI line 1 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line1);
  }
}

void EXTI2_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line2) != RESET)
  {
       
    /* Clear the EXTI line 2 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line2);
  }
}

void EXTI3_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line3) != RESET)
  {
       
    /* Clear the EXTI line 3 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line3);
  }
}

void EXTI4_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line4) != RESET)
  {
       
    /* Clear the EXTI line 4 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line4);
  }
}

void EXTI9_5_IRQnHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line6) != RESET)
  {
       
    /* Clear the EXTI_Line6 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line6);
  }
}

void EXTI15_10_IRQnHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line11) != RESET)
  {
       
    /* Clear the EXTI_Line11 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line11);
  }
}


И для генерации прерывания использую функцию генерации совтового прерывания
Код:
EXTI_GenerateSWInterrupt(EXTI_Line6);
EXTI_GenerateSWInterrupt(EXTI_Line2);
EXTI_GenerateSWInterrupt(EXTI_Line11);

Смотрю в отладчки при генерировании софтового прерыания биты в EXTI_PI ставять но в прерывание не уходит, и как доходит до следующего софтового генератора прерываний (например сначала EXTI_Line6 затем EXTI_Line2) программа затыкается, останавливаю дебаг оказываюсь в асемблерном файле в конце векторов прерывания

Код:
OTG_HS_IRQHandler                                                   
DCMI_IRQHandler                                                           
CRYP_IRQHandler                                                   
HASH_RNG_IRQHandler
FPU_IRQHandler                                                 

                B   //вот тут  .

                ENDP

Подскажите где ошибка? Что я забыл сделать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F4 несколько внешних прерываний
СообщениеДобавлено: 31 май 2012, 11:55 
Старожил

Зарегистрирован: 31 янв 2011, 19:17
Сообщения: 437
Откуда: Москва
Может, еще нужно сделать такой вызов: NVIC_EnableIRQ(EXTIx_IRQn). Вместо x поставить линию, какая у вас там используется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F4 несколько внешних прерываний
СообщениеДобавлено: 31 май 2012, 12:40 
Старожил

Зарегистрирован: 11 окт 2010, 13:10
Сообщения: 302
Откуда: г.Караганда, РК
Нет пробовал. Не помогает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F4 несколько внешних прерываний
СообщениеДобавлено: 31 май 2012, 20:28 
Старожил
Аватара пользователя

Зарегистрирован: 21 ноя 2011, 18:51
Сообщения: 234
Откуда: Тула
а вообще хоть один *IRQHandler срабатывает ?
Я тут тоже мучался некоторое время, оказалось все просто, забыл подключить startup_stm32f***_***.s и system_stm32f***.c
После его подключения и прописывания определения хендлеров в stm32f***_it.h все заработало.
Симптомы были почти точно такие же, переходил в адрес BusFault_Handler и там останавливался.
Только с тем отличием что у меня F1, а не F4.

Кстити проверь еще, когда дебаг запустится, сможеш ли ты поставить точку останова внутрь кода прерывания? Если стартап не подключен должным образом, то компилятор выкидывает Хендлеры и в кристалл их не пишет, т.к. он не знает что это такое.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F4 несколько внешних прерываний
СообщениеДобавлено: 01 июн 2012, 23:58 
Старожил

Зарегистрирован: 11 окт 2010, 13:10
Сообщения: 302
Откуда: г.Караганда, РК
Прерывание от юсарта работает. так что с етим все ок.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F4 несколько внешних прерываний
СообщениеДобавлено: 09 июн 2012, 21:19 
Старожил

Зарегистрирован: 11 окт 2010, 13:10
Сообщения: 302
Откуда: г.Караганда, РК
Нашел ошибку, была в том что неправильно написал название вектора прерывания для 9_5 и не снимал бит прерывания для 9_5 линий.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB