- A megszakítások típusai és az ISR
- Szintaktika megszakításhoz az STM32-ben
- Szükséges alkatrészek
- Áramkör és kapcsolatok
- STM32F103C8 programozása megszakításokra
A megszakítás egy olyan mechanizmus, amellyel egy I / O vagy egy utasítás felfüggesztheti a processzor normál végrehajtását, és úgy szervizeli magát, mint a legnagyobb prioritással. Például egy normál végrehajtást végző processzor is folyamatosan figyelheti valamilyen esemény vagy megszakítás bekövetkezését. Ekkor történik egy külső megszakítás (mint valami érzékelőtől), majd a processzor szünetelteti a normál végrehajtását, és először kiszolgálja a megszakítást, majd folytatja a normál végrehajtást.
Ebben a projektben az STM32F103C8 megszakításainak megértéséhez a nyomógombot használjuk külső megszakításként. Itt 0-tól növekszünk egy számot, és megjelenítjük a 16x2 LCD-n, és amikor a nyomógombot megnyomjuk, a led bekapcsol és az LCD-kijelzőn az INTERRUPT felirat látható. A LED kialszik, amint a gombot elengedi.
A megszakítások típusai és az ISR
A megszakításokat nagyjából két típusba sorolhatjuk:
Hardver megszakítások: Ha a processzorhoz érkező jel valamilyen külső eszközről származik, például gombról vagy érzékelőről, vagy valamilyen más hardver eszközről, amely jelet generál, és utasítja a processzort, hogy hajtsa végre az ISR-ben található bizonyos feladatokat, akkor hardver megszakításnak nevezzük.
Szoftver megszakítások: A szoftver utasítások által létrehozott megszakítások.
Szolgáltatás megszakítása
A megszakító szolgáltatás rutin vagy a megszakítás kezelő olyan esemény, amelyben kis számú utasítás van, és amikor megszakítás történik, a processzor először végrehajtja ezeket az ISR-ben található kódokat, majd folytatja azt a feladatot, amelyet a megszakítás előtt végzett.
Szintaktika megszakításhoz az STM32-ben
Az ISR a következő szintaxist használja az attachInterrupt (digitalPinToInterrupt (pin), ISR, mód) Arduino-ban, és ugyanez használható az STM32-ben is, mivel az arduino IDE-t használjuk a kód feltöltésére.
- digitalPinToInterrupt (pin): Az Undu Arduino táblához hasonlóan 2,3 csapunk van, megában 2,3,18,19,20,21 a megszakításokhoz. Az STM32F103C8-ban megszakító csapok is vannak, bármely GPIO csap használható megszakításokhoz. Csak meg kell határoznunk azt a bemeneti tűt, amelyet a megszakításhoz használunk. De ha egyszerre több megszakítást is használunk, előfordulhat, hogy be kell tartanunk néhány korlátozást.
- ISR: Ez egy megszakításkezelő funkció, amelyet külső megszakítás esetén hívnak meg. Nincsenek argumentumai és érvénytelen return típusa.
- Mód: Az átmenet típusa a megszakítás kiváltásához
- RISING: Megszakítás kiváltására, amikor a csap a LOW-ról HIGH-ra vált
- FALLING: Megszakítás kiváltására, amikor a csap a HIGH-ról LOW-ra vált
- VÁLTOZÁS: Megszakítás kiváltására, amikor a csap a LOW-ról HIGH-ra vagy HIGH-ról LOW-ra vált (azaz amikor a pin megváltozik).
Néhány feltétel a megszakítás használata közben
- A szolgáltatás megszakításának rutin funkciójának (ISR) a lehető legrövidebbnek kell lennie.
- A késleltetés () függvény nem működik az ISR-en belül, ezért kerülni kell.
Szükséges alkatrészek
- STM32F103C8
- Nyomógomb
- VEZETTE
- Ellenállás (10K)
- LCD (16x2)
Áramkör és kapcsolatok
A nyomógomb csap egyik oldala az STM32 3,3 V-hoz, a másik oldal pedig az STM32 bemeneti tűjéhez (PA0) van csatlakoztatva egy lehúzható ellenálláson keresztül.
A lehúzható ellenállást úgy használják, hogy a mikrovezérlő csak HIGH vagy LOW jelet kapjon a bemeneténél, amikor a gombot megnyomják vagy elengedik. Ellenkező esetben lehúzható ellenállás nélkül az MCU megzavarodhat, és néhány véletlenszerű lebegő értéket táplálhat a bemenetre.
Csatlakozás az STM32F103C8 és az LCD között
Az alábbi táblázat az LCD (16X2) és az STM32F103C8 mikrovezérlő közötti tűkapcsolatot mutatja.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
A potenciométer középső PIN-kódjához |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
A |
GND |
K |
STM32F103C8 programozása megszakításokra
A bemutató programja egyszerű, és a bemutató végén található. Az STM32 programozásához nincs szükségünk FTDI programozóra, egyszerűen csatlakoztassa számítógépét az STM32 USB portjához, és kezdje el a programozást az Arduino IDE segítségével. További információ az STM32 USB porton keresztüli programozásáról.
Mint mondtuk, itt ebben az oktatóanyagban 0-tól növekszünk egy számot, és megjelenítjük a 16x2 LCD-n, és amikor egy nyomógombot megnyomunk, a led bekapcsol és az LCD-kijelzőn az „INTERRUPT” felirat látható.
Először határozza meg az LCD csapok csatlakozásait az STM32 segítségével. Az igényei szerint módosíthatja.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Ezután felvesszük az LCD kijelző fejlécfájlját. Ez meghívja azt a könyvtárat, amely tartalmazza az STM32 és az LCD közötti kommunikáció kódját. Győződjön meg arról is, hogy a LiquidCrystal függvényt meghívják- e a fent megadott pin nevekkel.
tartalmazza
Globális változókat használnak az adatok továbbítására az ISR és a fő program között. A ledOn változót volatilisnak, valamint logikai értéknek nyilvánítjuk a True vagy False megadásához.
volatilis logikai ledOn = hamis;
A void setup () függvényen belül egy intro üzenetet jelenítünk meg, és 2 másodperc múlva töröljük.
lcdbegin (16,2); lcd.print ("CIRCUIT DIGEST"); késés (2000); lcd.clear ();
Ismét ugyanazon void setup () függvényben meg kell adnunk a bemeneti és kimeneti csapokat. A kimenethez a PA1 tűt LED-re, a PA0-t a nyomógombról történő bemenetre állítjuk.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
Számot is növelni fogunk, ezért deklaráljunk egy változót nulla értékkel.
int i = 0;
Most a kód fontos része a attachInterrupt () függvény, ez is benne van a void setup ()
attachInterrupt (digitalPinToInterrupt (PA0), buttonPressed, CHANGE)
Megadtuk a PA0 tűt a külső megszakításhoz, és a buttonPressed funkció az, amelyet akkor kell meghívni, ha a PA0 tűben van CHANGE (LOW to HIGH vagy HIGH to LOW). Bármely más funkciónevet, csapot és módot is használhat a követelményeknek megfelelően.
A void loop () belsejében számot (i) növekszünk nulláról, és kinyomtatjuk a számot az LCD-ben (16x2).
lcd.clear (); lcd.print ("SZÁM:"); lcd.print (i); ++ i; késés (1000);
A legfontosabb rész egy megszakításkezelő függvény létrehozása az attachInterrupt () függvényben használt név szerint. A buttonPressed gombot használtuk, így itt létrehoztunk egy void buttonPressed () függvényt
void buttonPressed () { if (ledOn) { ledOn = hamis; digitalWrite (PA1, LOW); } else { ledOn = igaz; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Megszakítás"); } }
A gomb működése Nyomva () ISR:
A ledOn változó értéke szerint a LED be- és kikapcsol.
GOMB ÁLLAM |
ledOn (Érték) |
LED (piros) |
LCD (16x2) |
NYOMTATLAN |
Hamis |
KI |
- |
SAJTOLT |
Igaz |
TOVÁBB |
Mutatja az „INTERRUPT” |
Ha a ledOn értéke hamis, akkor a LED nem világít, és ha a ledOn értéke True, akkor a LED kigyullad, és az LCD kijelzőn az „Interrupt” felirat látható.
MEGJEGYZÉS: Néha előfordulhat kapcsoló visszavonási effektus, és a nyomógomb megnyomásakor többszörös kiváltást számíthat, ez azért van, mert a nyomógomb mechanikus oka miatt több feszültségcsúcs is fellép. Ez csökkenthető RC szűrő bevezetésével.
Az STM32F103C8 megszakításainak teljes működését az alábbi videó mutatja.