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