- Pertraukimų tipai ir ISR
- STM32 pertraukimo sintaksė
- Būtini komponentai
- Grandinės schema ir jungtys
- STM32F103C8 programavimas pertraukimams
Pertraukimai yra mechanizmas, kuriuo įvesties / išvesties ar instrukcijos gali sustabdyti įprastą procesoriaus vykdymą ir pats aptarnauti, kaip jis turi didžiausią prioritetą. Kaip, pavyzdžiui, procesorius, atliekantis įprastą vykdymą, taip pat gali nuolat stebėti, ar įvyksta koks nors įvykis ar nenutrūksta. Tai yra, kai įvyksta išorinis pertraukimas (kaip iš kokio nors jutiklio), tada procesorius pristabdo įprastą vykdymą ir pirmiausia aptarnauja pertraukimą, o tada tęsia įprastą vykdymą.
Šiame projekte, norėdami suprasti STM32F103C8 pertraukimus, mes naudosime mygtuką kaip išorinį pertraukimą. Čia mes padidinsime skaičių nuo 0 ir parodysime jį 16x2 LCD ekrane. Kai tik paspaudžiamas mygtukas, lemputė įsijungia ir LCD ekrane rodoma „INTERRUPT“. Šviesos diodas išsijungia, kai tik atleidžiamas mygtukas.
Pertraukimų tipai ir ISR
Pertraukimus galima skirstyti į du tipus:
Aparatinės įrangos pertraukimai: jei signalas procesoriui yra iš kokio nors išorinio įrenginio, pvz., Mygtuko ar jutiklio, arba iš kito aparatinės įrangos, generuojančio signalą ir nurodantį procesoriui atlikti tam tikrą užduotį, esančią ISR, vadinama aparatinės įrangos pertraukimais.
Programinės įrangos pertraukimai: pertraukimai, kuriuos sukuria programinės įrangos instrukcijos.
Nutraukti aptarnavimo rutiną
Pertraukiamo aptarnavimo rutina arba pertraukimo tvarkytuvas yra įvykis, kuriame yra nedidelis instrukcijų rinkinys, o įvykus pertraukai procesorius pirmiausia įvykdo šiuos kodus, esančius ISR, ir tada tęsia užduotį, kurią jis darė prieš pertraukimą.
STM32 pertraukimo sintaksė
ISR turi tokią sintaksę „ attachInterrupt“ („digitalPinToInterrupt“ (PIN), ISR, režimas) „Arduino“ ir tas pats gali būti naudojamas ir STM32, nes kodui įkelti naudojame „Arduino IDE“.
- digitalPinToInterrupt (PIN): Kaip ir „Arduino“ plokštėje „Uno“, mes turime 2,3 kaiščius, o mega - 2,3,18,19,20,21 pertraukimams. STM32F103C8 taip pat turime pertraukimo kaiščius, bet kuriuos GPIO kaiščius galima naudoti pertraukimams. Mes tiesiog norime nurodyti įvesties kaištį, kurį naudojame pertraukimui. Tačiau tuo pačiu metu naudojant daugiau nei vieną pertraukimą, mums gali tekti laikytis tam tikrų apribojimų.
- ISR: tai pertraukimo tvarkytuvo funkcija, kuri iškviečiama įvykus išoriniam pertraukimui. Jame nėra jokių argumentų ir negaliojančio grąžinimo tipo.
- Režimas: perėjimo tipas, kad suaktyvintų pertraukimą
- RISING: Norėdami sukelti pertraukimą kaiščiui pereinant iš LOW į HIGH.
- KRITIMAS: suaktyvinti pertraukimą kai kaištis pereina iš HIGH į LOW.
- PAKEITIMAS: suaktyvinti pertraukimą kai kaištis pereina iš LOW į HIGH arba HIGH į LOW (ty kai kaištis pasikeičia).
Kai kurios sąlygos naudojant pertraukimą
- Pertraukiamo aptarnavimo įprasta funkcija (ISR) turi būti kuo trumpesnė.
- „Delay“ () funkcija neveikia ISR viduje, todėl jos reikėtų vengti.
Būtini komponentai
- STM32F103C8
- Paspauskite mygtuką
- LED
- Rezistorius (10K)
- LCD (16x2)
Grandinės schema ir jungtys
Viena mygtuko kaiščio pusė yra sujungta su STM32 3,3 V įtampa, o kita pusė - su žemyn nukreiptu rezistoriumi - prie STM32 įvesties kaiščio (PA0).
Naudojamas traukimo žemyn rezistorius, kad mikrovaldiklis HIGH arba LOW gautų tik esant įėjimui, kai paspaudžiamas arba atleidžiamas mygtukas. Priešingu atveju be nuleidžiamo rezistoriaus MCU gali supainioti ir įvesties kai kurias atsitiktines plaukiojančias reikšmes.
Ryšys tarp STM32F103C8 ir LCD
Šioje lentelėje parodytas kaiščių sujungimas tarp LCD (16X2) ir STM32F103C8 mikrovaldiklio.
STM32F103C8 |
LCD ekranas |
BND |
VSS |
+ 5 V |
VDD |
Į potenciometro centro PIN kodą |
V0 |
PB0 |
RS |
BND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5 V |
A |
BND |
K. |
STM32F103C8 programavimas pertraukimams
Šios pamokos programa yra paprasta ir pateikiama šios pamokos pabaigoje. Mums nereikia FTDI programuotojo programuoti STM32, tiesiog prijunkite savo kompiuterį prie STM32 USB prievado ir pradėkite programuoti naudodami „Arduino IDE“. Sužinokite daugiau apie STM32 programavimą per USB prievadą.
Kaip sakėme, kad čia, šioje pamokoje, mes padidinsime skaičių nuo 0 ir parodysime jį 16x2 LCD ekrane. Kai tik paspaudžiamas mygtukas, LED įsijungia, o LCD ekrane rodoma „INTERRUPT“.
Pirmiausia nustatykite LCD kaiščių jungtis naudodami STM32. Galite jį modifikuoti pagal savo reikalavimus.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Toliau įtraukiame skystųjų kristalų ekrano antraštės failą. Tai iškviečia biblioteką, kurioje yra kodas, kaip STM32 turėtų bendrauti su LCD. Taip pat įsitikinkite, kad funkcija „ LiquidCrystal“ yra iškviesta su kaiščių pavadinimais, kuriuos ką tik apibrėžėme aukščiau.
įtraukti
Visuotiniai kintamieji naudojami duomenims perduoti tarp ISR ir pagrindinės programos. Mes skelbiame, kad kintamasis ledOn yra nepastovus, taip pat kaip Boolean, kad nurodytume teisingą arba klaidingą.
nepastovus loginis ledOn = klaidingas;
Funkcijos void setup () viduje mes parodysime intro pranešimą ir po 2 sekundžių jį išvalysime.
lcd.prade (16,2); lcd.print („CIRCUIT DIGEST“); vėlavimas (2000); lcd.clear ();
Vėlgi toje pačioje tuštumo nustatymo () funkcijoje turime nurodyti įvesties ir išvesties kaiščius. Mes nustatome kaištį PA1 išėjimui į LED ir PA0 įvestį iš mygtuko.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
Mes taip pat ketiname didinti skaičių, todėl deklaruokite kintamąjį, kurio vertė lygi nuliui.
int i = 0;
Dabar svarbi kodo dalis yra funkcija „ attachInterrupt ()“ , ji taip pat įtraukta į „ void setup“ ()
„attachInterrupt“ („DigitalPinToInterrupt“ (PA0), mygtukas nuspaustas, CHANGE)
Išoriniam pertraukimui nurodėme kaištį PA0 , o mygtukas „Paspaustas“ yra funkcija, kurią reikia iškviesti, kai PA0 kaište yra PAKEITIMAS (LOW to HIGH arba HIGH to LOW). Pagal reikalavimą taip pat galite naudoti bet kurį kitą funkcijos pavadinimą, kaištį ir režimą.
Tuščios kilpos () viduje mes padidiname skaičių (i) nuo nulio ir atspausdiname skaičių LCD (16x2).
lcd.clear (); lcd.print ("NUMERIS:"); lcd.print (i); ++ i; vėlavimas (1000);
Svarbiausia dalis yra pertraukimo tvarkytuvo funkcijos sukūrimas pagal pavadinimą, kurį naudojome funkcija attachInterrupt () . Mes naudojome mygtuką „Paspauskite“, todėl čia sukūrėme funkciją negaliojantis mygtukas
void buttonPressed () { if (ledOn) { ledOn = false; „digitalWrite“ (PA1, LOW); } dar { ledOn = tiesa; „digitalWrite“ (PA1, HIGH); lcd.setCursor (0,1); lcd.print („Nutraukti“); } }
Šio mygtuko veikimas Paspauskite () ISR:
Pagal kintamojo „ ledOn “ vertę šviesos diodas įsijungia ir išsijungia.
Mygtuko būsena |
ledOn (vertė) |
LED (raudona) |
LCD (16x2) |
NESPAUDŽIAMAS |
Klaidinga |
IŠJUNGTA |
- |
SPAUSTAS |
Tiesa |
ĮJUNGTA |
Rodo „INTERRUPT“ |
Jei „ ledOn“ vertė yra klaidinga, šviesos diodas lieka išjungtas ir, jei „ ledOn“ vertė yra teisinga, šviesos diodas įsijungia ir LCD ekrane rodoma „pertraukta“.
PASTABA: Kartais gali būti jungiklio atšaukimo efektas ir paspaudus mygtuką gali būti skaičiuojamas keli paleidimai, taip yra todėl, kad dėl mechaninių priežasčių, susijusių su mygtuko perjungimu, keli įtampos šuoliai. Tai galima sumažinti įvedus RC filtrą.
Visiškas pertraukimų veikimas STM32F103C8 parodytas žemiau esančiame vaizdo įraše.