Внешнее прерывание (EXTI)
Внешнее прерывание — это одна из возможностей портов (GPIO) в режиме ввода. Оно заставляет микроконтроллер мгновенно среагировать на изменения, на входных контактах порта (GPIO) от внешних событий и перейти к исполнению части программы, заложенной в прерывании.
Внешние прерывания полезны во многих программах. Как пример, аварийная кнопка. Рассмотрим беговую дорожку. Вот вы бежите с большой скоростью, и внезапно у вас заболела одна из лодыжек и вам хочется немедленно остановить дорожку. И вместо того, чтобы медленно сбавлять скорость, вы можете нажать аварийную кнопку.
Аварийная кнопка прервет исполнение основной программы и немедленно заставит контроллер беговой дорожки снизить скорость быстрее. Таким образом, данная функция имеет высший приоритет над другими процессами.
В большинстве 8-битных микроконтроллерах мало выводов с возможностью генерирования прерывания, а так для них доступно мало возможностей для настройки, но это не относится к микросхемам ST. В STM8 почти все контакты GPIO имеют возможность внешнего прерывания с входными триггерами Шмитта. А также имеется контроллер прерываний, который позволяет настроить приоритет выполнения.
Подключения
Пример кода
Мы модифицируем программу “Hello world”, где мы изменяли частоту мигания светодиода по нажатию кнопки. Но в этот раз мы вместо отслеживания нажатия кнопки в основном цикле программы, мы это будем делать по прерыванию.
Реализация данной программы потребует особого внимания, так как теперь мы будем настраивать прерывания. И это сильно отличается от всего, что я видел раньше. Так как нам придется выполнить много шагов в отличии от других компиляторов. В других компиляторах все, что на надо сделать, — это создать функцию для прерывания и сообщить компилятору по какому адресу вектора прерывания должна находиться функция. Тут же все делается тоже самое, но с большим количеством шагов.
Теперь посмотрим на таблицу векторов прерываний STM8S003:
Эта таблица находиться не в справочном руководстве, а в техническом описании микроконтроллера. Так же таблица векторов прерываний зависит от устройства, поэтому нам необходимо удостовериться, что мы выбрали правильную. Кнопка платы Discovery Board подключена к PB7 и нам понадобится IRQ4, то есть внешнее прерывание EXTI1 для PORTB. Все внешние прерывания от вывода GPIOB выполняются здесь.
Далее необходимо обратить внимание, что использование прерываний, нуждается в файлах stm8s_it.h и stm8s_it.c поэтому необходимо добавить их.
Код файла main.c
Код файла stm8_interrupt_vector.c
Теперь необходимо добавить следующие строчки в верхнюю часть файлов stm8s_it.h и stm8s_it.c соответственно.
Файл stm8s_it.h
Файл stm8s_it.c
Оригинал статьи: