Микроконтроллеры STM32 способны генерировать прерывание по состоянию вывода x = {0, 1, 2, …. 15} порта,  назначенного пользователем для данного номера вывода. Так, например прерывание EXTI3 может быть назначено на выводы PA3 или PB3 или PC3… и так далее для одного из портов доступных в данном корпусе микроконтроллера.

При возникновении условий, назначенных прерыванию x (фронт и/или срез внешнего сигнала) для выводов 0…4 генерируется запрос на прерывание по раздельным каналам _EXTI0IRQn … _EXTI4IRQn, для выводов 5…9 и 10…15 по групповым каналам EXTI9_5_IRQn и EXTI15_10_IRQn соответственно.

Прерывание будет вызвано при разрешении соответствующего канала NVIC и установленном бите маски разрешения прерываний регистра “Interrupt mask register” (EXTI_IMR).

В процессе обработки прерывания в регистре EXTI_PR записью единицы необходимо сбросить флаг события вызвавшего данное прерывание. При этом для групповых источников, если маской EXTI_IMR разрешён более чем один из группы выводов, по флагам регистра EXTI_PR необходимо определить какой из них послужил причиной прерывания.

Назначение порта внешнего прерывания

Выбор порта, назначенного прерыванию EXTI(x), осуществляется записью комбинации четырёх битов EXTI(x)[3:0] в одном из регистров _AFIOEXTICR1 … _AFIOEXTICR4:

  • EXTI(n)[3:0] = 0000: Вывод (x) назначен на PORTA;
  • EXTI(n)[3:0] = 0001: PORTB(x);
  • EXTI(n)[3:0] = 0010: PORTC(x);
  • EXTI(n)[3:0] = 0011: PORTD(x);
  • EXTI(n)[3:0] = 0100: PORTE(x);
  • EXTI(n)[3:0] = 0101: PORTF(x);
  • EXTI(n)[3:0] = 0110: PORTG(x);

В стандартном файле определений для периферии “stm32F10x.h”; указанные регистры объявлены как массив из четырёх элементов-регистров AFIO->EXTICR []. Так как в каждом из регистров EXTICR хранятся комбинации для четырёх выводов, делением номера на четыре можно выбрать нужный элемент массива:

AFIO->EXTICR [3>>0x02] |= AFIO_EXTICR1_EXTI3_PA; // Прерывание INT3 на PORTA.
AFIO->EXTICR [7>>0x02] |= AFIO_EXTICR2_EXTI7_PC; // Прерывание INT7 на PORTC.

 

Разрешение запросов и задание условий вызова внешних прерываний

Разрешение запроса на прерывание по состоянию вывода x осуществляется установкой соответствующего бита MR(x) в регистре EXTI_IMR.

EXTI_IMR — маска запросов внешних прерываний:

EXTI_EMR

Условия формирования запросов на прерывание EXTI(x) определяются состоянием битов TR(x) в регистрах “Rising trigger selection register” (EXTI_RTSR) и “Falling trigger selection register”; (EXTI_FTSR).

EXTI_RTSR – прерывание по фронту “Rising Edge”:

EXTI_RTSR

EXTI_FTSR – прерывание по срезу “Falling Edge”:

EXTI_RTSR

 

При установленных битах регистров RTSR и FTSR соответствующие прерывания будут вызываться или по фронту внешнего сигнала или по срезу, или по обоим событиям вместе, например:

EXTI->IMR |= (1<<7); // Разрешить запрос от EXTI7.
EXTI->FTSR |= (1<<7); // Прерывание от EXTI7 по срезу.
NVIC_EnableIRQ (EXTI9_5_IRQn); // Разрешить EXTI9_5 в NVIC.

 

Обработка прерываний

После настройки выбранного прерывания достаточно разместить в тексте программы функцию его обработки с именем, указанным в файле startup – _“EXTI(x)_IRQHandler”_.

Возникшие прерывания вызывают установку флагов событий PR(x) регистра EXTI_PR, которые должны быть сброшены записью в них единичных битов.

void EXTI9_5_IRQHandler (void)
{
      if (EXTI->PR & (1<<5)) // Прерывание от EXTI5?
      {  EXTI->PR |= (1<<5); // Сбросить флаг EXTI5.  
            // Обработка события EXTI5
      }
      if (EXTI->PR & (1<<7)) // Прерывание от EXTI7?
      {  EXTI->PR |= (1<<7); // Сбросить флаг  EXTI7.  
            // Обработка события EXTI7
      } 
      ...
}

_Источник: Программирование STM32. Часть 4. Внешние прерывания EXTI_

 

 

Предыдущая часть: Программирование STM32. Часть 3. Система прерываний

Комментарии

comments powered by Disqus