Innehållsförteckning:

DEL 2 - GPIO ARM MONTERING - RGB - FUNCTION CALLS - Brytare: 6 steg
DEL 2 - GPIO ARM MONTERING - RGB - FUNCTION CALLS - Brytare: 6 steg

Video: DEL 2 - GPIO ARM MONTERING - RGB - FUNCTION CALLS - Brytare: 6 steg

Video: DEL 2 - GPIO ARM MONTERING - RGB - FUNCTION CALLS - Brytare: 6 steg
Video: CG2271 Week 3: KL25Z GPIO Configuration and Lab 2 2024, Juli
Anonim
DEL 2 - GPIO ARM MONTERING - RGB - FUNKTIONSSAMTAL - Brytare
DEL 2 - GPIO ARM MONTERING - RGB - FUNKTIONSSAMTAL - Brytare

I del 1 lärde vi oss hur man växlar en enda röd lysdiod på MSP432 LaunchPad -utvecklingskortet från Texas Instruments, med hjälp av montering istället för C / C ++.

I den här instruktionsboken kommer vi att göra något liknande - styra en RGB -LED som också finns på samma kort.

Längs vägen hoppas vi kunna öka vår kunskap om ARM -montering och inte bara ha kul med att tända några lysdioder.

Steg 1: Låt oss hoppa direkt in

Den första videon säger verkligen allt. Inte mycket mer att tillägga.

Huvudpoängen med det är att driva hem tanken att varje I/O -port på MSP432 består av ett block av "register" -adresser, som i sin tur består av flera bitar var.

Vidare grupperas bitarna på ett ortogonalt sätt. Det vill säga, bit 0 i varje registeradress hänvisar till samma externa I/O -stift.

Vi upprepade tanken att det krävs flera registeradresser för den porten, för att göra något med bara en bit eller nål.

Men att i det här fallet, eftersom vi har att göra med en RGB -LED, måste vi hantera tre bitar för varje registeradress.

Vi förstärkte att vi behöver flera register: DIR -registret, SEL0 -registret, SEL1 -registret och OUTPUT -registret. Och tre bitar varje gång.

Steg 2: Förbättra kod - Lägg till en funktion

Image
Image

Som du såg i steget ovan hade huvudprogramslingan många upprepade koder, nämligen när vi stänger av lysdioderna.

Så vi kan lägga till en funktion i programmet. Vi måste fortfarande ringa den funktionen varje gång vi vill stänga av lysdioderna, men det får en del av koden att kollapsa till ett enda uttalande.

Hade vår LED-off-kod varit mer involverad med många fler instruktioner, hade detta varit en riktig minnessparare.

En del av inbäddad programmering och mikrokontroller är att vara mycket mer medveten om programmets storlek.

Videon förklarar.

I huvudsak lägger vi till ett förgreningsuttalande till vår huvudkod, och vi har ett annat kodblock som är funktionen vi grenar till. Och sedan när vi är klara, eller i slutet av funktionen, går vi tillbaka till nästa uttalande i huvudprogrammet.

Steg 3: Lägg till en upptagningsfördröjning

I avsnittet Deklarationer i koden lägger du till en konstant för att göra det enkelt att twika för önskad tidpunkt:

; alla ord efter ett semikolon (';') startar en kommentar.

; koden i denna del tilldelar ett namn ett värde.; du kunde också ha använt '.equ' men de är något annorlunda.; '.equ' (tror jag) kan inte ändras, medan '.set' betyder att du kan; ändra värdet på 'DLYCNT' senare i koden om du vill.; 'DLYCNT' kommer att användas som nedräkningsvärdet i fördröjningssubrutinen. DLYCNT.set 0x30000

Lägg till en ny fördröjningsfunktion:

fördröjning:.asmfunc; början på 'fördröjning' underrutinen eller funktionen.

MOV R5, #DLYCNT; load core cpu register R5 med värde tilldelat 'DLYCNT'. dlyloop; detta markerar start av fördröjningsslinga. assembler bestämmer adressen. SUB R5, #0x1; subtrahera ett 1 från nuvarande värde i kärn -CPU -registret R5. CMP R5, #0x0; jämför nuvärdet i R5 till 0. BGT dlyloop; gren om värdet i R5 är större 0, för att märka (adress) 'dlyloop'. BX LR; om vi kom hit, betyder R5 -värdet 0. retur från subrutin..endasmfunc; markerar slutet på subrutinen.

Sedan, i huvudkroppen, inom huvudslingan, åkallar eller kallar du den fördröjningsfunktionen:

; detta är ett kodfragment av huvuddelen eller huvudfunktionen (se filen 'main.asm').

; detta är en loop i "main" och visar hur vi kallar eller använder den nya "fördröjnings" -funktionen.; "#REDON" och "#GRNON" är också deklarationer (konstanter) (se toppen av "main.asm").; de är bara ett enkelt sätt att ställa in den angivna färgen på RGB LED. loop MOV R0, #REDON; Red - set core cpu register R0 med värdet tilldelat 'REDON'. STRB R0, [R4]; kärnregistret R4 var tidigare inställt med en GPIO -utmatningsadress.; skriv vad som finns i R0, till adress som anges av R4. BL -fördröjning; gren till den nya "fördröjnings" -funktionen. BL ledsoff; gren till den redan existerande "ledsoff" -funktionen. BL -fördröjning; ditto MOV R0, #GRNON; Grön - ditto STRB R0, [R4]; och så vidare. BL fördröjning BL ledsoff BL fördröjning

