- Druhy přerušení a ISR
- Syntaxe přerušení v STM32
- Požadované komponenty
- Schéma zapojení a zapojení
- Programování STM32F103C8 pro přerušení
Přerušení je mechanismus, pomocí kterého může I / O nebo instrukce pozastavit normální provádění procesoru a nechat se obsluhovat, jako by měl nejvyšší prioritu. Stejně jako například procesor, který provádí normální provádění, může také nepřetržitě sledovat výskyt nějakého druhu události nebo přerušení. To znamená, že když dojde k externímu přerušení (jako u nějakého senzoru), pak procesor pozastaví své normální provádění a nejprve obslouží přerušení a poté pokračuje v normálním provádění.
Tady v tomto projektu, pro pochopení přerušení v STM32F103C8, použijeme tlačítko jako externí přerušení. Zde zvýšíme číslo od 0 a zobrazíme jej na 16x2 LCD, a kdykoli je stisknuto tlačítko, LED se rozsvítí a na LCD displeji se zobrazí PŘERUŠENÍ. LED dioda zhasne, jakmile je tlačítko uvolněno.
Druhy přerušení a ISR
Přerušení lze obecně rozdělit na dva typy:
Hardwarové přerušení: Pokud signál do procesoru pochází z nějakého externího zařízení, jako je tlačítko nebo senzor, nebo z nějakého jiného hardwarového zařízení, které generuje signál a řekne procesoru, aby provedl konkrétní úkol přítomný v ISR, je to známé jako hardwarové přerušení.
Softwarová přerušení: Přerušení generovaná softwarovými pokyny.
Přerušit rutinu služby
Rutina přerušení služby nebo obsluha přerušení je událost, která obsahuje malou sadu instrukcí, a když dojde k přerušení, procesor nejprve provede tento kód, který je přítomen v ISR, a poté pokračuje v úkolu, který dělal před přerušením.
Syntaxe přerušení v STM32
ISR má v Arduinu následující syntaxi attachInterrupt (digitalPinToInterrupt (pin), ISR, režim) a to samé lze použít i v STM32, protože k nahrávání kódu používáme Arduino IDE.
- digitalPinToInterrupt (pin): Stejně jako na desce Arduino Uno máme piny 2,3 a v mega máme 2,3,18,19,20,21 za přerušení. V STM32F103C8 máme také piny přerušení, pro přerušení lze použít jakékoli piny GPIO. Stačí zadat vstupní kolík, který používáme pro přerušení. Při používání více než jednoho přerušení současně však možná budeme muset dodržovat určitá omezení.
- ISR: Jedná se o funkci obsluhy přerušení, která se volá, když dojde k externímu přerušení. Nemá žádné argumenty a neplatný návratový typ.
- Režim: Typ přechodu pro spuštění přerušení
- RISING: Ke spuštění přerušení, když kolík přechází z LOW na HIGH.
- FALLING: Chcete-li spustit přerušení, když kolík přechází z HIGH do LOW.
- ZMĚNA: Chcete-li spustit přerušení, když se kolík přepne z LOW na HIGH nebo HIGH na LOW (tj. Když se pin změní).
Některé podmínky při používání přerušení
- Funkce přerušení servisní rutiny (ISR) musí být co nejkratší.
- Funkce Delay () nefunguje uvnitř ISR a je třeba se jí vyhnout.
Požadované komponenty
- STM32F103C8
- Stiskněte tlačítko
- VEDENÝ
- Rezistor (10K)
- LCD (16x2)
Schéma zapojení a zapojení
Jedna strana kolíku tlačítka je připojena k 3,3 V STM32 a druhá strana je připojena ke vstupnímu kolíku (PA0) STM32 pomocí stahovacího odporu.
Pull Down rezistor se používá tak, že mikrokontrolér dostane na svém vstupu pouze VYSOKÝ nebo NÍZKÝ po stisknutí nebo uvolnění tlačítka. V opačném případě by se MCU mohlo bez vytažení rezistoru zmást a napájet na vstup některé náhodné plovoucí hodnoty.
Propojení mezi STM32F103C8 a LCD
Následující tabulka ukazuje pinové spojení mezi LCD (16X2) a mikrokontrolérem STM32F103C8.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
Na středový PIN potenciometru |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
A |
GND |
K. |
Programování STM32F103C8 pro přerušení
Program pro tento kurz je jednoduchý a je uveden na konci tohoto kurzu. K programování STM32 nepotřebujeme programátor FTDI, jednoduše připojte počítač k USB portu STM32 a začněte programovat pomocí Arduino IDE. Zjistěte více o programování STM32 přes USB port.
Jak jsme řekli, zde v tomto tutoriálu zvýšíme číslo od 0 a zobrazíme jej na 16x2 LCD a kdykoli je stisknuto tlačítko, LED se rozsvítí a LCD displej zobrazí „PŘERUŠENÍ“.
Nejprve definujte připojení pinů LCD se STM32. Můžete jej upravit podle svých požadavků.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Dále zahrneme soubor záhlaví pro LCD displej. Toto volá knihovnu, která obsahuje kód, jak má STM32 komunikovat s LCD. Také se ujistěte, že funkce LiquidCrystal je volána s názvy pinů, které jsme právě definovali výše.
zahrnout
Globální proměnné se používají k přenosu dat mezi ISR a hlavním programem. Proměnnou ledOn deklarujeme jako volatilní a také jako Boolean, abychom určili True nebo False.
volatile boolean ledOn = false;
Uvnitř funkce void setup () zobrazíme úvodní zprávu a po 2 sekundách ji vymažeme.
lcd.begin (16,2); lcd.print ("OKRUH DIGEST"); zpoždění (2000); lcd.clear ();
Opět ve stejné funkci void setup () musíme specifikovat vstupní a výstupní piny. Nastavili jsme pin PA1 pro výstup na LED a PA0 pro vstup z tlačítka.
pinMode (PA1, VÝSTUP) pinMode (PA0, VSTUP)
Chystáme se také zvýšit číslo, takže deklarujeme proměnnou s hodnotou nula.
int i = 0;
Nyní je důležitou součástí kódu funkce attachInterrupt () , která je také obsažena uvnitř void setup ()
attachInterrupt (digitalPinToInterrupt (PA0), stisknuto tlačítko, ZMĚNA)
Zadali jsme pin PA0 pro externí přerušení a buttonPressed je funkce, která má být vyvolána, když je v pin PA0 CHANGE (LOW to HIGH nebo HIGH to LOW). Můžete také použít jakýkoli jiný název funkce, pin a režim podle požadavku.
Uvnitř smyčky void () zvýšíme číslo (i) od nuly a vytiskneme číslo na LCD (16x2).
lcd.clear (); lcd.print ("ČÍSLO:"); lcd.print (i); ++ i; zpoždění (1000);
Nejdůležitější částí je vytvoření funkce obsluhy přerušení podle názvu, který jsme použili ve funkci attachInterrupt () . Použili jsme buttonPressed, takže jsme zde vytvořili funkci void buttonPressed ()
void buttonPressed () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } else { ledOn = true; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Přerušení"); } }
Fungování tohoto tlačítka Pressed () ISR:
Podle hodnoty proměnné ledOn se LED rozsvítí a zhasne.
STAV TLAČÍTKA |
ledOn (hodnota) |
LED (červená) |
LCD (16x2) |
NESTLAČENÝ |
Nepravdivé |
VYPNUTO |
- |
STLAČENO |
Skutečný |
NA |
Zobrazuje '' PŘERUŠENÍ ' |
Pokud je hodnota ledOn falešná, pak LED zůstane zhasnutá a pokud je hodnota ledOn True, LED se rozsvítí a na LCD displeji se zobrazí „Interrupt“.
POZNÁMKA: Někdy může dojít k efektu odrazu spínače a může to počítat vícenásobné spuštění při stisknutí tlačítka, je to proto, že několik špiček napětí kvůli mechanickému důvodu přepínání tlačítka. To lze snížit zavedením RC filtru.
Kompletní fungování přerušení v STM32F103C8 je uvedeno v následujícím videu.