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