Прерывание (англ. interrupt) — сигнал от программного или аппаратного обеспечения, сообщающий процессору о наступлении какого-либо события, требующего немедленного внимания. Прерывание извещает процессор о наступлении высокоприоритетного события, требующего прерывания текущего кода, выполняемого процессором. Процессор отвечает приостановкой своей текущей активности, сохраняя свое состояние и выполняя функцию, называемую обработчиком прерывания (или программой обработки прерывания), которая реагирует на событие и обслуживает его, после чего возвращает управление в прерванный код.
А теперь простыми словами и на примере из жизни. Едет Вася на машине. В это время по телефону звонит давняя подруга Васи – Таня. Так как нельзя одновременно ехать и разговаривать с Таней, Вася останавливается и поднимает трубку. Пообщавшись, он продолжает свой путь.
Так вот Вася – это микропроцессор, который исполняет свою программу – едет на машине. Внезапно позвонившая Таня – это событие, которое вызвало прерывание основной программы. Остановка – это функция, которая называется обработчик прерывания. Телефон – это линия по которой пришло оповещение о событии.
Какие могут быть события для микроконтроллеров STM32 можно посмотреть в кубе (чуть ниже укажу, где они там находятся):
Разделим их на две группы по возможности обработки:
-
External Interrupt – обработка внешних прерываний;
-
External Event – обработка событий.
Обнаружение событий производится микроконтроллером по факту изменения состояния:
-
при изменении с 0 на 1 (по восходящему фронту);
-
при изменении с 1 на 0 (по нисходящему фронту);
-
при любом изменении (с 0 на 1 или с 1 на 0).
Есть еще программные типы прерывания, но это отдельная тема.
Линии, по которым могут обнаруживаться события, можно посмотреть на схеме:
Как видим, на схеме показаны 16 линий, по которым можно обнаружить события на ножках микроконтроллера. Стоит обратить внимание, что на одну линию посажены одноименные пины. Эта ситуация налаживает некоторые ограничения: мы не сможем обработать одноименные ножки. Например, мы можем обработать события на PA2, PB5, но не сможем обработать PA2 и PB2.
Существуют еще 4 линии подключеных к определенным видам периферии:
EXTI line 16 is connected to the PVD output
EXTI line 17 is connected to the RTC Alarm event
EXTI line 18 is connected to the USB Wakeup event
EXTI line 19 is connected to the Ethernet Wakeup event (available only in connectivity line devices).
А теперь к примерам.
Изменим немного схему бегущего огня из заметки 3:
и организуем обработку кнопок через прерывания.
Идем в куб и устанавливаем PB0 и PB1 в GPIO_EXTI0 и GPIO_EXTI1 соответственно.
Идем в «System Core -> GPIO». Ищем PB0. Указываем «GPIO mode»: «External Interrupt Mode with Rising edge trigger detection» - прерывание по внешнему событию по восходящему фронту (при изменении с 0 на 1).
Во второй строчке «GPIO Pull-up/Pull-down» указываем «Pull-down» - привязка PB0 к низкому уровню через подтягивающий резистор.
Проделываем тоже самое с PB1.
Идем в «System Core -> NVIC» и включаем прерывания на нужных линиях, поставив галочки в соответствующие места
Жмем «GENERATE CODE».
С кубом все. Продолжим в заметке 4.2.