Микроконтроллеры STM32 способны генерировать прерывание по состоянию вывода x = {0, 1, 2, .... 15} порта, назначенного
пользователем
для данного номера вывода. Так, например прерывание EXTI3 может быть назначено на выводы PA3 или PB3 или PC3… и так далее для одного из портов доступных в данном корпусе микроконтроллера.
При возникновении условий, назначенных прерыванию x (фронт и/или срез внешнего сигнала) для выводов 0…4 генерируется запрос на прерывание по раздельным каналам EXTI0_IRQn … EXTI4_IRQn, для выводов 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] в одном из регистров AFIO_EXTICR1 … AFIO_EXTICR4:
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(x) определяются состоянием битов TR(x) в регистрах "Rising trigger selection register” (EXTI_RTSR) и "Falling trigger selection register" (EXTI_FTSR). EXTI_RTSR – прерывание по фронту "Rising Edge” EXTI_FTSR – прерывание по срезу "Falling Edge”
При установленных битах регистров 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
}
...
} |
Ну вот... как-то так. Удачных Вам программ! |