- Типы прерываний и ISR
- Синтаксис прерывания в STM32
- Необходимые компоненты
- Принципиальная схема и подключения
- Программирование STM32F103C8 для прерываний
Прерывания - это механизм, с помощью которого ввод-вывод или инструкция могут приостановить нормальное выполнение процессора и получить обслуживание, как будто оно имеет наивысший приоритет. Как, например, процессор, выполняющий нормальное выполнение, также может постоянно отслеживать какое-либо событие или прерывание. То есть, когда происходит внешнее прерывание (например, от какого-то датчика), процессор приостанавливает свое нормальное выполнение и сначала обслуживает прерывание, а затем продолжает его нормальное выполнение.
В этом проекте, чтобы понять прерывания в STM32F103C8, мы будем использовать кнопку в качестве внешнего прерывания. Здесь мы будем увеличивать число от 0 и отображать его на ЖК-дисплее 16x2, и всякий раз, когда нажимается кнопка, светодиод включается, а ЖК-дисплей показывает ПРЕРЫВАНИЕ. Светодиод гаснет, как только кнопка отпускается.
Типы прерываний и ISR
Прерывания можно условно разделить на два типа:
Аппаратные прерывания: если сигнал к процессору исходит от какого-либо внешнего устройства, такого как кнопка или датчик, или от какого-либо другого аппаратного устройства, которое генерирует сигнал и сообщает процессору о выполнении определенной задачи, присутствующей в ISR, это называется аппаратными прерываниями.
Программные прерывания: прерывания, которые генерируются программными инструкциями.
Процедура обслуживания прерывания
Подпрограмма обслуживания прерывания или обработчик прерывания - это событие, которое имеет небольшой набор инструкций в нем, и когда происходит прерывание, процессор сначала выполняет этот код, который присутствует в ISR, а затем продолжает задачу, которую он выполнял до прерывания.
Синтаксис прерывания в STM32
ISR имеет следующий синтаксис attachInterrupt (digitalPinToInterrupt (pin), ISR, mode) в Arduino, и то же самое можно использовать в STM32, поскольку мы используем IDE Arduino для загрузки кода.
- digitalPinToInterrupt (pin): как и на плате Arduino Uno, у нас есть контакты 2,3, а в мегапикселе - 2,3,18,19,20,21 для прерываний. В STM32F103C8 у нас также есть контакты прерывания, любые контакты GPIO могут использоваться для прерываний. Мы просто указываем входной контакт, который мы используем для прерывания. Но при одновременном использовании более одного прерывания нам, возможно, придется соблюдать некоторые ограничения.
- ISR: это функция обработчика прерывания, которая вызывается при возникновении внешнего прерывания. У него нет аргументов и недействительного возвращаемого типа.
- Режим: Тип перехода для запуска прерывания
- RISING: запускает прерывание, когда вывод переходит с LOW на HIGH.
- ПАДЕНИЕ: запускает прерывание, когда вывод переходит из ВЫСОКОГО в НИЗКИЙ.
- CHANGE: запускать прерывание, когда вывод переходит из LOW в HIGH или из HIGH в LOW (т. Е. Когда вывод меняется).
Некоторые условия при использовании прерывания
- Функция обработки прерывания (ISR) должна быть как можно короче.
- Функция Delay () не работает внутри ISR, и ее следует избегать.
Необходимые компоненты
- STM32F103C8
- Нажать кнопку
- СВЕТОДИОД
- Резистор (10К)
- ЖК-дисплей (16x2)
Принципиальная схема и подключения
Одна сторона вывода кнопки подключена к 3,3 В STM32, а другая сторона подключена к входному выводу (PA0) STM32 через понижающий резистор.
Pull Down резистор используется так, что микроконтроллер будет получать только ВЫСОКИЙ или НИЗКИЙ на своем входе, когда кнопка нажата или отпущена. В противном случае без понижающего резистора MCU может запутаться и подать на вход случайные плавающие значения.
Соединение между STM32F103C8 и LCD
В следующей таблице показано соединение контактов между ЖК-дисплеем (16X2) и микроконтроллером STM32F103C8.
STM32F103C8 |
ЖК-дисплей |
GND |
VSS |
+ 5В |
VDD |
К центральному контакту потенциометра |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5В |
А |
GND |
K |
Программирование STM32F103C8 для прерываний
Программа для этого урока проста и дана в конце этого урока. Нам не нужен программатор FTDI для программирования STM32, просто подключите компьютер к USB-порту STM32 и начните программировать с помощью Arduino IDE. Узнайте больше о программировании STM32 через порт USB.
Как мы уже говорили, здесь в этом руководстве мы собираемся увеличивать число от 0 и отображать его на ЖК-дисплее 16x2, и всякий раз, когда нажимается кнопка, светодиод загорается, а ЖК-дисплей показывает «ПРЕРЫВАНИЕ».
Сначала определите соединения выводов ЖК-дисплея с помощью STM32. Вы можете изменить его в соответствии с вашими требованиями.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Затем мы включаем файл заголовка для ЖК-дисплея. Это вызывает библиотеку, которая содержит код того, как STM32 должен взаимодействовать с ЖК-дисплеем. Также убедитесь, что функция LiquidCrystal вызывается с именами выводов, которые мы только что определили выше.
включают
Глобальные переменные используются для передачи данных между ISR и основной программой. Мы объявляем переменную ledOn как изменчивую, а также как Boolean, чтобы указать True или False.
изменчивое логическое значение ledOn = false;
Внутри функции void setup () мы отобразим вводное сообщение и очистим его через 2 секунды.
lcd.begin (16,2); lcd.print ("ДАЙДЖЕСТ ЦЕПИ"); задержка (2000); lcd.clear ();
Опять же, в той же функции void setup () нам нужно указать входные и выходные контакты. Мы устанавливаем контакт PA1 для вывода на светодиод и PA0 для ввода от кнопки.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
Мы также собираемся увеличивать число, поэтому объявим переменную с нулевым значением.
int я = 0;
Теперь важной частью кода является функция attachInterrupt () , она также включена в void setup ()
attachInterrupt (digitalPinToInterrupt (PA0), buttonPressed, ИЗМЕНИТЬ)
Мы указали вывод PA0 для внешнего прерывания, а buttonPressed - это функция, которая должна вызываться, когда на выводе PA0 есть ИЗМЕНЕНИЕ (от LOW к HIGH или HIGH к LOW). Вы также можете использовать любое другое имя функции, контакт и режим в соответствии с требованиями.
Внутри цикла void () мы увеличиваем число (i) от нуля и печатаем число на ЖК-дисплее (16x2).
lcd.clear (); lcd.print ("НОМЕР:"); lcd.print (i); ++ i; задержка (1000);
Самая важная часть - это создание функции обработчика прерывания в соответствии с именем, которое мы использовали в функции attachInterrupt () . Мы использовали buttonPressed, поэтому здесь мы создали функцию void buttonPressed ()
void buttonPressed () { если (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } еще { ledOn = true; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print («Прерывание»); } }
Работа этой кнопки Press () ISR:
В зависимости от значения переменной ledOn светодиод включается и выключается.
КНОПКА СОСТОЯНИЕ |
ledOn (значение) |
Светодиод (красный) |
ЖК-дисплей (16x2) |
НЕПРЕССОВАННЫЙ |
Ложь |
ВЫКЛ. |
- |
НАЖАТЫЙ |
Правда |
НА |
Показывает 'ПРЕРЫВАНИЕ' |
Если значение ledOn ложно, то светодиод остается выключенным, а если значение ledOn равно True, светодиод включается, и на ЖК-дисплее отображается «Прерывание».
ПРИМЕЧАНИЕ. Иногда может наблюдаться эффект дребезга переключателя, и при нажатии кнопки может происходить подсчет нескольких срабатываний, это связано с несколькими скачками напряжения из-за механической причины нажатия кнопки. Это можно уменьшить, установив RC-фильтр.
Полная работа прерываний в STM32F103C8 показана на видео ниже.