| I. Συνεχίζοντας από το προηγούμενο στο επόμενο Στην προηγούμενη διάλεξη, εξοικειωθήκαμε με τη βασική διαδικασία ανάπτυξης προγραμμάτων CC2430 στο IAR μέσω ενός μικρού πειράματος με το απλούστερο LED που αναβοσβήνει. Το μαχαίρι έχει τουλάχιστον ακονιστεί (αν και δεν είμαι πολύ καλός σε αυτή την πέτρα που ακονίζει), και τώρα ήρθε η ώρα να αρχίσουμε να σφάζουμε σφάλματα :). Στη συνέχεια, ας μάθουμε μερικά βασικά πειράματα με το CC2430. Κάθε μικρά πειράματα, χωρίζονται σε "πειραματική εισαγωγή", "διάγραμμα ροής προγράμματος", "πειραματικός πηγαίος κώδικας και ανάλυση" τρία μέρη της περιγραφής. Αυτό το άρθρο εξηγεί την εξωτερική διακοπή. Δεύτερον, η εξωτερική διακοπή(1) Εισαγωγή στο πείραμα Η διακοπή είναι ένας μικροελεγκτής πραγματικού χρόνου για την αντιμετώπιση εσωτερικών ή εξωτερικών συμβάντων, ένας εσωτερικός μηχανισμός. Όταν συμβεί κάποιο είδος εσωτερικού ή εξωτερικού συμβάντος, το σύστημα διακοπής μικροελεγκτή θα αναγκάσει τη CPU να διακόψει το πρόγραμμα που εκτελείται, αλλά να πάει στην επεξεργασία συμβάντος διακοπής, η επεξεργασία διακοπής ολοκληρώνεται και στη συνέχεια να επιστρέψει για να διακοπεί από το πρόγραμμα, να συνεχίσει να εκτελείται. Οι διακοπές χωρίζονται σε εξωτερικές διακοπές και εσωτερικές διακοπές, το CC2430 περιέχει συνολικά 18 πηγές διακοπής (συγκεκριμένη περιγραφή διακοπής και ορισμός διανύσματος διακοπής, μπορείτε να ανατρέξετε στο " CC2430 Chinese Manual "). Τώρα ας ρίξουμε μια ματιά στο διάγραμμα κυκλώματος αυτής της αναπτυξιακής πλακέτας:
Η αναπτυξιακή πλακέτα έχει συνδεθεί με το πλήκτρο S1 και το P0.1, το αποτέλεσμα που θέλει να επιτύχει αυτό το πείραμα είναι να ενεργοποιήσει τη διακοπή του P0.1 πατώντας το πλήκτρο S1 και στη συνέχεια να ελέγξει το φως/απενεργοποίηση του LED1 στην υπορουτίνα εξυπηρέτησης διακοπής. (2) Πειραματική αρχή και διάγραμμα ροής Το διάγραμμα ροής του πειράματος έχει ως εξής:
c
(3) Πειραματικός πηγαίος κώδικας// αρχείο κεφαλίδας#include // υπολειτουργία καθυστέρησης#define led1 P1_0#define led2 P1_1#define led3 P1_2#define led4 P1_3void Delay( unsigned n) { & &
nbsp; unsigned tt;for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); &
nbsp; for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); }//32M crystal initializationvoid xtal_init( void ) { SLEEP &=~0x04; & nbsp; //όλη η τροφοδοσίαwhile (! (SLEEP & 0x40 )); //ταλαντωτής κρυστάλλου ενεργοποιημένος και σταθερός CLKCON &=~0x47; &
nbsp; //επιλογή ταλαντωτή κρυστάλλου 32MHz SLEEP |=0x04; }// αρχικοποίηση LEDvoid led_init( void ) { P1SEL =0x00;  
; //P1 είναι μια κανονική θύρα εισόδου/εξόδου P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 Έξοδος
led1 = 0- led2 = 0- led3 = 0- led4 = 0- }//αρχικοποίηση της δίοδο και της εξωτερικής διακοπήςvoid io_init( void ) { P0INP &=~0X02,
/ /P0.1 έχει pull-up και pull-down EA =1; //Ολική ενεργοποίηση διακοπής P0IE =1; &
nbsp; //Ενεργοποίηση διακοπής P0 PICTL |=0X09; //Ενεργοποίηση διακοπής θύρας P0.1, σκανδαλισμός πτώσης P0IFG &=~0x02
; //P0.1 interrupt flag clear 0 };//main functionvoid main( void ) { xtal_init(); led_init(),
io_init();while ( 1 ); //αναμονή για διακοπή }//υπορουτίνα εξυπηρέτησης διακοπών#pragma vector = P0INT_VECTOR__interrupt void P0_ISR( void ) { EA =0,
/ / απενεργοποίηση της διακοπής Καθυστέρηση
( 10000 ), Delay(10000 ), Delay(10000 ), Delay(10000 ), Delay( 10000 ), Delay(10000 ), &
nbsp; if ((P0IFG & 0x02 ) >0 ) //διακοπή με πλήκτρο { P0IFG &=~0x02; &
nbsp; //P0.1 interrupt flag clear 0 led1 = !led1; } P0IF =0; &
nbsp; //P0 interrupt flag clear 0 EA =1; & nbsp; // ενεργοποίηση της διακοπής } Αρχικά αρχικοποιήστε το Unity Clock: επιλέξτε έναν κρυσταλλικό ταλαντωτή 32MHz. Στη συνέχεια αρχικοποιήστε τις λυχνίες LED: ορίστε την P1 ως θύρα εισόδου/εξόδου γενικής χρήσης, ορίστε την κατεύθυνση P1.0 ~ P1.3 ως έξοδο και στη συνέχεια απενεργοποιήστε τις 4 λυχνίες LED. Στη συνέχεια, διαμορφώστε τους σχετικούς καταχωρητές SFR για εξωτερικές διακοπές και ενεργοποιήστε την ενεργοποίηση διακοπής σε όλα τα επίπεδα, που αφορούν 3 SFR: EA, IEN1, PICTL (για λεπτομερή περιγραφή κάθε SFR, ανατρέξτε στο " CC2430 Chinese Manual "): EA -- συνολική ενεργοποίηση διακοπής, IEN1.5 -- ενεργοποίηση διακοπής P0, PICTL.3 -- Ενεργοποίηση διακοπής θύρας P0.1, PICTL.0 -- θέτει την πτωτική ακμή εισόδου θύρας P0.1 για να προκαλέσει ενεργοποίηση διακοπής. Στη συνέχεια, χρησιμοποιήστε while(1) στην κύρια συνάρτηση για να περιμένετε τη διακοπή. Συμβουλές για το CC2430(1) Σύνταξη ανάθεσης bit Πολύ συχνά, πρέπει να αναθέσουμε μια τιμή (0 ή 1) σε ένα bit σε ένα SFR ενός byte για να ελέγξουμε με ακρίβεια μια συσκευή υλικού. Ορισμένα SFRs υποστηρίζουν τη διευθυνσιοδότηση bit, όπως TCON, P0 κ.λπ., αυτή τη στιγμή, η ανάθεση του bit είναι πολύ απλή, απλά ρωτήστε το αρχείο κεφαλίδας ioCC2430.h στο SFR Bit Access μέρος του ορισμού bit μπορεί να είναι: P0_0 = 0; // P0 το πρώτο bit της ανάθεσης της τιμής του 0 P0_0 = 1; / / / / P0 το πρώτο bit της ανάθεσης της τιμής του 1 Ωστόσο, υπάρχουν SFRs δεν υποστηρίζουν τη διευθυνσιοδότηση bit, όπως στην περίπτωση του πρώτου bit της ανάθεσης της τιμής του πρώτου bit του πρώτου bit του πρώτου bit του πρώτου bit του πρώτου bit του πρώτου bit του πρώτου bit του πρώτου bit του πρώτου bit του δεύτερου bit . Ωστόσο, υπάρχουν SFRs που δεν υποστηρίζουν διευθυνσιοδότηση bit, όπως το PICTL σε αυτό το πείραμα, όταν θέλετε να αναθέσετε μια τιμή σε ένα από αυτά, η σύνταξη έχει ως εξής: PICTL &= ~0x01; //αναθέστε μια τιμή 0 στο πρώτο bit PICTL |= 0x01; //αναθέστε μια τιμή 1 στο πρώτο bit Μπορείτε να θυμάστε ότι & amp;= ~, |= ~, |= ~, |= ~, |= P0_0 = 1; //αναθέστε μια τιμή 1 στο πρώτο bit του P0 . amp;= ~, |= αυτά είναι δύο συνηθισμένα συντακτικά στοιχεία ανάθεσης bit. (2) Σύνοψη ενεργοποίησης διακοπής Όταν μια διακοπή εμπλέκεται σε ένα πρόγραμμα, πρέπει να ενεργοποιηθεί πριν από την ενεργοποίηση της διακοπής. C 51 διακοπή σύστημα ενεργοποίησης, ιεραρχική δομή του είναι πολύ προφανής: διακοπή αφεντικό: EA είναι το αφεντικό, υπεύθυνος για τη συνολική διακοπή επιτρέπουν: EA = 1. διακοπή αποδέσμευση καπετάνιος: επόμενο είναι για κάθε λειτουργικό στοιχείο (όπως P0, χρονόμετρο 1, κλπ.) επιτρέπουν τον έλεγχο, όπως SFR γενικά bit διευθυνσιοδοτούνται, ονομασία περιέχει γενικά IE (Interrupt Enable): P0IE = 1. τα μέλη της ομάδας διακοπής : αποδέσμευση, αλλά λόγω της διακοπήςτου προγράμματος , η διακοπή πρέπει να ενεργοποιηθεί πριν από την ενεργοποίηση της διακοπής.
κάθε μέλος της ομάδας διακοπής : ομάδα, αλλά επειδή κάθε λειτουργικό στοιχείο περιέχει επίσης πολλαπλές διακοπές, οπότε το τελευταίο επίπεδο είναι για κάθε έλεγχο ενεργοποίησης διακοπής, το εν λόγω SFR δεν είναι γενικά διευθύνσιμο με bit, η ονομασία περιέχει γενικά IE (Interrupt Enable) ή IM (Interrupt Mask): PICTL | = 0x01- δεν χρειάζεται να απομνημονεύσετε τα SFR διακοπής. Δεν χρειάζεται να απομνημονεύσετε τα interrupt SFRs, αρκεί να κατανοήσετε την ιεραρχία και στη συνέχεια να συμβουλευτείτε το εγχειρίδιο ή τα αρχεία κεφαλίδων όταν τα χρησιμοποιείτε. (3) Συγγραφή προγραμμάτων διακοπών Η χρήση των διακοπών σε ένα πρόγραμμα αποτελείται γενικά από δύο μέρη: τη συγγραφή της υπορουτίνας εξυπηρέτησης διακοπών και το άνοιγμα της ενεργοποίησης διακοπών. Η ενεργοποίηση διακοπής έχει εισαχθεί παραπάνω, τα παρακάτω είναι μια σύντομη εισαγωγή στην προετοιμασία της υπορουτίνας εξυπηρέτησης διακοπής: Πρώτα απ' όλα, καθορίστε το διάνυσμα διακοπής, μπορεί να βρίσκεται στο αρχείο κεφαλίδας ioCC2430.h στο τμήμα Interrupt Vectors της ερώτησης, η σύνταξη έχει ως εξής: # pragma vector = Interrupt Vectors και στη συνέχεια ακολουθεί η προετοιμασία του χειριστή διακοπής, η δομή έχει ως εξής: ___ interrupt void Function Name (___)
i nterrupt void function name(void) { //on interrupt //interrupt handling //interrupt flag clear 0 //off interrupt } III. Συμπέρασμα Αυτό το άρθρο εισάγει μια απλή μέθοδο υλοποίησης εξωτερικής διακοπής με βάση το CC2430, με βάση τη διακοπή, στη συνέχεια εισάγουμε μια άλλη πολύ σημαντική ενότητα - χρονοδιακόπτη. Το CC2430 διαθέτει συνολικά τέσσερις χρονοδιακόπτες, οι οποίοι μπορούν να χωριστούν σε τρεις κατηγορίες: χρονοδιακόπτης 1, χρονοδιακόπτης 2, χρονοδιακόπτης 3/4 (3 και 4 της χρήσης του ίδιου βασικού). το ίδιο). </n;tt++). </n;tt++);. </n;tt++). </n;tt++). </n;tt++). </n;tt++). </n;tt++). </n;tt++). </n;tt++). |