- Τύποι διακοπών και ISR
- Σύνταξη για διακοπή στο STM32
- Απαιτούμενα στοιχεία
- Διάγραμμα κυκλώματος και συνδέσεις
- Προγραμματισμός STM32F103C8 για διακοπές
Διακοπές είναι ένας μηχανισμός με τον οποίο ένα I / O ή μια εντολή μπορεί να αναστείλει την κανονική εκτέλεση του επεξεργαστή και να εξυπηρετηθεί όπως έχει την υψηλότερη προτεραιότητα. Όπως για παράδειγμα, ένας επεξεργαστής που εκτελεί κανονική εκτέλεση μπορεί επίσης να παρακολουθεί συνεχώς κάποιο είδος συμβάντος ή διακοπής που θα συμβεί. Αυτό συμβαίνει όταν συμβαίνει μια εξωτερική διακοπή (όπως από κάποιον αισθητήρα), τότε ο επεξεργαστής διακόπτει την κανονική του εκτέλεση και εξυπηρετεί πρώτα τη διακοπή και μετά συνεχίζει την κανονική της εκτέλεση.
Εδώ σε αυτό το έργο, για την κατανόηση των διακοπών στο STM32F103C8, θα χρησιμοποιήσουμε το πλήκτρο ως εξωτερική διακοπή. Εδώ θα αυξήσουμε έναν αριθμό από το 0 και θα τον εμφανίσουμε σε οθόνη LCD 16x2, και όποτε πατηθεί το κουμπί ώθησης το LED ανάβει και η οθόνη LCD δείχνει INTERRUPT. Το LED σβήνει μόλις απελευθερωθεί το κουμπί.
Τύποι διακοπών και ISR
Οι διακοπές μπορούν γενικά να ταξινομηθούν σε δύο τύπους:
Διακοπές υλικού: Εάν το σήμα προς τον επεξεργαστή προέρχεται από κάποια εξωτερική συσκευή, όπως κουμπί ή αισθητήρα ή από κάποια άλλη συσκευή υλικού που δημιουργεί ένα σήμα και λέει στον επεξεργαστή να κάνει συγκεκριμένη εργασία που υπάρχει στο ISR, είναι γνωστό ως διακοπές υλικού.
Διακοπές λογισμικού: Οι διακοπές που δημιουργούνται από τις οδηγίες λογισμικού.
Διακοπή ρουτίνας εξυπηρέτησης
Διακοπή υπηρεσίας ρουτίνας ή χειριστή διακοπής είναι ένα συμβάν που έχει ένα μικρό σύνολο οδηγιών σε αυτό και όταν συμβεί διακοπή, ο επεξεργαστής εκτελεί πρώτα αυτόν τον κώδικα που υπάρχει στο ISR και στη συνέχεια συνεχίζει με την εργασία που έκανε πριν από τη διακοπή.
Σύνταξη για διακοπή στο STM32
Το ISR έχει το ακόλουθο συντακτικό attachInterrupt (digitalPinToInterrupt (pin), ISR, mode) στο Arduino και το ίδιο μπορεί επίσης να χρησιμοποιηθεί στο STM32 καθώς χρησιμοποιούμε το arduino IDE για την αποστολή κώδικα.
- digitalPinToInterrupt (pin): Όπως στο Arduino board Uno έχουμε καρφίτσες 2,3 & στο mega έχουμε 2,3,18,19,20,21 για διακοπές. Στο STM32F103C8 έχουμε επίσης καρφίτσες διακοπής οποιεσδήποτε ακίδες GPIO μπορούν να χρησιμοποιηθούν για διακοπές. Απλώς καθορίζουμε τον ακροδέκτη εισόδου που χρησιμοποιούμε για διακοπή. Ωστόσο, ενώ χρησιμοποιούμε περισσότερες από μία διακοπές ταυτόχρονα, ίσως χρειαστεί να ακολουθήσουμε ορισμένους περιορισμούς.
- ISR: Είναι μια λειτουργία χειριστή διακοπής που καλείται όταν συμβαίνει εξωτερική διακοπή. Δεν έχει ορίσματα και άκυρο τύπο επιστροφής.
- Λειτουργία: Τύπος μετάβασης για ενεργοποίηση της διακοπής
- RISING: Για να προκαλέσει διακοπή όταν ο πείρος διέρχεται από LOW σε HIGH.
- ΚΑΤΑΡΓΗΣΗ: Για να ενεργοποιήσετε μια διακοπή όταν ο πείρος διέρχεται από ΥΨΗΛΟ σε ΧΑΜΗΛΟ.
- ΑΛΛΑΓΗ: Για να προκαλέσετε διακοπή όταν ο πείρος διέρχεται είτε από LOW σε HIGH ή HIGH σε LOW (δηλαδή, όταν αλλάζει ο πείρος).
Ορισμένες συνθήκες κατά τη χρήση διακοπής
- Η λειτουργία ρουτίνας υπηρεσίας διακοπής (ISR) πρέπει να είναι όσο το δυνατόν συντομότερη.
- Η λειτουργία καθυστέρησης () δεν λειτουργεί εντός του ISR και πρέπει να αποφεύγεται.
Απαιτούμενα στοιχεία
- STM32F103C8
- Πιέστε το κουμπί
- LED
- Αντίσταση (10K)
- LCD (16x2)
Διάγραμμα κυκλώματος και συνδέσεις
Η μία πλευρά του πείρου κουμπιού συνδέεται με 3.3V του STM32 και η άλλη πλευρά συνδέεται με τον πείρο εισόδου (PA0) του STM32 μέσω μιας αντίστασης προς τα κάτω.
Η αντίσταση τραβήγματος προς τα κάτω χρησιμοποιείται έτσι ώστε ο μικροελεγκτής να λαμβάνει είτε ΥΨΗΛΗ ή ΧΑΜΗΛΗ στην είσοδό του όταν πατηθεί ή απελευθερωθεί το κουμπί. Διαφορετικά, χωρίς αντίσταση προς τα κάτω, το MCU μπορεί να μπερδευτεί και να τροφοδοτήσει μερικές τυχαίες κυμαινόμενες τιμές στην είσοδο.
Σύνδεση μεταξύ STM32F103C8 και LCD
Ο παρακάτω πίνακας δείχνει τη σύνδεση ακίδων μεταξύ LCD (16X2) και του μικροελεγκτή STM32F103C8.
STM32F103C8 |
οθόνη υγρού κρυστάλλου |
GND |
VSS |
+ 5V |
VDD |
Στο κέντρο ποτενσιόμετρου PIN |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
μι |
PB10 |
Δ4 |
PB11 |
Δ5 |
PC13 |
Δ6 |
PC14 |
Δ7 |
+ 5V |
ΕΝΑ |
GND |
κ |
Προγραμματισμός STM32F103C8 για διακοπές
Το πρόγραμμα για αυτό το σεμινάριο είναι απλό και παρέχεται στο τέλος αυτού του σεμιναρίου. Δεν χρειαζόμαστε προγραμματιστή FTDI για να προγραμματίσουμε το STM32, απλώς συνδέστε τον υπολογιστή σας στη θύρα USB του STM32 και ξεκινήστε τον προγραμματισμό με το Arduino IDE. Μάθετε περισσότερα σχετικά με τον προγραμματισμό STM32 μέσω θύρας USB.
Όπως είπαμε ότι εδώ σε αυτό το σεμινάριο θα αυξήσουμε έναν αριθμό από το 0 και θα τον εμφανίσουμε σε οθόνη LCD 16x2 και όποτε πατηθεί ένα κουμπί πιέσεως, η λυχνία ανάβει και η οθόνη LCD δείχνει «INTERRUPT».
Καθορίστε πρώτα τις συνδέσεις ακίδων LCD με STM32. Μπορείτε να το τροποποιήσετε σύμφωνα με τις απαιτήσεις σας.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Στη συνέχεια, συμπεριλαμβάνουμε το αρχείο κεφαλίδας για την οθόνη LCD. Αυτό καλεί τη βιβλιοθήκη που περιέχει τον κωδικό για το πώς πρέπει να επικοινωνεί το STM32 με την οθόνη LCD. Βεβαιωθείτε επίσης ότι η συνάρτηση LiquidCrystal καλείται με τα ονόματα pin που μόλις ορίσαμε παραπάνω.
περιλαμβάνω
Οι καθολικές μεταβλητές χρησιμοποιούνται για τη μετάδοση δεδομένων μεταξύ του ISR και του κύριου προγράμματος. Δηλώνουμε τη μεταβλητή ledOn ως πτητική και επίσης ως Boolean για να ορίσουμε True ή False
πτητικό boolean ledOn = false;
Μέσα στη λειτουργία κενής ρύθμισης () , θα εμφανίσουμε ένα εισαγωγικό μήνυμα και θα το καθαρίσουμε μετά από 2 δευτερόλεπτα.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); καθυστέρηση (2000); lcd.clear ();
Και πάλι στην ίδια λειτουργία κενής ρύθμισης () , πρέπει να καθορίσουμε τους ακροδέκτες εισόδου και εξόδου. Ρυθμίζουμε τον ακροδέκτη PA1 για έξοδο σε LED και PA0 για είσοδο από το κουμπί.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
Θα αυξήσουμε επίσης έναν αριθμό, οπότε δηλώστε μια μεταβλητή με τιμή μηδέν.
int i = 0;
Τώρα, το σημαντικό μέρος του κώδικα είναι η συνάρτηση attachInterrupt () , περιλαμβάνεται επίσης στην κενή ρύθμιση ()
attachInterrupt (digitalPinToInterrupt (PA0), κουμπί Πατημένο, ΑΛΛΑΓΗ)
Προσδιορίσαμε τον πείρο PA0 για εξωτερική διακοπή και το κουμπί Πιέζεται είναι η λειτουργία που καλείται όταν υπάρχει ΑΛΛΑΓΗ (LOW σε HIGH ή HIGH to LOW) στον πείρο PA0. Μπορείτε επίσης να χρησιμοποιήσετε οποιοδήποτε άλλο όνομα λειτουργίας, καρφίτσα και λειτουργία ανάλογα με τις απαιτήσεις.
Μέσα στον κενό βρόχο () αυξάνεται ένας αριθμός (i) από το μηδέν και εκτυπώνεται ο αριθμός σε LCD (16x2).
lcd.clear (); lcd.print ("ΑΡΙΘΜΟΣ:"); lcd.print (i); ++ i; καθυστέρηση (1000)
Το πιο σημαντικό μέρος είναι η δημιουργία μιας λειτουργίας χειριστή διακοπής σύμφωνα με το όνομα που χρησιμοποιήσαμε στη συνάρτηση attachInterrupt () . Χρησιμοποιήσαμε το κουμπί Πιέστηκε, οπότε εδώ έχουμε δημιουργήσει ένα κουμπί λειτουργίας άκυρο Πιεσμένο ()
κουμπί άκυρου Πατημένο () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } αλλιώς { ledOn = true; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Διακοπή"); } }
Εργασία αυτού του κουμπιού Πατημένο () ISR:
Σύμφωνα με την τιμή της μεταβλητής ledOn , το LED ανάβει και σβήνει.
ΚΡΑΤΟΣ ΚΟΥΜΠΙ |
ledOn (τιμή) |
LED (κόκκινο) |
LCD (16x2) |
ΑΠΟΣΤΟΛΗ |
Ψευδής |
ΜΑΚΡΙΑ ΑΠΟ |
- |
ΔΕΛΤΙΟ |
Αληθής |
ΕΠΙ |
Παραστάσεις "INTERRUPT" |
Εάν η τιμή ledOn είναι ψευδής, τότε το LED παραμένει απενεργοποιημένο και αν η τιμή ledOn είναι True, τότε το LED ανάβει και η οθόνη LCD εμφανίζει την ένδειξη "Interrupt".
ΣΗΜΕΙΩΣΗ: Ενίοτε μπορεί να υπάρχει εφέ διακόπτη διακοπής και μπορεί να μετρηθεί πολλαπλή σκανδάλη όταν πατηθεί το κουμπί, αυτό οφείλεται στο γεγονός ότι αρκετές αιχμές τάσης οφείλονται σε μηχανικό λόγο αλλαγής του μπουτόν. Αυτό μπορεί να μειωθεί με την εισαγωγή φίλτρου RC.
Η πλήρης λειτουργία των διακοπών στο STM32F103C8 φαίνεται στο παρακάτω βίντεο.