- Arten von Interrupts und ISR
- Syntax für Interrupt in STM32
- Erforderliche Komponenten
- Schaltplan und Anschlüsse
- Programmierung von STM32F103C8 für Interrupts
Interrupts ist ein Mechanismus, mit dem eine E / A oder ein Befehl die normale Ausführung des Prozessors unterbrechen und sich so warten lassen kann, als hätte er die höchste Priorität. Wie zum Beispiel kann ein Prozessor, der eine normale Ausführung ausführt, auch kontinuierlich überwachen, ob ein Ereignis oder eine Unterbrechung auftritt. Wenn ein externer Interrupt auftritt (wie bei einem Sensor), pausiert der Prozessor seine normale Ausführung und bedient zuerst den Interrupt und setzt dann seine normale Ausführung fort.
Um die Interrupts in STM32F103C8 zu verstehen, verwenden wir hier in diesem Projekt den Druckknopf als externen Interrupt. Hier erhöhen wir eine Zahl von 0 und zeigen sie auf dem 16x2-LCD an. Wenn der Druckknopf gedrückt wird, wird die LED eingeschaltet und auf dem LCD-Display wird INTERRUPT angezeigt. Die LED erlischt, sobald die Taste losgelassen wird.
Arten von Interrupts und ISR
Interrupts können grob in zwei Typen eingeteilt werden:
Hardware-Interrupts: Wenn das Signal an den Prozessor von einem externen Gerät wie einer Taste oder einem Sensor oder von einem anderen Hardware-Gerät stammt, das ein Signal erzeugt und den Prozessor anweist, eine bestimmte in ISR vorhandene Aufgabe auszuführen, wird dies als Hardware-Interrupt bezeichnet.
Software-Interrupts: Die Interrupts, die durch die Softwareanweisungen generiert werden.
Serviceroutine unterbrechen
Die Interrupt-Serviceroutine oder ein Interrupt-Handler ist ein Ereignis mit einem kleinen Satz von Anweisungen. Wenn ein Interrupt auftritt, führt der Prozessor zuerst diesen in ISR vorhandenen Code aus und fährt dann mit der Aufgabe fort, die er vor dem Interrupt ausgeführt hat.
Syntax für Interrupt in STM32
ISR hat die folgende Syntax attachInterrupt (digitalPinToInterrupt (Pin), ISR, Modus) in Arduino und dieselbe kann auch in STM32 verwendet werden, da wir die Arduino-IDE zum Hochladen von Code verwenden.
- digitalPinToInterrupt (Pin): Wie bei Arduino Board Uno haben wir Pins 2,3 und in Mega haben wir 2,3,18,19,20,21 für Interrupts. In STM32F103C8 haben wir auch Interrupt-Pins. Alle GPIO-Pins können für Interrupts verwendet werden. Wir geben nur den Eingangspin an, den wir für den Interrupt verwenden. Wenn Sie jedoch mehr als einen Interrupt gleichzeitig verwenden, müssen Sie möglicherweise einige Einschränkungen beachten.
- ISR: Dies ist eine Interrupt-Handler-Funktion, die aufgerufen wird, wenn ein externer Interrupt auftritt. Es hat keine Argumente und keinen Rückgabetyp.
- Modus: Art des Übergangs zum Auslösen des Interrupts
- RISING: Zum Auslösen eines Interrupts, wenn der Pin von LOW nach HIGH wechselt.
- FALLING: Zum Auslösen eines Interrupts, wenn der Pin von HIGH nach LOW wechselt.
- ÄNDERN: Zum Auslösen eines Interrupts, wenn der Pin entweder von LOW nach HIGH oder von HIGH nach LOW wechselt (dh wenn sich der Pin ändert).
Einige Bedingungen bei Verwendung von Interrupt
- Die Interrupt Service Routine-Funktion (ISR) muss so kurz wie möglich sein.
- Die Funktion Delay () funktioniert nicht innerhalb von ISR und sollte vermieden werden.
Erforderliche Komponenten
- STM32F103C8
- Druckknopf
- LED
- Widerstand (10K)
- LCD (16x2)
Schaltplan und Anschlüsse
Eine Seite des Druckknopfstifts ist mit 3,3 V des STM32 verbunden, und die andere Seite ist über einen Pulldown-Widerstand mit dem Eingangsstift (PA0) des STM32 verbunden.
Der Pull-Down-Widerstand wird verwendet, damit der Mikrocontroller an seinem Eingang nur dann entweder HIGH oder LOW erhält, wenn die Taste gedrückt oder losgelassen wird. Andernfalls kann die MCU ohne Pulldown-Widerstand verwirrt werden und dem Eingang einige zufällige schwebende Werte zuführen.
Verbindung zwischen STM32F103C8 und LCD
Die folgende Tabelle zeigt die Pin-Verbindung zwischen dem LCD (16X2) und dem STM32F103C8-Mikrocontroller.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
Zur Potentiometer-Center-PIN |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E. |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
EIN |
GND |
K. |
Programmierung von STM32F103C8 für Interrupts
Das Programm für dieses Tutorial ist einfach und wird am Ende dieses Tutorials angegeben. Wir brauchen keinen FTDI-Programmierer, um STM32 zu programmieren. Schließen Sie einfach Ihren PC an den USB-Anschluss von STM32 an und beginnen Sie mit der Programmierung mit Arduino IDE. Weitere Informationen zum Programmieren von STM32 über den USB-Anschluss.
Wie bereits erwähnt, erhöhen wir hier in diesem Tutorial eine Zahl von 0 und zeigen sie auf dem 16x2-LCD an. Wenn ein Druckknopf gedrückt wird, leuchtet die LED auf und auf dem LCD-Display wird 'INTERRUPT' angezeigt.
Definieren Sie zuerst die LCD-Pins- Verbindungen mit STM32. Sie können es gemäß Ihren Anforderungen ändern.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Als nächstes fügen wir die Header-Datei für die LCD-Anzeige hinzu. Dies ruft die Bibliothek auf, die den Code für die Kommunikation des STM32 mit dem LCD enthält. Stellen Sie außerdem sicher, dass die Funktion LiquidCrystal mit den oben definierten Pin-Namen aufgerufen wird.
einschließen
Globale Variablen werden verwendet, um Daten zwischen ISR und dem Hauptprogramm zu übertragen. Wir deklarieren die Variable ledOn als flüchtig und auch als boolesch, um True oder False anzugeben.
flüchtige boolesche ledOn = false;
In der Funktion void setup () wird eine Intro-Meldung angezeigt und nach 2 Sekunden gelöscht.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); Verzögerung (2000); lcd.clear ();
Wiederum müssen wir in derselben void setup () -Funktion die Eingangs- und Ausgangspins angeben. Wir setzen Pin PA1 für die Ausgabe auf LED und PA0 für die Eingabe vom Druckknopf.
PinMode (PA1, OUTPUT) PinMode (PA0, INPUT)
Wir werden auch eine Zahl inkrementieren, also deklarieren Sie eine Variable mit dem Wert Null.
int i = 0;
Jetzt ist der wichtige Teil des Codes die Funktion attachInterrupt () , die auch im void setup () enthalten ist.
attachInterrupt (digitalPinToInterrupt (PA0), buttonPressed, CHANGE)
Wir haben den Pin PA0 für den externen Interrupt angegeben, und buttonPressed ist die Funktion, die aufgerufen werden soll, wenn der PA0- Pin geändert wird (LOW to HIGH oder HIGH to LOW). Sie können je nach Anforderung auch einen anderen Funktionsnamen, Pin und Modus verwenden.
Innerhalb der Void-Schleife () erhöhen wir eine Zahl (i) von Null und drucken die Zahl auf dem LCD (16x2).
lcd.clear (); lcd.print ("NUMBER:"); lcd.print (i); ++ i; Verzögerung (1000);
Der wichtigste Teil ist das Erstellen einer Interrupt-Handler- Funktion gemäß dem Namen, den wir in der Funktion attachInterrupt () verwendet haben. Wir haben buttonPressed verwendet, also haben wir hier eine Funktion void buttonPressed () erstellt.
void buttonPressed () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } else { ledOn = true; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Interrupt"); } }
Funktionieren dieser Schaltfläche Pressed () ISR:
Entsprechend dem Wert der Variablen ledOn schaltet sich die LED ein und aus.
TASTENZUSTAND |
ledOn (Wert) |
LED (rot) |
LCD (16x2) |
UNPRESSED |
Falsch |
AUS |
- - |
DRÜCKEN |
Wahr |
AUF |
Zeigt '' INTERRUPT '' |
Wenn der ledOn- Wert falsch ist, bleibt die LED ausgeschaltet, und wenn der ledOn- Wert True ist, leuchtet die LED auf und auf dem LCD-Display wird 'Interrupt' angezeigt.
HINWEIS: Manchmal kann es zu einem Entprellen des Schalters kommen, und es können mehrere Auslöser gezählt werden, wenn der Druckknopf gedrückt wird. Dies liegt daran, dass aufgrund des mechanischen Grundes des Umschaltens des Druckknopfs mehrere Spannungsspitzen auftreten. Dies kann durch Einführung eines RC-Filters reduziert werden.
Die vollständige Funktionsweise von Interrupts in STM32F103C8 wird im folgenden Video gezeigt.