- Keskeytystyypit ja ISR
- Syntaksi keskeytykselle STM32: ssä
- Tarvittavat komponentit
- Piirikaavio ja liitännät
- STM32F103C8: n ohjelmointi keskeytyksiä varten
Keskeytys on mekanismi, jolla I / O tai käsky voi keskeyttää prosessorin normaalin suorituksen ja saada itsensä palvelemaan kuten sillä on korkein prioriteetti. Kuten esimerkiksi normaalia suoritusta suorittava prosessori voi myös jatkuvasti tarkkailla jonkinlaista tapahtumaa tai keskeytystä. Silloin tapahtuu ulkoinen keskeytys (kuten joltakin anturilta), prosessori keskeyttää normaalin suorituksensa ja palvelee ensin keskeytystä ja jatkaa sitten normaalia suoritustaan.
Tässä projektissa STM32F103C8: n keskeytysten ymmärtämiseksi käytämme painikkeita ulkoisena keskeytyksenä. Tällöin kasvatamme lukua 0: sta ja näytämme sen 16x2 LCD: ssä, ja aina kun painat painiketta, led kytkeytyy PÄÄLLE ja nestekidenäytössä näkyy INTERRUPT. LED sammuu heti, kun painike vapautetaan.
Keskeytystyypit ja ISR
Keskeytykset voidaan luokitella laajasti kahteen tyyppiin:
Laitteiston keskeytykset: Jos signaali prosessorille on jostakin ulkoisesta laitteesta, kuten painikkeesta tai anturista, tai jostakin muusta laitteesta, joka tuottaa signaalin ja käskee prosessoria suorittamaan tietyn ISR: ssä olevan tehtävän, kutsutaan laitteiston keskeytyksiksi.
Ohjelmiston keskeytykset: Ohjelmiston ohjeiden tuottamat keskeytykset.
Keskeytä palvelurutiini
Keskeytyspalvelurutiini tai keskeytyskäsittelijä on tapahtuma, jossa on pieni joukko käskyjä, ja kun keskeytys tapahtuu, prosessori suorittaa ensin nämä ISR: ssä olevat koodit ja jatkaa sitten tehtävää, jota se teki ennen keskeytystä.
Syntaksi keskeytykselle STM32: ssä
ISR: llä on seuraava syntaksin attachInterrupt (digitalPinToInterrupt (pin), ISR, tila) Arduinossa ja samaa voidaan käyttää myös STM32: ssä, koska käytämme arduino IDE: tä koodin lataamiseen.
- digitalPinToInterrupt (tappi): Kuten Arduino-aluksella Unossa, meillä on nastoja 2,3 ja megana 2,3,18,19,20,21 keskeytyksiä varten. STM32F103C8: ssa on myös keskeytysnastoja, mitä GPIO-nastoja voidaan käyttää keskeytyksiin. Määritämme vain syöttötapin, jota käytämme keskeytykseen. Mutta samalla kun käytämme useampaa kuin yhtä keskeytystä samanaikaisesti, meidän on ehkä noudatettava joitain rajoituksia.
- ISR: Se on keskeytyskäsittelijä, jota kutsutaan ulkoisen keskeytyksen tapahtuessa. Sillä ei ole argumentteja ja mitätön palautustyyppi.
- Tila: Siirtymän tyyppi keskeytyksen käynnistämiseksi
- RISING: Käynnistää keskeytyksen, kun tappi siirtyy LOW-tilasta HIGH-tilaan.
- FALLING: Keskeytys, kun tappi siirtyy HIGH-tilasta LOW-tilaan.
- MUUTOS: Käynnistää keskeytyksen, kun tappi siirtyy LOW-tilasta HIGH- tai HIGH-tilasta LOW-tilaan (ts. Kun tappi vaihtuu).
Joitakin ehtoja keskeytystä käytettäessä
- Palvelun keskeytysrutiinitoiminnon (ISR) on oltava mahdollisimman lyhyt.
- Delay () -toiminto ei toimi ISR: n sisällä, ja sitä tulisi välttää.
Tarvittavat komponentit
- STM32F103C8
- Paina nappia
- LED
- Vastus (10K)
- LCD (16x2)
Piirikaavio ja liitännät
Painonapin toinen puoli on kytketty STM32: n 3,3 V: iin ja toinen puoli on kytketty STM32: n tulotappiin (PA0) alasvetovastuksen kautta.
Vedä alas -vastusta käytetään niin, että mikro-ohjain saa joko HIGH- tai LOW-arvon tulossaan, kun painiketta painetaan tai vapautetaan. Muuten, ilman alasvetovastusta, MCU voi sekoittua ja syöttää tuloon joitain satunnaisia kelluvia arvoja.
Yhteys STM32F103C8: n ja LCD: n välillä
Seuraava taulukko näyttää nastaliitännän LCD-näytön (16X2) ja STM32F103C8-mikrokontrollerin välillä.
STM32F103C8 |
LCD-näyttö |
GND |
VSS |
+ 5 V |
VDD |
Potentiometrin keskikoodiin |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5 V |
A |
GND |
K |
STM32F103C8: n ohjelmointi keskeytyksiä varten
Tämän opetusohjelman ohjelma on yksinkertainen ja annettu tämän opetusohjelman lopussa. Emme tarvitse FTDI-ohjelmoijaa STM32: n ohjelmointiin, liitä vain tietokoneesi STM32: n USB-porttiin ja aloita ohjelmointi Arduino IDE: llä. Lisätietoja STM32: n ohjelmoinnista USB-portin kautta.
Kuten sanoimme, että tässä opetusohjelmassa aiomme lisätä numeroa 0: sta ja näyttää sen 16x2 LCD: ssä ja aina kun painetaan painiketta, led menee PÄÄLLE ja LCD-näytössä näkyy 'INTERRUPT'.
Määritä ensin LCD- nastaliitännät STM32: lla. Voit muokata sitä tarpeidesi mukaan.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Seuraavaksi sisällytämme LCD-näytön otsikkotiedoston. Tämä kutsuu kirjaston, joka sisältää koodin, kuinka STM32: n tulisi olla yhteydessä nestekidenäyttöön. Varmista myös, että funktiota LiquidCrystal kutsutaan juuri määritellyillä pin-nimillä.
sisältää
Globaalia muuttujaa käytetään tietojen siirtämiseen ISR: n ja pääohjelman välillä. Julistamme muuttujan ledOn epävakaaksi ja myös totuusarvoksi tosi tai epätosi.
haihtuva looginen ledOn = epätosi;
Sisällä void setup () -toiminto, näytämme intro viestin ja poistaa sen 2 sekunnin kuluttua.
lcd-alku (16,2); lcd.print ("CIRCUIT DIGEST"); viive (2000); lcd.clear ();
Jälleen samassa void setup () -toiminnossa meidän on määritettävä sisääntulo- ja lähtönastat. Asetamme nastan PA1 ulostuloksi LEDiksi ja PA0 tuloksi painikkeesta.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
Aiomme myös lisätä lukua, joten ilmoita muuttuja, jonka arvo on nolla.
int i = 0;
Nyt koodin tärkeä osa on attachInterrupt () -toiminto, se sisältyy myös void setup () -ohjelmaan
attachInterrupt (digitalPinToInterrupt (PA0), painike painettuna, CHANGE)
Määritimme nastan PA0 ulkoiselle keskeytykselle, ja buttonPressed on toiminto, joka on kutsuttava, kun PA0-nastassa on CHANGE (LOW to HIGH tai HIGH to LOW). Voit myös käyttää mitä tahansa muuta toiminnon nimeä, nastaa ja tilaa vaatimusten mukaan.
Tyhjän silmukan () sisällä kasvatamme lukua (i) nollasta ja tulostamme numeron nestekidenäytössä (16x2).
lcd.clear (); lcd.print ("NUMBER:"); lcd.print (i); ++ i; viive (1000);
Tärkein osa on keskeytyskäsittelyfunktion luominen nimen mukaan, jota käytimme attachInterrupt () -toiminnossa. Käytimme buttonPressed-painiketta, joten tässä olemme luoneet toiminnon void buttonPressed ()
void buttonPressed () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } else { ledOn = tosi; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Keskeytys"); } }
Työskentely tämän buttonPressed () ISR:
LEDOn- muuttujan arvon mukaan LED syttyy ja sammuu.
PAINIKEEN TILA |
ledOn (Arvo) |
LED (punainen) |
LCD (16x2) |
PAINAMATON |
Väärä |
VINOSSA |
- |
PAINETTU |
Totta |
PÄÄLLÄ |
Näyttää '' INTERRUPT '' |
Jos ledOn- arvo on väärä, LED pysyy sammutettuna ja jos ledOn- arvo on tosi, LED syttyy ja nestekidenäytössä näkyy 'Keskeytä'.
HUOMAUTUS: Kytkimen poistumisvaikutus voi joskus olla ja se voi laskea useita laukaisimia, kun painiketta painetaan, tämä johtuu siitä, että useita jännitepiikkejä johtuu mekaanisesta syystä painikkeen vaihtamiseen. Tätä voidaan vähentää ottamalla käyttöön RC-suodatin.
STM32F103C8: n keskeytysten täydellinen toiminta on esitetty alla olevassa videossa.