Πίνακας περιεχομένων:

GPIO ARM ASSEMBLY - T.I. ΚΙΤ ΜΑΘΗΣΗΣ ROBOTICS SYSTEM - LAB 6: 3 Βήματα
GPIO ARM ASSEMBLY - T.I. ΚΙΤ ΜΑΘΗΣΗΣ ROBOTICS SYSTEM - LAB 6: 3 Βήματα

Βίντεο: GPIO ARM ASSEMBLY - T.I. ΚΙΤ ΜΑΘΗΣΗΣ ROBOTICS SYSTEM - LAB 6: 3 Βήματα

Βίντεο: GPIO ARM ASSEMBLY - T.I. ΚΙΤ ΜΑΘΗΣΗΣ ROBOTICS SYSTEM - LAB 6: 3 Βήματα
Βίντεο: TI-RSLK Lab 6 GPIO Example 2024, Ιούλιος
Anonim
GPIO ARM ASSEMBLY - T. I. ΚΙΤ ΜΑΘΗΣΗΣ ROBOTICS SYSTEM - LAB 6
GPIO ARM ASSEMBLY - T. I. ΚΙΤ ΜΑΘΗΣΗΣ ROBOTICS SYSTEM - LAB 6

Γεια σας, Σε ένα προηγούμενο Instructable σχετικά με την εκμάθηση συναρμολόγησης ARM χρησιμοποιώντας το Texas Instruments TI-RSLK (χρησιμοποιεί τον μικροελεγκτή MSP432), γνωστός και ως Lab 3 εάν κάνετε το T. I. Φυσικά, περάσαμε μερικές πολύ βασικές οδηγίες, όπως η εγγραφή σε ένα μητρώο, και ο όρος υπό όρους. Προχωρήσαμε στην εκτέλεση χρησιμοποιώντας το Eclipse IDE.

Τα εφηβικά προγράμματα που εκτελέσαμε δεν αλληλεπιδρούσαν με τον έξω κόσμο.

Λιγάκι βαρετό.

Ας προσπαθήσουμε να το αλλάξουμε λίγο σήμερα μαθαίνοντας λίγο για τις θύρες εισόδου/εξόδου, συγκεκριμένα, τις ψηφιακές ακίδες GPIO.

Συμβαίνει ότι αυτό το MSP432 έρχεται σε έναν πίνακα ανάπτυξης που έχει ήδη δύο διακόπτες με κουμπιά, ένα LED RGB και ένα κόκκινο LED, όλα συνδεδεμένα σε ορισμένες θύρες GPIO.

Αυτό σημαίνει ότι καθώς μαθαίνουμε να ρυθμίζουμε και να χειριζόμαστε αυτούς τους πείρους μέσω συναρμολόγησης, μπορούμε να δούμε οπτικά αυτά τα εφέ.

Πολύ πιο ενδιαφέρον από το να περάσετε απλώς το πρόγραμμα εντοπισμού σφαλμάτων.

(Θα συνεχίσουμε να κάνουμε βήμα - αυτή θα είναι η λειτουργία "καθυστέρησης"):-D

Βήμα 1: Ας προσπαθήσουμε να γράψουμε σε / Διαβάζουμε από RAM

Πριν προχωρήσουμε στην πρόσβαση και τον έλεγχο του GPIO, θα πρέπει να κάνουμε ένα μικρό βήμα.

Ας ξεκινήσουμε διαβάζοντας και γράφοντας σε μια τυπική διεύθυνση μνήμης. Γνωρίζουμε από το προηγούμενο Instructable (δείτε τις εικόνες εκεί) ότι η μνήμη RAM ξεκινά από 0x2000 0000, οπότε ας χρησιμοποιήσουμε αυτήν τη διεύθυνση.

Θα μεταφέρουμε δεδομένα μεταξύ ενός κεντρικού καταχωρητή (R0) και 0x2000 0000.

Ξεκινάμε με μια βασική δομή αρχείου ή περιεχόμενο ενός προγράμματος συναρμολόγησης. Ανατρέξτε σε αυτό το Instructable για να δημιουργήσετε ένα έργο συναρμολόγησης χρησιμοποιώντας το TI's Code Composer Studio (CCS) και μερικά δείγματα έργων.

.αντίχειρας

.text.align 2.global main.thumbfunc main main:.asmfunc; -------------------------------------- --------------------------------------------------; (ο κωδικός μας θα πάει εδώ); ---------------------------------------------- --------------------------------------..endasmfunc. Τέλος

Θέλω να προσθέσω κάτι νέο στο επάνω τμήμα, αν υπήρχαν κάποιες δηλώσεις (οδηγίες). Θα γίνει πιο ξεκάθαρο αργότερα.

ACONST. Ρύθμιση 0x20000000; θα το χρησιμοποιήσουμε πιο κάτω (είναι σταθερά)

? προφανώς, το «0x» υποδηλώνει αυτό που ακολουθεί είναι δεκαεξαδική τιμή.

Έτσι, τα αρχικά περιεχόμενα του αρχείου μας μοιάζουν τώρα με αυτό:

.αντίχειρας

.text.align 2 ACONST.set 0x20000000; θα το χρησιμοποιήσουμε πιο κάτω (είναι σταθερά). προφανώς, το «0x» υποδηλώνει αυτό που ακολουθεί είναι δεκαεξαδική τιμή..global main.thumbfunc main main:.asmfunc; ------------------------------------------ ----------------------------------------------? (ο κωδικός μας θα πάει εδώ); ---------------------------------------------- --------------------------------------..endasmfunc. Τέλος

Τώρα που έχουμε τα παραπάνω, ας προσθέσουμε κώδικα ανάμεσα στις διακεκομμένες γραμμές.

Αρχίζουμε να γράφουμε σε μια θέση RAM. Αρχικά θα καθορίσουμε το μοτίβο δεδομένων, μια τιμή, που θα γράψουμε στη μνήμη RAM. Χρησιμοποιούμε έναν κύριο καταχωρητή για να καθορίσουμε αυτήν την τιμή ή τα δεδομένα.

Σημείωση: θυμηθείτε ότι στον κώδικα, κάθε γραμμή που έχει ημι-άνω και κάτω τελεία (';') σημαίνει ότι όλα είναι ένα σχόλιο μετά από αυτό το ημι-άνω και κάτω τελεία.

;-----------------------------------------------------------------------------------------------

? ΓΡΑΦΗ;------------------------------------------------ --------------------------------------------------- MOV R0, #0x55; Ο πυρήνας μητρώου R0 θα περιέχει τα δεδομένα που θέλουμε να γράψουμε στη θέση RAM. ? προφανώς, το «0x» υποδηλώνει αυτό που ακολουθεί είναι δεκαεξαδική τιμή.

Στη συνέχεια, ας ρίξουμε μια ματιά σε δηλώσεις που ΔΕΝ λειτουργούν.

? Το MOV MOV δεν μπορεί να χρησιμοποιηθεί για εγγραφή δεδομένων σε μια θέση RAM.

? Το MOV προορίζεται μόνο για άμεσα δεδομένα στο μητρώο, ή από το ένα μητρώο στο άλλο · δηλαδή, MOV R1, R0. ? Το STR πρέπει να χρησιμοποιεί STR. ? STR R0, = ACONST; Κακός όρος στην έκφραση (το '='). STR R0, 0x20000000; Παράνομη λειτουργία διευθύνσεων για οδηγίες καταστήματος. STR R0, ACONST; Παράνομη λειτουργία διευθύνσεων για οδηγίες καταστήματος

Χωρίς να εξηγήσουμε πάρα πολλά, προσπαθήσαμε να χρησιμοποιήσουμε αυτό το "ACONST" παραπάνω. Ουσιαστικά, είναι ένα stand-in ή σταθερό αντί να χρησιμοποιεί μια κυριολεκτική τιμή όπως 0x20000000.

Δεν μπορέσαμε να γράψουμε για να γράψουμε στη θέση RAM χρησιμοποιώντας τα παραπάνω. Ας δοκιμάσουμε κάτι άλλο.

? φαίνεται ότι πρέπει να χρησιμοποιήσουμε έναν άλλο καταχωρητή που περιέχει τη θέση RAM στο

? παραγγελία για αποθήκευση σε αυτήν τη θέση RAM MOV R1, #0x20000000. ορίστε τη θέση RAM (όχι τα περιεχόμενά της, αλλά τη θέση) σε R1. ? προφανώς, το «0x» υποδηλώνει αυτό που ακολουθεί είναι δεκαεξαδική τιμή. STR R0, [R1]; γράψτε τι υπάρχει στο R0 (0x55) στη μνήμη RAM (0x20000000) χρησιμοποιώντας το R1. ? χρησιμοποιούμε έναν άλλο καταχωρητή (R1) που έχει διεύθυνση τοποθεσίας RAM. για να γράψετε σε αυτήν τη θέση RAM.

Ένας άλλος τρόπος για να κάνετε τα παραπάνω, αλλά χρησιμοποιώντας το "ACONST" αντί για την κυριολεκτική τιμή διεύθυνσης:

? ας κάνουμε ξανά τα παραπάνω, αλλά ας χρησιμοποιήσουμε ένα σύμβολο αντί για κυριολεκτική τιμή θέσης RAM.

? θέλουμε να χρησιμοποιήσουμε το 'ACONST' ως stand-in για 0x20000000. ? πρέπει ακόμα να κάνουμε το "#" για να δηλώσουμε μια άμεση τιμή, έτσι (βλέπε στην κορυφή), έπρεπε να χρησιμοποιήσουμε την οδηγία «.set». ? για να το αποδείξουμε αυτό, ας αλλάξουμε το μοτίβο δεδομένων στο R0. MOV R0, #0xAA; εντάξει είμαστε έτοιμοι να γράψουμε στη RAM χρησιμοποιώντας το σύμβολο αντί για την κυριολεκτική τιμή διεύθυνσης MOV R1, #ACONST STR R0, [R1]

Το βίντεο αναλύεται με περισσότερες λεπτομέρειες, καθώς και διαβάζει την ανάγνωση από τη θέση της μνήμης.

Μπορείτε επίσης να δείτε το συνημμένο αρχείο.asm.

Βήμα 2: Ορισμένες βασικές πληροφορίες λιμένων

Image
Image
Μερικές βασικές πληροφορίες λιμένων
Μερικές βασικές πληροφορίες λιμένων
Μερικές βασικές πληροφορίες λιμένων
Μερικές βασικές πληροφορίες λιμένων

Τώρα που έχουμε μια καλή ιδέα πώς να γράφουμε / να διαβάζουμε από μια θέση RAM, αυτό θα μας βοηθήσει να κατανοήσουμε καλύτερα τον τρόπο ελέγχου και χρήσης του pin GPIO

Πώς αλληλεπιδρούμε λοιπόν με τις καρφίτσες GPIO; Από την προηγούμενη ματιά μας σε αυτόν τον μικροελεγκτή και τις οδηγίες ARM του, γνωρίζουμε πώς να αντιμετωπίζουμε τους εσωτερικούς καταχωρητές του και ξέρουμε πώς να αλληλεπιδρούμε με διευθύνσεις μνήμης (RAM). Αλλά καρφίτσες GPIO;

Συμβαίνει ότι αυτές οι καρφίτσες χαρτογραφούνται στη μνήμη, ώστε να μπορούμε να τις αντιμετωπίζουμε σχεδόν το ίδιο με τις διευθύνσεις μνήμης.

Αυτό σημαίνει ότι πρέπει να γνωρίζουμε ποιες είναι αυτές οι διευθύνσεις.

Παρακάτω είναι οι αρχικές διευθύνσεις της θύρας. Παρεμπιπτόντως, για το MSP432, μια "θύρα" είναι μια συλλογή από καρφίτσες και όχι μόνο μία ακίδα. Εάν είστε εξοικειωμένοι με το Raspberry Pi, πιστεύω ότι αυτό είναι διαφορετικό από την κατάσταση εδώ.

Οι μπλε κύκλοι στην παραπάνω εικόνα δείχνουν τη γραφή στον πίνακα για τους δύο διακόπτες και τα LED. Οι μπλε γραμμές δείχνουν τις πραγματικές λυχνίες LED. Δεν θα χρειαστεί να αγγίξουμε τους βραχυκυκλωτήρες.

Έκανα τα λιμάνια που μας απασχολούν με έντονη γραφή παρακάτω.

  • GPIO P1: 0x4000 4C00 + 0 (ακόμη και διευθύνσεις)
  • GPIO P2: 0x4000 4C00 + 1 (περιττές διευθύνσεις)
  • GPIO P3: 0x4000 4C00 + 20 (ακόμη και διευθύνσεις)
  • GPIO P4: 0x4000 4C00 + 21 (περιττές διευθύνσεις)
  • GPIO P5: 0x4000 4C00 + 40 (ακόμη και διευθύνσεις)
  • GPIO P6: 0x4000 4C00 + 41 (περιττές διευθύνσεις)
  • GPIO P7: 0x4000 4C00 + 60 (ακόμη και διευθύνσεις)
  • GPIO P8: 0x4000 4C00 + 61 (περιττές διευθύνσεις)
  • GPIO P9: 0x4000 4C00 + 80 (ακόμη και διευθύνσεις)
  • GPIO P10: 0x4000 4C00 + 81 (περιττές διευθύνσεις)

Δεν έχουμε τελειώσει ακόμα. Χρειαζόμαστε περισσότερες πληροφορίες.

Για να ελέγξουμε μια θύρα, χρειαζόμαστε αρκετές διευθύνσεις. Γι 'αυτό στην παραπάνω λίστα, βλέπουμε "ζυγές διευθύνσεις" ή "περιττές διευθύνσεις".

Μπλοκ διευθύνσεων I/O Register

Θα χρειαστούμε άλλες διευθύνσεις, όπως:

  • Θύρα 1 Διεύθυνση μητρώου εισόδου = 0x40004C00
  • Θύρα 1 Διεύθυνση καταχώρισης εξόδου = 0x40004C02
  • Λιμάνι 1 Κατεύθυνση Διεύθυνση μητρώου = 0x40004C04
  • Θύρα 1 Επιλέξτε 0 Διεύθυνση καταχώρισης = 0x40004C0A
  • Θύρα 1 Επιλέξτε 1 Διεύθυνση καταχώρισης = 0x40004C0C

Και μπορεί να χρειαζόμαστε και άλλους.

Εντάξει, τώρα γνωρίζουμε το εύρος των διευθύνσεων καταχωρητών GPIO για τον έλεγχο της ενιαίας κόκκινης λυχνίας LED.

Μια πολύ σημαντική σημείωση: Κάθε θύρα εισόδου/εξόδου στον πίνακα MSP432 LaunchPad είναι μια συλλογή από αρκετές (συνήθως 8) ακίδες ή γραμμές και η κάθε μία μπορεί να οριστεί ξεχωριστά ως είσοδος ή έξοδος.

Αυτό σημαίνει, για παράδειγμα, ότι εάν ορίζετε τιμές για τη "Διεύθυνση καταχώρισης κατεύθυνσης θύρας 1", πρέπει να ανησυχείτε για το ποιο bit (ή bits) ρυθμίζετε ή αλλάζετε σε αυτήν τη διεύθυνση. Περισσότερα για αυτό αργότερα.

Ακολουθία προγραμματισμού λιμένων GPIO

Το τελευταίο κομμάτι που χρειαζόμαστε, είναι μια διαδικασία ή αλγόριθμος για χρήση, για τον έλεγχο της λυχνίας LED.

Μοναδική προετοιμασία:

  • Διαμορφώστε το P1.0 (P1SEL1REG: P1SEL0REG Register) <--- 0x00, 0x00 για κανονική λειτουργία GPIO.
  • Ορίστε το bit καταχωρητή κατεύθυνσης 1 του P1DIRREG ως έξοδο ή HIGH.

Βρόχος:

Γράψτε Υ HIGHΗΛΟ στο bit 0 του μητρώου P1OUTREG για να ενεργοποιήσετε το Κόκκινο LED

  • Καλέστε μια λειτουργία καθυστέρησης
  • Γράψτε LOW στο bit 0 του μητρώου P1OUTREG για να απενεργοποιήσετε το κόκκινο LED
  • Καλέστε μια λειτουργία καθυστέρησης
  • Επανάληψη βρόχου

Ποια λειτουργία εισόδου / εξόδου (διαμόρφωση SEL0 και SEL1)

Πολλές από τις καρφίτσες στο LaunchPad έχουν πολλαπλές χρήσεις. Παράδειγμα, το ίδιο pin θα μπορούσε να είναι τυπικό ψηφιακό GPIO ή μπορεί επίσης να χρησιμοποιηθεί σε σειριακές επικοινωνίες UART ή I2C.

Για να χρησιμοποιήσετε οποιαδήποτε συγκεκριμένη συνάρτηση για αυτήν την καρφίτσα, πρέπει να επιλέξετε αυτήν τη λειτουργία. Πρέπει να διαμορφώσετε τη λειτουργία του πείρου.

Υπάρχει μια εικόνα παραπάνω για αυτό το βήμα που προσπαθεί να εξηγήσει αυτήν την έννοια σε οπτική μορφή.

Οι διευθύνσεις SEL0 και SEL1 σχηματίζουν έναν συνδυασμό ζεύγους που λειτουργούν ως κάποιο είδος λειτουργίας / επιλογής χαρακτηριστικών.

Για τους σκοπούς μας, θέλουμε τυπικό ψηφιακό GPIO για το bit 0. Αυτό σημαίνει ότι χρειαζόμαστε το bit 0 για SEL0 και SEL1 για να είναι ΧΑΜΗΛΟ.

Ακολουθία προγραμματισμού λιμένων (ξανά)

1. Γράψτε 0x00 στο P1 SEL 0 Εγγραφή (διεύθυνση 0x40004C0A). Αυτό θέτει LOW για το bit 0

2. Γράψτε 0x00 στο P1 SEL 1 Εγγραφή (διεύθυνση 0x40004C0C). Αυτό ορίζει ένα LOW για το bit 0, ρύθμιση για το GPIO.

3. Γράψτε 0x01 στο P1 Register DIR (διεύθυνση 0x40004C04). Αυτό θέτει ένα Υ HIGHΗΛΟ για το bit 0, που σημαίνει ΕΞΟΔΟΣ.

4. Ενεργοποιήστε το LED γράφοντας 0x01 στο P1 OUTPUT Register (διεύθυνση 0x40004C02)

5. Κάντε κάποιου είδους καθυστέρηση (ή απλώς ένα βήμα κατά τη διόρθωση σφαλμάτων)

6. Απενεργοποιήστε το LED γράφοντας 0x00 στο P1 OUTPUT Register (διεύθυνση 0x40004C02)

7. Κάντε κάποιου είδους καθυστέρηση (ή απλώς ένα βήμα κατά τον εντοπισμό σφαλμάτων)

8. Επαναλάβετε τα βήματα 4 έως 7.

Το σχετικό βίντεο για αυτό το βήμα μας οδηγεί σε ολόκληρη τη διαδικασία σε ζωντανή επίδειξη, καθώς περνάμε και μιλάμε σε κάθε εντολή συναρμολόγησης και δείχνουμε τη δράση LED. Συγχωρήστε τη διάρκεια του βίντεο.

Βήμα 3: Πιάσατε το One Flaw στο βίντεο;

Στο βίντεο που ακολουθεί όλη τη διαδικασία προγραμματισμού και φωτισμού της λυχνίας LED, υπήρχε ένα επιπλέον βήμα στον κύριο βρόχο, το οποίο θα μπορούσε να έχει μετακινηθεί έως την εφάπαξ προετοιμασία.

Σας ευχαριστούμε που αφιερώσατε χρόνο για να περάσετε από αυτό το Instructable.

Το επόμενο επεκτείνει αυτό που ξεκινήσαμε εδώ.

Συνιστάται: