Taula de continguts:

ASSEMBLEA DE BRAÇOS GPIO - T.I. KIT D'APRENENTATGE DEL SISTEMA ROBOTTIC - LAB 6: 3 Passos
ASSEMBLEA DE BRAÇOS GPIO - T.I. KIT D'APRENENTATGE DEL SISTEMA ROBOTTIC - LAB 6: 3 Passos

Vídeo: ASSEMBLEA DE BRAÇOS GPIO - T.I. KIT D'APRENENTATGE DEL SISTEMA ROBOTTIC - LAB 6: 3 Passos

Vídeo: ASSEMBLEA DE BRAÇOS GPIO - T.I. KIT D'APRENENTATGE DEL SISTEMA ROBOTTIC - LAB 6: 3 Passos
Vídeo: Red Moon Rising | Critical Role | Campaign 3, Episode 50 2024, Juliol
Anonim
ASSEMBLEA DE BRAÇOS GPIO - T. I. KIT D'APRENENTATGE DEL SISTEMA ROBOTTIC - LAB 6
ASSEMBLEA DE BRAÇOS GPIO - T. I. KIT D'APRENENTATGE DEL SISTEMA ROBOTTIC - LAB 6

Hola, En un instructable anterior sobre l’aprenentatge del muntatge ARM mitjançant el Texas Instruments TI-RSLK (utilitza el microcontrolador MSP432), també conegut com Lab 3 si esteu fent el T. I. Per descomptat, vam repassar algunes instruccions molt bàsiques, com ara escriure en un registre i el bucle condicional. Hem realitzat l'execució mitjançant l'IDE Eclipse.

Els petits programes que vam executar no van fer res per interactuar amb el món exterior.

Una mica avorrit.

Intentem canviar-ho una mica avui aprenent una mica sobre els ports d’entrada / sortida, en concret, els pins GPIO digitals.

Succeeix que aquest MSP432 ve en una placa de desenvolupament que ja té dos commutadors de polsador, un LED RGB i un LED vermell, tots lligats a alguns ports GPIO.

Això significa que a mesura que aprenem a configurar i manipular aquests pins mitjançant el muntatge, podem veure visualment aquests efectes.

Molt més interessant que passar pel depurador.

(Encara anem a fer un pas, aquesta serà la nostra funció de "retard"):-D

Pas 1: provem d'escriure / llegir des de la memòria RAM

Abans de passar a accedir i controlar el GPIO, hauríem de fer un petit pas.

Comencem només llegint i escrivint a una adreça de memòria estàndard. Sabem per l’anterior Instructable (vegeu les imatges allà) que la RAM comença a 0x2000 0000, així que fem servir aquesta adreça.

Anem a moure les dades entre un registre central (R0) i 0x2000 0000.

Comencem amb una estructura de fitxers bàsica o el contingut d’un programa de muntatge. Consulteu aquesta instrucció per crear un projecte de muntatge mitjançant Code Composer Studio (CCS) de TI i alguns exemples de projectes.

.polze

.text.align 2.global main.thumbfunc main main:.asmfunc; ---------------------------------- -----------------------------------------------; (el nostre codi anirà aquí); ------------------------------------------ ---------------------------------------.endasmfunc.end

Vull afegir alguna cosa nova a la secció superior, si hi hagués algunes declaracions (directives). Es farà més clar més endavant.

ACONST.set 0x20000000; ho farem servir més avall (és una constant)

; òbviament, "0x" indica el que segueix sent un valor hexadecimal.

Per tant, el contingut inicial del fitxer inicial és així:

.polze

.text.align 2 ACONST.set 0x20000000; ho farem servir més avall (és una constant); òbviament, "0x" indica el que segueix sent un valor hexadecimal..global main.thumbfunc main main:.asmfunc; --------------------------------------- ------------------------------------------; (el nostre codi anirà aquí); ------------------------------------------ ---------------------------------------.endasmfunc.end

Ara que tenim l’anterior, afegim codi entre les línies discontínues.

Comencem per escriure a una ubicació RAM. Primer establirem el patró de dades, un valor, que escriurem a la memòria RAM. Utilitzem un registre bàsic per establir aquest valor o dades.

Nota: recordeu que al codi, qualsevol línia que tingui un punt i coma (';') significa que tot és un comentari després d'aquest punt i coma.

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

; ESCRIPTURA; ------------------------------------------------ ----------------------------------------------- MOV R0, # 0x55; el registre principal R0 contindrà les dades que volem escriure a la ubicació de la memòria RAM.; òbviament, "0x" indica el que segueix sent un valor hexadecimal.

A continuació, fem una ullada a les afirmacions que NO funcionen.

; MOV MOV no es pot utilitzar per escriure dades en una ubicació RAM.

; MOV és només per a dades immediates al registre,; o d'un registre a un altre; és a dir, MOV R1, R0.; STR ha d'utilitzar STR.; STR R0, = ACONST; Expressió incorrecta (el '='); STR R0, 0x20000000; Mode d'adreces il·legals per a instruccions de botiga; STR R0, ACONST; Mode d’adreces il·legals per a instruccions de botiga

Sense explicar-ho massa, hem intentat utilitzar aquest "ACONST" anterior. Bàsicament, és una substitució o constant en lloc d’utilitzar un valor literal com 0x20000000.

No hem estat capaços d’escriure per escriure a la ubicació de RAM utilitzant l’anterior. Provem una altra cosa.

; sembla que hem d 'utilitzar un altre registre que contingui la ubicació de RAM a

; per emmagatzemar en aquesta ubicació RAM MOV R1, # 0x20000000; estableix la ubicació RAM (no el seu contingut, sinó la ubicació) a R1.; òbviament, "0x" indica el que segueix sent un valor hexadecimal. STR R0, [R1]; escriviu el que hi ha a R0 (0x55) a la memòria RAM (0x20000000) mitjançant R1.; fem servir un altre registre (R1) que té l'adreça d'ubicació RAM; per tal d’escriure a aquesta ubicació RAM.

Una altra manera de fer l’anterior, però utilitzant “ACONST” en lloc del valor de l’adreça literal:

; tornem a fer l'anterior, però fem servir un símbol en lloc d'un valor literal d'ubicació RAM.

; volem utilitzar "ACONST" com a substitut de 0x20000000.; encara hem de fer el "#" per significar un valor immediat; de manera que (vegeu la part superior), vam haver d’utilitzar la directiva ".set".; per demostrar-ho, canviem el patró de dades a R0. MOV R0, # 0xAA; d'acord, estem preparats per escriure a la memòria RAM utilitzant el símbol en lloc del valor d'adreça literal MOV R1, #ACONST STR R0, [R1]

El vídeo es detalla amb més detall, a més de fer un pas per la lectura des de la ubicació de la memòria.

També podeu veure el fitxer.asm d'origen adjunt.

Pas 2: informació bàsica del port

Image
Image
Alguna informació bàsica del port
Alguna informació bàsica del port
Alguna informació bàsica del port
Alguna informació bàsica del port

Ara que tenim una bona idea de com escriure / llegir des d'una ubicació de RAM, això ens ajudarà a entendre millor com controlar i utilitzar el pin GPIO

Llavors, com interactuem amb els pins GPIO? A partir de la nostra mirada anterior sobre aquest microcontrolador i les seves instruccions ARM, sabem com tractar els seus registres interns i sabem com interactuar amb les adreces de memòria (RAM). Però els pins GPIO?

Succeeix que aquests pins estan assignats a la memòria, de manera que podem tractar-los de la mateixa manera que les adreces de memòria.

Això significa que hem de saber quines són aquestes adreces.

A continuació es mostren les adreces inicials del port. Per cert, per al MSP432, un "port" és una col·lecció de pins i no només un pin. Si esteu familiaritzat amb el Raspberry Pi, crec que és diferent de la situació aquí.

Els cercles blaus de la imatge anterior mostren l’escriptura a la pissarra per als dos interruptors i els LED. Les línies blaves apunten als LED reals. No haurem de tocar els ponts de capçalera.

Els ports que ens preocupen els he fet en negreta a continuació.

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

Encara no hem acabat. Necessitem més informació.