Videon går i detalj.

Steg 4: ARM Architecture Procedure Call Standard (AAPCS)

Det är nog en bra tid att presentera något. Det är en sammankomstspråkig konvention. Även känd som Procedure Call Standard för ARM Architecture.

Det finns mycket i det här, men det är bara en standard. Det hindrar oss inte från att lära sig monteringsprogrammering, och vi kan anta delar av den standarden när vi går, när vi känner oss bekväma med några koncept som vi lär oss.

Annars kan vi känna att vi dricker ur en enorm vattenslang. För mycket information.

Kärnregister

Eftersom vi har lärt känna MSP432: s kärnregister, låt oss försöka nu anta några av dessa standarder. Vi kommer att anpassa oss till detta när vi skriver nästa funktion (slå på / av en lysdiod).

1) Vi ska använda R0 som en funktionsparameter. Om vi vill överföra ett värde till funktionen (subrutin), bör vi använda R0 för att göra det.

2) Vi ska använda länkregistret för dess avsedda ändamål - det har adressen som anger vart vi ska återvända efter att underrutinen är klar.

Du får se hur vi tillämpar dessa.

Steg 5: Funktion med parameter - kapslade funktioner

Vi kan städa upp vår kod och minska mängden minne som den upptar genom att kombinera upprepade sektioner till en enda funktion. Den enda skillnaden i huvudslingans kropp är att vi behöver en parameter så att vi kan passera de olika färgerna vi vill se på RGB LED.

Ta en titt på videon för detaljer. (förlåt för längden)

Steg 6: GPIO -ingång - Lägg till switchar

Låt oss göra det mer intressant. Det är dags att lägga till lite switch-control till vårt monteringsprogram.

Denna instruktionsbok har bilder som visar hur de två inbyggda switcharna är anslutna till MSP432.

I huvudsak: Switch 1 (SW1 eller S1) är ansluten till P1.1 och Switch 2 (SW2 eller S2) är ansluten till P1.4.

Detta gör saker lite intressanta inte bara för att vi har att göra med ingångar istället för utgångar, utan också för att dessa två switchar upptar eller tar upp två bitar av samma registeradressblock som den enda röda lysdioden som är en utgång.

Vi handlade om att växla den enda röda lysdioden i denna instruktionsbara, så vi behöver bara lägga till kod för att hantera omkopplarna.

Port 1 Registeradressblock

Kom ihåg att vi täckte dessa i föregående Instructable, men vi måste inkludera en ny:

  • Port 1 Inmatningsregisteradress = 0x40004C00
  • Port 1 Utgångsregisteradress = 0x40004C02
  • Port 1 Riktning Registeradress = 0x40004C04
  • Port 1 Resistor Aktivera Registeradress = 0x40004C06
  • Port 1 Välj 0 Registeradress = 0x40004C0A
  • Port 1 Välj 1 Registrera adress = 0x40004C0C

När du använder portarna som ingångar är det bra att använda MSP432: s interna pull-up eller pull-down motstånd.

Eftersom Launchpad -utvecklingsbordet har kopplat de två omkopplarna till marken (LÅG när den trycks ned), betyder det att vi bör använda pull UP -motstånd för att se till att vi har en solid HIGH när de inte trycks ned.

Drag upp / dra ner motstånd

Det krävs två olika Port 1 Register-adresser för att knyta dessa switchingångar till pull-up-motstånd.

1) Använd Port 1 Resistor-Enable-registret (0x40004C06) för att bara ange att du vill ha motstånd (för de två bitarna), 2) och använd sedan Port 1 Output-registret (0x40004C02) för att ställa in motstånden som antingen pull-up eller pull-down. Det kan verka förvirrande att vi använder ett Output-register på ingångar. Utdataregistret har nästan som ett dubbla ändamål.

Så, för att återigen ange ett annat sätt, kan utgångsregistret antingen skicka ut en HÖG eller LÅG till en utgång (till exempel den enda röda lysdioden), och / eller det används för att ställa in upp- eller neddragningsmotstånd för ingångar, MEN ENDAST om den funktionen har aktiverats via motståndsaktiveringsregistret.

Viktigt i ovanstående-när du skickar/ställer in en LÅG eller HÖG till vilken utmatningsbit som helst måste du behålla inmatningsbitarnas upp-/neddragningstillstånd samtidigt.

(videon försöker förklara)

Läser en portinmatningsbit

  • Ställ in SEL0 / SEL1 för GPIO -funktionalitet
  • Ställ in DIR -registret som ingång för switchbitarna, men som utgång för lysdioden (samtidigt i samma byte)
  • Aktivera motstånd
  • Ställ in dem som uppdragningsmotstånd
  • Läs porten
  • Du kanske vill filtrera det lästa värdet för att isolera bara de bitar du behöver (switch 1 och 2)

Rekommenderad: