- Typy prerušenia a ISR
- Syntax pre prerušenie v STM32
- Súčasti sú povinné
- Schéma zapojenia a zapojenia
- Programovanie STM32F103C8 pre prerušenia
Prerušenia sú mechanizmy, pomocou ktorých môže I / O alebo inštrukcia pozastaviť bežné vykonávanie procesora a nechať sa obsluhovať, akoby mal najvyššiu prioritu. Rovnako ako napríklad procesor, ktorý vykonáva bežné vykonávanie, môže tiež nepretržite monitorovať výskyt nejakej udalosti alebo prerušenia. To znamená, že keď dôjde k externému prerušeniu (ako od niektorého snímača), potom procesor pozastaví svoje bežné vykonávanie a najskôr vykoná prerušenie a potom pokračuje v normálnom vykonávaní.
Tu v tomto projekte, na pochopenie prerušenia v STM32F103C8, použijeme tlačidlo ako externé prerušenie. Tu zvýšime číslo od 0 a zobrazíme ho na 16x2 LCD. Vždy, keď stlačíte tlačidlo, LED sa zapne a na LCD displeji sa zobrazí PRERUŠENÍ. LED dióda zhasne hneď po uvoľnení tlačidla.
Typy prerušenia a ISR
Prerušenia možno zhruba rozdeliť do dvoch typov:
Hardvérové prerušenia: Ak signál do procesora pochádza z nejakého externého zariadenia, ako je tlačidlo alebo senzor, alebo z iného hardvérového zariadenia, ktoré generuje signál a informuje procesor, aby vykonal konkrétnu úlohu prítomnú v ISR, je známy ako hardvérové prerušenie.
Softvérové prerušenia: prerušenia, ktoré sú generované softvérovými pokynmi.
Rutina prerušenia služby
Rutina prerušenia služby alebo obslužná rutina prerušenia je udalosť, ktorá má v sebe malú sadu pokynov a keď dôjde k prerušeniu, procesor najskôr vykoná tento kód, ktorý je prítomný v ISR, a potom pokračuje v úlohe, ktorú robil pred prerušením.
Syntax pre prerušenie v STM32
ISR má v Arduine nasledujúcu syntaxu attachInterrupt (digitalPinToInterrupt (pin), ISR, režim) a to isté sa dá použiť aj v STM32, pretože na nahrávanie kódu používame arduino IDE.
- digitalPinToInterrupt (pin): Rovnako ako na doske Arduino Uno máme kolíky 2,3 a v mega máme 2,3,18,19,20,21 za prerušenia. V STM32F103C8 máme tiež prerušovacie piny, na prerušenie je možné použiť akékoľvek piny GPIO. Len sme určili vstupný pin, ktorý používame na prerušenie. Pri používaní viacerých prerušení súčasne však bude možno potrebné dodržiavať určité obmedzenia.
- ISR: Je to funkcia obsluhy prerušenia, ktorá sa volá, keď dôjde k externému prerušeniu. Nemá žiadne argumenty a neplatný návratový typ.
- Režim: Typ prechodu na spustenie prerušenia
- RISING: Na spustenie prerušenia, keď sa kolík prepne z LOW na HIGH.
- PÁD: Na spustenie prerušenia pri prechode kolíka z HIGH na LOW.
- ZMENA: Spustenie prerušenia, keď sa kolík prepne z LOW na HIGH alebo HIGH na LOW (tj. Keď sa pin zmení).
Niektoré podmienky pri používaní prerušenia
- Funkcia prerušenia servisnej rutiny (ISR) musí byť čo najkratšia.
- Funkcia Delay () vo vnútri ISR nefunguje a je potrebné sa jej vyhnúť.
Súčasti sú povinné
- STM32F103C8
- Stlačte tlačidlo
- LED
- Rezistor (10K)
- LCD (16x2)
Schéma zapojenia a zapojenia
Jedna strana tlačidlového kolíka je pripojená k 3,3 V STM32 a druhá strana je pripojená k vstupnému kolíku (PA0) STM32 pomocou sťahovacieho odporu.
Pull Down rezistor sa používa tak, že mikrokontrolér dostane na vstupe buď HIGH alebo LOW, keď je stlačené alebo uvoľnené tlačidlo. V opačnom prípade by sa bez vyťahovacieho rezistora mohlo MCU zmiasť a napájať na vstup nejaké náhodné pohyblivé hodnoty.
Prepojenie medzi STM32F103C8 a LCD
Nasledujúca tabuľka zobrazuje pinové spojenie medzi LCD (16X2) a mikrokontrolérom STM32F103C8.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
Na stredový PIN potenciometra |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
A |
GND |
K |
Programovanie STM32F103C8 pre prerušenia
Program pre tento tutoriál je jednoduchý a je uvedený na konci tohto tutoriálu. Na programovanie STM32 nepotrebujeme programátor FTDI, jednoducho pripojte počítač k USB portu STM32 a začnite programovať pomocou Arduino IDE. Získajte viac informácií o programovaní STM32 cez USB port.
Ako sme už povedali, tu v tomto tutoriále zvýšime číslo od 0 a zobrazíme ho na 16x2 LCD. Po každom stlačení tlačidla sa LED rozsvieti a na LCD displeji sa zobrazí „INTERRUPT“.
Najskôr definujte pripojenia pinov LCD so STM32. Môžete ho upraviť podľa svojich požiadaviek.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Ďalej zahrnieme hlavičkový súbor pre LCD displej. Toto zavolá knižnicu, ktorá obsahuje kód, ako má STM32 komunikovať s LCD. Uistite sa tiež, že funkcia LiquidCrystal je volaná s názvami pinov, ktoré sme práve definovali vyššie.
zahrnúť
Globálne premenné sa používajú na prenos údajov medzi ISR a hlavným programom. Deklarujeme premennú LEDON ako nestále a tiež ako Boolean špecifikovať True alebo False.
volatile boolean ledOn = false;
Vo vnútri funkcie void setup () zobrazíme úvodnú správu a po 2 sekundách ju vymažeme.
lcd.začiatok (16,2); lcd.print ("OKRUH DIGEST"); meškanie (2000); lcd.clear ();
Opäť v tej istej funkcii void setup () musíme špecifikovať vstupné a výstupné piny. Nastavili sme pin PA1 pre výstup na LED a PA0 pre vstup z tlačidla.
pinMode (PA1, VÝSTUP) pinMode (PA0, VSTUP)
Chystáme sa tiež zvýšiť číslo, takže deklarujeme premennú s hodnotou nula.
int i = 0;
Dôležitou súčasťou kódu je teraz funkcia attachInterrupt () , ktorá je tiež zahrnutá do void setup ().
attachInterrupt (digitalPinToInterrupt (PA0), stlačené tlačidlo, ZMENIŤ)
Zadali sme pin PA0 pre externé prerušenie a buttonPressed je funkcia, ktorá sa má volať, keď je v pinu PA0 CHANGE (LOW to HIGH alebo HIGH to LOW). Môžete tiež použiť ľubovoľný iný názov funkcie, pin a režim podľa požiadavky.
Vo vnútri neplatnej slučky () zvýšime číslo (i) od nuly a vytlačíme ho na LCD (16x2).
lcd.clear (); lcd.print ("ČÍSLO:"); lcd.print (i); ++ i; oneskorenie (1 000);
Najdôležitejšou časťou je vytvorenie funkcie obsluhy prerušenia podľa názvu, ktorý sme použili vo funkcii attachInterrupt () . Použili sme buttonPressed, takže sme tu vytvorili funkciu void buttonPressed ()
void buttonPressed () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } else { ledOn = true; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Prerušiť"); } }
Fungovanie tohto tlačidla Stlačené () ISR:
Podľa hodnoty premennej ledOn sa LED rozsvieti a zhasne.
STAV TLAČIDIEL |
ledOn (hodnota) |
LED (červená) |
LCD (16x2) |
NESTLAČENÉ |
Falošné |
VYPNUTÉ |
- |
STLAČENÉ |
Pravdaže |
ZAP |
Zobrazuje '' PRERUŠENIE ' |
Ak je hodnota ledOn falošná, potom LED zostane zhasnutá a ak je hodnota ledOn True, potom sa LED rozsvieti a na LCD displeji sa zobrazí „Interrupt“.
POZNÁMKA: Niekedy môže dôjsť k efektu odrazu prepínača a ten môže počítať viacnásobné spustenie po stlačení tlačidla, je to preto, že niekoľko hrotov napätia je z mechanického dôvodu prepínania tlačidla. To je možné znížiť zavedením RC filtra.
Kompletné fungovanie prerušenia v STM32F103C8 je zobrazené na nasledujúcom videu.