Прерывания – это механизм, с помощью которого внешний сигнал или инструкция могут приостановить нормальное выполнение программы и обслужить себя, как если бы они имели самый высокий приоритет. Например, процессор, выполняющий программу, может непрерывно отслеживать возможность возникновения какого-то события или прерывания. В случае возникновения внешнего прерывания (например, от какого-то датчика), программа приостанавливает свое нормальное выполнение, сначала обслуживает прерывание, а затем продолжает нормальное выполнение.
В данном проекте, для понимания использования прерываний в контроллере STM32F103C8, мы будем использовать кнопку в качестве внешнего прерывания. Здесь мы будем увеличивать число от 0 и отображать его на I2C дисплее LCD1602. Когда кнопка нажимается, светодиод включается, а на дисплее появляется надпись “Interrupt” (Прерывание). Светодиод выключается сразу же после отпускания кнопки.
Прерывания могут быть классифицированы на два типа:
- Аппаратные прерывания (Hardware Interrupts): Если сигнал к процессору поступает от внешнего устройства, такого как кнопка, датчик или другое аппаратное устройство, которое генерирует сигнал и указывает процессору выполнить определенную задачу, находящуюся в обработчике прерывания, то такие прерывания называются аппаратными.
- Программные прерывания (Software Interrupts): Прерывания, которые генерируются инструкциями программного обеспечения.
Обработчик прерывания (ISR – Interrupt Service Routine): ISR – это функция, которая содержит небольшой набор инструкций. Когда возникает прерывание, процессор сначала выполняет код, находящийся в ISR, а затем продолжает выполнение задачи, которую он выполнял до возникновения прерывания.
Интересно отметить, что аппаратные прерывания могут быть инициированы внешними устройствами, такими как кнопка или датчик, а программные прерывания создаются самим программным обеспечением. Обработчики прерываний представляют собой специальные блоки кода, предназначенные для обработки событий, вызывающих прерывания, и они срабатывают до возвращения к нормальному выполнению программы.
ISR в Arduino имеет следующий синтаксис: attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
. Этот же синтаксис можно использовать и в STM32, если мы используем среду разработки Arduino IDE для загрузки кода.
- digitalPinToInterrupt
- На платах Arduino Uno у нас есть пины 2 и 3, а на Mega – 2, 3, 18, 19, 20, 21 для прерываний. На STM32F103C8 можно указать любой цифровой пин, который вы хотите использовать для прерывания. Однако, при использовании нескольких прерываний одновременно, могут потребоваться некоторые ограничения.
- Тип перехода, вызывающего прерывание.
RISING
: Для вызова прерывания, когда уровень сигнала на пине переходит с LOW на HIGH.FALLING
: Для вызова прерывания, когда уровень сигнала на пине переходит с HIGH на LOW.CHANGE
: Для вызова прерывания при любом изменении уровня сигнала на пине (т.е., когда происходит переход с LOW на HIGH или с HIGH на LOW).
- Некоторые условия при использовании прерываний:
- Функция ISR должна быть как можно короче.
- Функция
delay()
не работает внутри ISR и не должна быть использована в обработчике прерываний.