- Vrste prekinitev in ISR
- Sintaksa za prekinitev v STM32
- Potrebne komponente
- Shema vezja in povezave
- Programiranje STM32F103C8 za prekinitve
Prekinitve so mehanizem, s katerim lahko V / I ali ukaz ustavi normalno izvajanje procesorja in se servisira, kot da ima najvišjo prioriteto. Tako kot na primer procesor, ki izvaja normalno izvajanje, lahko tudi neprekinjeno spremlja kakšen dogodek ali prekinitev. Takrat se zgodi zunanja prekinitev (kot pri kakšnem senzorju), nato procesor zaustavi normalno izvajanje in najprej prekine vročitev, nato pa nadaljuje normalno izvajanje.
V tem projektu bomo za razumevanje prekinitev v STM32F103C8 uporabili tipko kot zunanjo prekinitev. Tu bomo število povečali z 0 in ga prikazali na LCD-u 16x2, in kadar koli pritisnete gumb, se LED vklopi in LCD zaslon prikaže INTERRUPT. LED se izklopi takoj, ko se gumb sprosti.
Vrste prekinitev in ISR
Prekinitve lahko na splošno razvrstimo v dve vrsti:
Prekinitve strojne opreme: Če signal v procesor prihaja iz neke zunanje naprave, na primer gumba ali senzorja, ali iz druge strojne naprave, ki generira signal in naroči procesorju, naj opravi določeno nalogo, ki je v ISR, je znana kot strojna prekinitev.
Prekinitve programske opreme: Prekinitve, ki jih ustvarijo navodila za programsko opremo.
Rutinska storitev prekinitve
Rutina storitve prekinitve ali obdelovalec prekinitev je dogodek, ki vsebuje majhen nabor navodil, in ko pride do prekinitve, procesor najprej izvrši to kodo, ki je prisotna v ISR, in nato nadaljuje z nalogo, ki jo je opravljal pred prekinitvijo.
Sintaksa za prekinitev v STM32
ISR ima naslednjo sintakso attachInterrupt (digitalPinToInterrupt (pin), ISR, način) v Arduinu, enako pa lahko uporabimo tudi v STM32, saj za nalaganje kode uporabljamo arduino IDE.
- digitalPinToInterrupt (pin): Tako kot v Arduino plošči Uno imamo zatiči 2,3 in v mega imamo 2,3,18,19,20,21 za prekinitve. V STM32F103C8 imamo tudi prekinitvene nožice, katere koli GPIO nožice lahko uporabimo za prekinitve. Določimo samo vhodni pin, ki ga uporabljamo za prekinitev. Toda medtem ko uporabljamo več prekinitev hkrati, bomo morda morali upoštevati nekatere omejitve.
- ISR: To je funkcija obdelave prekinitev, ki se pokliče, ko pride do zunanje prekinitve. Nima argumentov in ničen tip vrnitve.
- Način: vrsta prehoda za sprožitev prekinitve
- RISING: sproži prekinitev, ko zatič preide iz LOW v HIGH.
- FALLING: sproži prekinitev, ko zatič preide iz HIGH v LOW.
- SPREMENI: sproži prekinitev, ko zatič preide iz LOW v HIGH ali HIGH v LOW (tj. Ko se zatič spremeni).
Nekateri pogoji med uporabo prekinitve
- Rutinska funkcija prekinitve (ISR) mora biti čim krajša.
- Funkcija Delay () znotraj ISR ne deluje in se ji je treba izogniti.
Potrebne komponente
- STM32F103C8
- Pritisni gumb
- LED
- Upor (10K)
- LCD (16x2)
Shema vezja in povezave
Ena stran zatiča gumba je priključena na 3.3V STM32, druga pa na vhodni zatič (PA0) STM32 prek spustnega upora.
Upor Pull Down se uporablja tako, da bo mikrokrmilnik na vhodu dobil HIGH ali LOW šele, ko pritisnete ali spustite gumb. V nasprotnem primeru se lahko MCU brez izvlečnega upora zmede in na vhod poda nekaj naključnih plavajočih vrednosti.
Povezava med STM32F103C8 in LCD
V spodnji tabeli je prikazana pin povezava med LCD (16X2) in mikrokrmilnikom STM32F103C8.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
Na kodo PIN Potentiometer Center |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
A |
GND |
K |
Programiranje STM32F103C8 za prekinitve
Program za to vadnico je preprost in podan na koncu te vaje. Za programiranje STM32 ne potrebujemo programerja FTDI, preprosto priključite računalnik na vrata USB STM32 in začnite programirati z Arduino IDE. Preberite več o programiranju STM32 prek vrat USB.
Kot smo že povedali, bomo tukaj v tej vadnici številko povečali z 0 in jo prikazali na LCD-u 16x2 in vsakič, ko pritisnete gumb, se LED vklopi in LCD zaslon prikaže 'INTERRUPT'.
Najprej s STM32 določite povezave zatičev LCD. Lahko ga spremenite v skladu z vašimi zahtevami.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Nato vključimo datoteko z glavo za LCD zaslon. To pokliče knjižnico, ki vsebuje kodo, kako naj STM32 komunicira z LCD-jem. Prepričajte se tudi, da je funkcija LiquidCrystal poklicana z imeni pinov, ki smo jih pravkar definirali zgoraj.
vključujejo
Globalne spremenljivke se uporabljajo za prenos podatkov med ISR in glavnim programom. Spremenljivko ledOn razglasimo za spremenljivo in tudi za logično vrednost, da določimo True ali False.
nestanovitna logična vrednost ledOn = false;
Znotraj funkcije void setup () bomo prikazali uvodno sporočilo in ga po 2 sekundah počistili.
lcd.begin (16,2); lcd.print ("DIGEST CIRCUIT"); zamuda (2000); lcd.clear ();
Spet pri isti funkciji void setup () moramo določiti vhodne in izhodne nožice. Nastavili smo pin PA1 za izhod na LED in PA0 za vhod s tipko.
pinMode (PA1, IZHOD) pinMode (PA0, INPUT)
Število bomo tudi povečali, zato prijavite spremenljivko z vrednostjo nič.
int i = 0;
Zdaj je pomemben del kode funkcija attachInterrupt () , vključena je tudi v void setup ()
attachInterrupt (digitalPinToInterrupt (PA0), buttonPress, CHANGE)
Določili smo pin PA0 za zunanjo prekinitev, buttonPress pa je funkcija, ki jo je treba poklicati, kadar je v pin PA0 CHANGE (LOW to HIGH ali HIGH to LOW). V skladu z zahtevo lahko uporabite tudi katero koli drugo ime funkcije, zatič in način.
Znotraj void zanke () povečamo število (i) od nič in številko natisnemo na LCD (16x2).
lcd.clear (); lcd.print ("ŠTEVILKA:"); lcd.print (i); ++ i; zamuda (1000);
Najpomembnejši del je ustvarjanje funkcije za obdelavo prekinitev v skladu z imenom, ki smo ga uporabili v funkciji attachInterrupt () . Uporabili smo gumbPress, zato smo tukaj ustvarili funkcijo void buttonPress ()
void buttonPress () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } else { ledOn = res; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Prekinitev"); } }
Delovanje tega gumba Pritisnite () ISR:
Glede na vrednost spremenljivke ledOn se LED vklopi in izklopi.
GUMBNA DRŽAVA |
ledOn (vrednost) |
LED (rdeča) |
LCD (16x2) |
NESPRESEN |
Lažno |
IZKLOPLJENO |
- |
TISKANO |
Prav |
VKLOPLJENO |
Oddaja '' PREKIN '' |
Če je vrednost ledOn false, LED ostane izklopljen in če je vrednost ledOn True, se LED vklopi in na LCD-prikazovalniku se prikaže 'Interrupt'.
OPOMBA: Včasih lahko pride do učinka izklopa stikala in ob pritisku na tipko lahko šteje več sprožilcev, to pa zato, ker je zaradi mehaničnega razloga preklopa gumba več konic napetosti. To lahko zmanjšamo z uvedbo RC filtra.
Popolno delovanje prekinitev v STM32F103C8 je prikazano v spodnjem videu.