Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не могу понять почему не работают EXTINT
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
mempfis_
Всем добрый день.

Есть проблема с настройкой внешних прерываний в STM32F103
Необходимо по заднему фронту кнопки зажигать/гасить светодиод. Кнопка висит на PB15.
Светодиод рабочий на 100 процентов также как и кнопка.
Код обработчика прерываний и настройки внешних прерываний.

Код
void EXTI3_IRQHandler(void)
{
  static unsigned int led_stat = 0;
  
  //if(EXTI->PR & EXTI_IMR_MR15)
  {
    EXTI->PR = EXTI_IMR_MR15; //clear pendig interrupt
    if(led_stat == 0)
    {
      led_stat = 1;
      SLED_SET(SLED_0_MSK);
    }
    else
    {
      led_stat = 0;
      SLED_CLR(SLED_0_MSK);
    }
  }
  
  _putcharDebug('\r');
  _putcharDebug('e');
  _putcharDebug('\n');
  
}


void extIntInit(void)
{
  RCC->APB2ENR |= RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPBEN;
  __no_operation();
  
  
  AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI15_PB;
  EXTI->FTSR = EXTI_FTSR_TR15; //falling edge
  //EXTI->RTSR = SW2_EXT_INT_BIT_MSK; //risig edge
  
  NVIC_SetPriority(EXTI3_IRQn, EXTI3_IRQ_PRIO);
  NVIC_EnableIRQ(EXTI3_IRQn);
  
  EXTI->IMR = EXTI_IMR_MR15;
  //EXTI->EMR = EXTI_IMR_MR15;
    
}


Программа не большая - содержит 3 источника прерываний (UART1, TIM3, EXT3). UART1 и TIM3 работают без проблем.
Есть задача сканирования кнопок по таймеру.
При опросе кнопки в задаче сканирования кнопок зажигаются 3 светодиода - т.о. пин PB15 рабочий.
4й светодиод проверен и должен зажигаться только по прерыванию. Код настройки внешних прерываний составлен на основе документации, также сравнил с примерами из интернета и тем, что генерирует stm32Cube. Различий я не вижу.
При нажатии кнопки PB15 программа не виснет и не перезагружается, но и прерывание EXT3 не генерируется.

Может кто что подскажет по настройкам. Спасибо.



AHTOXA
Файл случайно не *.cpp?
mempfis_
Цитата(AHTOXA @ Jun 23 2015, 11:15) *
Файл случайно не *.cpp?


Файл не cpp. Проект создан в IAR 5.40 и установлен Languadge C. Я не думаю что проблема в этом т.к. другие прерывания работают. Мне кажется проблема в настройках, но я уже 2 дня не могу разобраться в чём.
adnega
Разве пин 15 вводится на EXTI3?
Может, EXTI15_10_IRQHandler нужен (или как там его)?
mempfis_
Цитата(adnega @ Jun 23 2015, 11:53) *
Разве пин 15 вводится на EXTI3?
Может, EXTI15_10_IRQHandler нужен (или как там его)?


Не пин 15 а PB15. По докам он относится к EXTI3.
adnega
Цитата(mempfis_ @ Jun 23 2015, 12:00) *
Не пин 15 а PB15. По докам он относится к EXTI3.

А у меня в доках английским-по-белому нарисовано, что к EXTI15.
mempfis_
Цитата(adnega @ Jun 23 2015, 11:53) *
Разве пин 15 вводится на EXTI3?
Может, EXTI15_10_IRQHandler нужен (или как там его)?


Спасибо. Вы были правы. Из-за спешки и невнимательности решил что exti3-0irqhandler отвечают за прерывания exti15-0. А за exti19-16 вектор exti15_10irqhandler. А ведь в самом файле с описанием векторов прерываний написано за какие exti отвечают конкретные хандлеры. Поспешиш людей насмешиш. Всем спасибо за помощь. Проблема полностью решена.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.