Per controlar un port, necessitem diverses adreces. És per això que a la llista anterior veiem "adreces parelles" o "adreces senars".

Registre d'E / S blocs d'adreces

Necessitarem altres adreces, com ara:

  • Adreça del registre d'entrada del port 1 = 0x40004C00
  • Adreça del registre de sortida del port 1 = 0x40004C02
  • Adreça del registre de direcció del port 1 = 0x40004C04
  • Port 1 Seleccioneu 0 Adreça de registre = 0x40004C0A
  • Port 1 Seleccioneu 1 Adreça de registre = 0x40004C0C

I potser necessitarem d’altres.

D’acord, ara coneixem l’abast de les adreces de registre GPIO per controlar el LED vermell únic.

Una nota molt important: cada port d'E / S de la placa MSP432 LaunchPad és una col·lecció de diversos pins o línies (normalment 8), i cadascun es pot configurar individualment com a entrada o sortida.

Això vol dir, per exemple, que si definiu valors per a "Adreça de registre de direcció de port 1", us haureu de preocupar del bit (o bits) que esteu configurant o canviant en aquesta adreça. Més informació sobre això més endavant.

Seqüència de programació de ports GPIO

L’última peça que necessitem és un procés o algorisme que cal utilitzar per controlar el LED.

Inicialització única:

  • Configureu P1.0 (P1SEL1REG: registre P1SEL0REG) <--- 0x00, 0x00 per a la funcionalitat GPIO normal.
  • Establiu el bit de registre de direcció 1 de P1DIRREG com a sortida o HIGH.

Bucle:

Escriviu HIGH al bit 0 del registre P1OUTREG per encendre el LED vermell

  • Truqueu a una funció de retard
  • Escriviu BAIX al bit 0 del registre P1OUTREG per apagar el LED vermell
  • Truqueu a una funció de retard
  • Repetiu el bucle

Quina funció d'entrada / sortida (configureu SEL0 i SEL1)

Molts dels pins del LaunchPad tenen múltiples usos. Per exemple, el mateix pin pot ser GPIO digital estàndard, o també es pot utilitzar en comunicacions en sèrie UART o I2C.

Per utilitzar qualsevol funció específica per a aquest pin, heu de seleccionar aquesta funció. Cal configurar la funció del pin.

Hi ha una imatge superior per a aquest pas que intenta explicar aquest concepte en forma visual.

Les adreces SEL0 i SEL1 formen una combinació de parells que actuen com una mena de selecció de funcions / funcions.

Per als nostres propòsits, volem un GPIO digital estàndard per al bit 0. Això vol dir que necessitem que el bit 0 per SEL0 i SEL1 sigui BAIX.

Seqüència de programació de ports (novament)

1. Escriviu 0x00 a P1 SEL 0 Register (adreça 0x40004C0A). Això estableix un BAIX per al bit 0

2. Escriviu 0x00 a P1 SEL 1 Register (adreça 0x40004C0C). Això estableix un BAIX per al bit 0, configurant per a GPIO.

3. Escriviu 0x01 al registre DIR de P1 (adreça 0x40004C04). Això estableix un HIGH per al bit 0, que significa OUTPUT.

4. Enceneu el LED escrivint un registre de sortida 0x01 a P1 (adreça 0x40004C02)

5. Feu algun tipus de retard (o només en un sol pas durant la depuració)

6. Apagueu el LED escrivint un registre de sortida 0x00 a P1 (adreça 0x40004C02)

7. Feu algun tipus de retard (o només en un sol pas durant la depuració)

8. Repetiu els passos del 4 al 7.

El vídeo associat a aquest pas ens porta a través de tot el procés en una demostració en directe, ja que anem fent un sol pas i parlem a través de totes les instruccions de muntatge i mostrem l'acció LED. Perdoneu la durada del vídeo.

Pas 3: vau detectar l’únic defecte del vídeo?

Al vídeo que recorre tot el procés de programació i il·luminació del LED, hi havia un pas addicional al bucle principal, que es podria haver mogut fins a la inicialització única.

Gràcies per dedicar-vos el temps per passar per aquest instructiu.

La següent amplia el que hem començat aquí.

Recomanat: