Indholdsfortegnelse:

GPIO ARM MONTERING - T.I. ROBOTICS SYSTEM LÆRESÆT - LAB 6: 3 trin
GPIO ARM MONTERING - T.I. ROBOTICS SYSTEM LÆRESÆT - LAB 6: 3 trin

Video: GPIO ARM MONTERING - T.I. ROBOTICS SYSTEM LÆRESÆT - LAB 6: 3 trin

Video: GPIO ARM MONTERING - T.I. ROBOTICS SYSTEM LÆRESÆT - LAB 6: 3 trin
Video: General Purpose Input/Output GPIO output control devices with .NET (3 of 6) | .NET IoT for Beginners 2024, Juli
Anonim
GPIO ARM MONTERING - T. I. ROBOTICS SYSTEM LÆRESÆT - LAB 6
GPIO ARM MONTERING - T. I. ROBOTICS SYSTEM LÆRESÆT - LAB 6

Hej, I en tidligere instruks om at lære ARM-samling ved hjælp af Texas Instruments TI-RSLK (bruger MSP432-mikrokontrolleren), også kendt som Lab 3, hvis du laver T. I. selvfølgelig, gik vi over nogle meget grundlæggende instruktioner såsom at skrive til et register og betinget looping. Vi gik gennem gennemførelsen ved hjælp af Eclipse IDE.

De teeny -programmer, vi udførte, gjorde intet for at interagere med omverdenen.

Lidt kedeligt.

Lad os prøve at ændre det lidt i dag ved at lære lidt om input/output -portene, specifikt de digitale GPIO -ben.

Det sker sådan, at denne MSP432 kommer på et udviklingsbord allerede har to trykknapkontakter, en RGB LED og en rød LED, som alle er bundet til nogle GPIO-porte.

Det betyder, at når vi lærer at opsætte og manipulere disse ben via samling, kan vi visuelt se disse effekter.

Meget mere interessant end bare at træde igennem debuggeren.

(Vi er stadig i gang med at træde - dette vil være vores 'forsinkelse' funktion):-D

Trin 1: Lad os prøve at skrive til / læse fra RAM

Inden vi går til adgang til og kontrollerer GPIO, bør vi tage et lille skridt.

Lad os starte med bare at læse og skrive til en standard hukommelsesadresse. Vi ved fra den tidligere instruerbare (se billeder der), at RAM starter ved 0x2000 0000, så lad os bruge den adresse.

Vi vil flytte data mellem et kerneregister (R0) og 0x2000 0000.

Vi begynder med en grundlæggende filstruktur eller indhold i et samlingsprogram. Se denne instruktion for at oprette et samlingsprojekt ved hjælp af TI's Code Composer Studio (CCS) og nogle prøveprojekter.

.tommelfinger

.text.align 2.global main.thumbfunc main main:.asmfunc; ---------------------------------- -----------------------------------------------; (vores kode kommer her); ------------------------------------------ ---------------------------------------.endasmfunc.end

Jeg vil tilføje noget nyt til den øverste sektion, hvis der er nogle erklæringer (direktiver). Det bliver tydeligere senere.

ACONST. Sæt 0x20000000; vi vil bruge dette længere nede (det er en konstant)

; '0x' betegner naturligvis det følgende er en hex -værdi.

Så vores startfilindhold ser nu sådan ud:

.tommelfinger

.tekst.align 2 ACONST.sæt 0x20000000; vi vil bruge dette længere nede (det er en konstant); '0x' betegner naturligvis det følgende er en hex -værdi..global main.thumbfunc main main:.asmfunc; --------------------------------------- -------------------------------------------------- (vores kode kommer her); ------------------------------------------ ---------------------------------------.endasmfunc.end

Nu hvor vi har ovenstående, lad os tilføje kode mellem de stiplede linjer.

Vi begynder med at skrive til en RAM -placering. Først etablerer vi datamønsteret, en værdi, som vi vil skrive ind i RAM'en. Vi bruger et kerneregister til at fastslå denne værdi eller data.

Bemærk: husk, at i koden betyder enhver linje, der har et semikolon (';'), at det hele er en kommentar efter denne semikolon.

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

; SKRIVNING;------------------------------------------------ ---------------------------------------------- MOV R0, #0x55; kerneregister R0 vil indeholde de data, vi vil skrive til RAM -placering.; '0x' betegner naturligvis det følgende er en hex -værdi.

Lad os derefter se på udsagn, der IKKE virker.

; MOV MOV kan ikke bruges til at skrive data til en RAM -placering.

; MOV er kun til øjeblikkelige data i registret; eller fra et register til et andet; dvs. MOV R1, R0.; STR skal bruge STR.; STR R0, = ACONST; Dårligt udtryk i udtrykket ('='); STR R0, 0x20000000; Ulovlig adresseringstilstand til butiksinstruktion; STR R0, ACONST; Ulovlig adresseringstilstand til butiksundervisning

Uden at forklare for meget forsøgte vi at bruge den 'AKONST' ovenfor. I det væsentlige er det en stand-in eller konstant i stedet for at bruge en bogstavelig værdi som 0x20000000.

Vi kunne ikke skrive for at skrive til RAM -placeringen ved hjælp af ovenstående. Lad os prøve noget andet.

; synes vi skal bruge et andet register, der indeholder RAM -placeringen i

; for at gemme til den pågældende RAM -placering MOV R1, #0x20000000; indstil RAM -placering (ikke dens indhold, men placering) til R1.; '0x' betegner naturligvis det følgende er en hex -værdi. STR R0, [R1]; skriv hvad der er i R0 (0x55) til RAM (0x20000000) ved hjælp af R1.; vi bruger et andet register (R1), der har RAM -placeringsadresse; for at skrive til den pågældende RAM -placering.

En anden måde at gøre ovenstående på, men ved at bruge 'ACONST' i stedet for den bogstavelige adresseværdi:

; lad os gøre ovenstående igen, men lad os bruge et symbol i stedet for en bogstavelig RAM -placeringsværdi.

; vi vil bruge 'ACONST' som stand-in til 0x20000000.; vi skal stadig gøre '#' for at angive en umiddelbar værdi,; så (se øverst), vi var nødt til at bruge '.set' -direktivet.; For at bevise dette, lad os ændre datamønsteret i R0. MOV R0, #0xAA; ok, vi er klar til at skrive til RAM ved hjælp af symbolet i stedet for den bogstavelige adresseværdi MOV R1, #ACONST STR R0, [R1]

Videoen går mere i detaljer, samt går gennem læsning fra hukommelsesplaceringen.

Du kan også se den vedhæftede kilde.asm -fil.

Trin 2: Nogle grundlæggende portoplysninger

Image
Image
Nogle grundlæggende portoplysninger
Nogle grundlæggende portoplysninger
Nogle grundlæggende portoplysninger
Nogle grundlæggende portoplysninger

Nu hvor vi har en god idé om, hvordan vi skriver til / læser fra en RAM -placering, hjælper dette os bedre med at forstå, hvordan vi styrer og bruger GPIO -stiften

Så hvordan interagerer vi med GPIO -benene? Fra vores tidligere kig på denne mikrokontroller og dens ARM -instruktioner ved vi, hvordan vi skal håndtere dens interne registre, og vi ved, hvordan vi interagerer med hukommelses (RAM) adresser. Men GPIO pins?

Det sker sådan, at disse ben er hukommelseskortede, så vi kan behandle dem på samme måde som hukommelsesadresser.

Det betyder, at vi skal vide, hvad disse adresser er.

Nedenfor er portens startadresser. Forresten, for MSP432 er en "port" en samling af stifter, og ikke kun en nål. Hvis du kender Raspberry Pi, tror jeg, at det er anderledes end situationen her.

De blå cirkler i billedet ovenfor viser skriften på tavlen for de to kontakter og lysdioder. De blå linjer peger på de faktiske lysdioder. Vi behøver ikke at røre ved springhovederne.

Jeg lavede de porte, vi er bekymret for, med fed skrift nedenfor.

  • GPIO P1: 0x4000 4C00 + 0 (lige adresser)
  • GPIO P2: 0x4000 4C00 + 1 (ulige adresser)
  • GPIO P3: 0x4000 4C00 + 20 (lige adresser)
  • GPIO P4: 0x4000 4C00 + 21 (ulige adresser)
  • GPIO P5: 0x4000 4C00 + 40 (lige adresser)
  • GPIO P6: 0x4000 4C00 + 41 (ulige adresser)
  • GPIO P7: 0x4000 4C00 + 60 (lige adresser)
  • GPIO P8: 0x4000 4C00 + 61 (ulige adresser)
  • GPIO P9: 0x4000 4C00 + 80 (lige adresser)
  • GPIO P10: 0x4000 4C00 + 81 (ulige adresser)

Vi er ikke færdige endnu. Vi har brug for flere oplysninger.

For at styre en port har vi brug for flere adresser. Derfor ser vi på ovenstående liste "lige adresser" eller "ulige adresser".

I/O -registeradresseblokke

Vi skal bruge andre adresser, såsom:

  • Port 1 Input Register -adresse = 0x40004C00
  • Port 1 Output Register adresse = 0x40004C02
  • Port 1 Retning Registeradresse = 0x40004C04
  • Port 1 Vælg 0 Registrer adresse = 0x40004C0A
  • Port 1 Vælg 1 Registrer adresse = 0x40004C0C

Og vi kan have brug for andre.

Ok, vi kender nu rækkevidden af GPIO -registeradresser til styring af den eneste røde LED.

En meget vigtig note: Hver I/O -port på MSP432 LaunchPad -kortet er en samling af flere (normalt 8) ben eller linjer, og hver kan indstilles individuelt som input eller output.

Dette betyder f.eks., At hvis du indstiller værdier for "Port 1 Direction Register Address", skal du være bekymret for, hvilken bit (eller bits) du indstiller eller ændrer på den adresse. Mere om dette senere.

GPIO -portprogrammeringssekvens

Det sidste stykke, vi har brug for, er en proces eller algoritme, der skal bruges til at styre LED'en.

Engangs initialisering:

  • Konfigurer P1.0 (P1SEL1REG: P1SEL0REG Register) <--- 0x00, 0x00 for normal GPIO-funktionalitet.
  • Indstil retningsregistrets bit 1 i P1DIRREG som output eller HIGH.

Sløjfe:

Skriv HØJ til bit 0 i P1OUTREG -registeret for at tænde den røde LED

  • Ring til en forsinkelsesfunktion
  • Skriv LAV til bit 0 i P1OUTREG -registeret for at slukke den røde LED
  • Ring til en forsinkelsesfunktion
  • Gentag Loop

Hvilken input / output funktion (konfigurer SEL0 og SEL1)

Mange af benene på LaunchPad har flere anvendelser. Eksempelvis kan den samme pin være standard digital GPIO, eller den kan også bruges i UART- eller I2C -seriel kommunikation.

For at bruge en bestemt funktion til den pin, skal du vælge den funktion. Du skal konfigurere pin -funktionen.

Der er et billede ovenfor til dette trin, der forsøger at forklare dette koncept i visuel form.

SEL0- og SEL1 -adresserne danner en parkombination, der fungerer som en slags funktion / funktionsvalg.

Til vores formål ønsker vi standard digital GPIO for bit 0. Det betyder, at vi har brug for bit 0 for SEL0 og SEL1 for at være en LAV.

Portprogrammeringssekvens (igen)

1. Skriv 0x00 til P1 SEL 0 Register (adresse 0x40004C0A). Dette sætter en LAV for bit 0

2. Skriv 0x00 til P1 SEL 1 Register (adresse 0x40004C0C). Dette sætter en LAV for bit 0, indstilling for GPIO.

3. Skriv 0x01 til P1 DIR Register (adresse 0x40004C04). Dette indstiller en HIGH for bit 0, hvilket betyder OUTPUT.

4. Tænd lysdioden ved at skrive et 0x01 til P1 OUTPUT Register (adresse 0x40004C02)

5. Gør en eller anden forsinkelse (eller bare et enkelt trin igennem, mens fejlfinding)

6. Sluk for LED'en ved at skrive et 0x00 til P1 OUTPUT Register (adresse 0x40004C02)

7. Gør en eller anden forsinkelse (eller bare et enkelt trin igennem, mens fejlfinding)

8. Gentag trin 4 til 7.

Den tilhørende video til dette trin tager os gennem hele processen i en live-demo, mens vi gennemgår en enkelt gennemgang og taler gennem hver samlevejledning og viser LED-handlingen. Undskyld venligst videoens længde.

Trin 3: Fangede du den eneste fejl i videoen?

I videoen, der går gennem hele processen med programmering og belysning af LED'en, var der et ekstra trin i hovedsløjfen, der kunne have været flyttet op til engangsinitialiseringen.

Tak fordi du tog dig tid til at gennemgå denne instruks.

Den næste udvider hvad vi har startet her.

Anbefalede: