Obsah:

MONTÁŽ GPIO ARM - T.I. SADA NA UČENÍ ROBOTICKÉHO SYSTÉMU - LAB 6: 3 kroky
MONTÁŽ GPIO ARM - T.I. SADA NA UČENÍ ROBOTICKÉHO SYSTÉMU - LAB 6: 3 kroky

Video: MONTÁŽ GPIO ARM - T.I. SADA NA UČENÍ ROBOTICKÉHO SYSTÉMU - LAB 6: 3 kroky

Video: MONTÁŽ GPIO ARM - T.I. SADA NA UČENÍ ROBOTICKÉHO SYSTÉMU - LAB 6: 3 kroky
Video: Instalace openSUSE na RaspberryPi nebo BananaPi (Michal Hrusecky) 2024, Červenec
Anonim
MONTÁŽ GPIO ARM - T. I. SADA NA UČENÍ ROBOTICKÉHO SYSTÉMU - LAB 6
MONTÁŽ GPIO ARM - T. I. SADA NA UČENÍ ROBOTICKÉHO SYSTÉMU - LAB 6

Ahoj, V předchozím Instructable about learn ARM assembly using the Texas Instruments TI-RSLK (uses the MSP432 microcontroller), aka Lab 3 if you doing the T. I. Samozřejmě jsme prošli několik velmi základních pokynů, jako je zápis do registru a podmíněné smyčky. Provedli jsme popravu pomocí Eclipse IDE.

Malé programy, které jsme provedli, nijak neovlivňovaly vnější svět.

Tak trochu nuda.

Zkusme to dnes trochu změnit tím, že se něco naučíme o vstupních/výstupních portech, konkrétně o digitálních pinech GPIO.

Stává se, že tento MSP432 přichází na vývojové desce již má dva tlačítkové přepínače, RGB LED a červenou LED, které jsou svázány s některými porty GPIO.

To znamená, že když se naučíme nastavovat a manipulovat s těmito piny prostřednictvím sestavení, můžeme tyto efekty vizuálně vidět.

Mnohem zajímavější než jen procházet debuggerem.

(Stále jdeme na krok - to bude naše funkce „zpoždění“):-D

Krok 1: Zkusme zapisovat do / číst z RAM

Než přejdeme k přístupu a ovládání GPIO, měli bychom udělat malý krok.

Začněme pouze čtením a zápisem na standardní adresu paměti. Z předchozího Instructable (viz obrázky tam) víme, že RAM začíná na 0x2000 0000, takže použijme tu adresu.

Přesuneme data mezi jádrový registr (R0) a 0x2000 0000.

Začneme základní strukturou souboru nebo obsahem montážního programu. Chcete -li vytvořit projekt montáže pomocí TI's Code Composer Studio (CCS) a některé ukázkové projekty, nahlédněte do tohoto Instructable.

.palec

.text.align 2.globální hlavní.thumbfunc hlavní hlavní:.asmfunc; ---------------------------------- -----------------------------------------------; (náš kód půjde sem); ------------------------------------------ ---------------------------------------.endasmfunc.end

Chci do horní části přidat něco nového, pokud by existovala nějaká prohlášení (směrnice). Později to bude jasnější.

ACONST.set 0x20000000; použijeme to dále (je to konstanta)

; očividně '0x' označuje hexadecimální hodnotu.

Náš obsah počátečního souboru tedy nyní vypadá takto:

.palec

.text.align 2 ACONST.set 0x20000000; použijeme to dále (je to konstanta); očividně '0x' označuje hexadecimální hodnotu..global main.thumbfunc main main:.asmfunc; --------------------------------------- ------------------------------------------; (náš kód půjde sem); ------------------------------------------ ---------------------------------------.endasmfunc.end

Nyní, když máme výše uvedené, přidejme kód mezi přerušované řádky.

Začneme zápisem do umístění RAM. Nejprve vytvoříme datový vzor, hodnotu, kterou budeme zapisovat do RAM. K určení této hodnoty nebo údajů používáme základní registr.

Poznámka: pamatujte, že v kódu jakýkoli řádek se středníkem (';') znamená, že je to pouze komentář za tímto středníkem.

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

; PÍŠENÍ; ------------------------------------------------ ---------------------------------------------- MOV R0, #0x55; hlavní registr R0 bude obsahovat data, která chceme zapsat do umístění RAM.; očividně '0x' označuje hexadecimální hodnotu.

Dále se podívejme na prohlášení, která NEPRACUJÍ.

; MOV MOV nelze použít k zápisu dat do umístění RAM.

; MOV je pouze pro okamžitá data do registru; nebo z jednoho registru do druhého; tj. MOV R1, R0.; STR musí používat STR.; STR R0, = ACONST; Špatný výraz ve výrazu ('='); STR R0, 0x20000000; Nelegální režim adresování pro instrukce obchodu; STR R0, ACONST; Nelegální režim adresování pro instrukci obchodu

Aniž bychom příliš vysvětlovali, pokusili jsme se použít výše uvedenou 'ACONST'. V zásadě je to záložní nebo konstantní místo použití doslovné hodnoty, jako je 0x20000000.

Pomocí výše uvedeného jsme nebyli schopni zapisovat a zapisovat do umístění RAM. Zkusme něco jiného.

; zdá se, že musíme použít jiný registr obsahující umístění RAM v

; za účelem uložení do tohoto umístění RAM MOV R1, #0x20000000; nastavte umístění RAM (nikoli jeho obsah, ale umístění) do R1.; očividně '0x' označuje hexadecimální hodnotu. STR R0, [R1]; zapište, co je v R0 (0x55) do RAM (0x20000000) pomocí R1.; používáme jiný registr (R1), který má adresu umístění RAM; aby bylo možné zapsat do TO RAM umístění.

Jiný způsob, jak provést výše uvedené, ale místo hodnoty doslovné adresy použít 'ACONST':

; udělejme znovu výše, ale použijme symbol místo doslovné hodnoty umístění RAM.

; chceme použít 'ACONST' jako záložní zdroj pro 0x20000000.; stále musíme udělat '#' pro označení okamžité hodnoty; takže (viz nahoře) jsme museli použít směrnici '.set'.; abychom to dokázali, změňme datový vzorec v R0. MOV R0, #0xAA; ok, jsme připraveni zapisovat do RAM pomocí symbolu namísto doslovné hodnoty adresy MOV R1, #ACONST STR R0, [R1]

Video jde do dalších podrobností a také krok za krokem čtení z paměťového místa.

Můžete si také prohlédnout připojený zdrojový soubor.asm.

Krok 2: Některé základní informace o portu

Image
Image
Některé základní informace o portu
Některé základní informace o portu
Některé základní informace o portu
Některé základní informace o portu

Nyní, když máme dobrý nápad, jak zapisovat / číst z místa v paměti RAM, nám to pomůže lépe porozumět tomu, jak ovládat a používat kolík GPIO

Jak tedy interagujeme s piny GPIO? Z našeho předchozího pohledu na tento mikrokontrolér a jeho instrukce ARM víme, jak se vypořádat s jeho interními registry, a víme, jak interagovat s adresami paměti (RAM). Ale GPIO piny?

Stává se, že tyto piny jsou mapovány do paměti, takže s nimi můžeme zacházet podobně jako s paměťovými adresami.

To znamená, že potřebujeme vědět, jaké jsou tyto adresy.

Níže jsou počáteční adresy portů. Mimochodem, pro MSP432 je „port“sbírka pinů, a ne jen jeden pin. Pokud znáte Raspberry Pi, věřím, že se liší od situace zde.

Modré kruhy na výše uvedeném obrázku ukazují nápis na desce pro dva spínače a LED diody. Modré čáry ukazují na skutečné LED diody. Nebudeme se muset dotýkat propojek záhlaví.

Níže jsem tučně vyznačil porty, kterými se zabýváme.

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

Ještě jsme neskončili. Potřebujeme více informací.

Abychom mohli ovládat port, potřebujeme několik adres. Proto ve výše uvedeném seznamu vidíme „sudé adresy“nebo „liché adresy“.

Bloky adres I/O

Budeme potřebovat další adresy, například:

  • Port 1 Vstupní registrační adresa = 0x40004C00
  • Adresa registru výstupu 1 výstupu = 0x40004C02
  • Port 1 Směr registrace Adresa = 0x40004C04
  • Port 1 Vyberte 0 Registrační adresa = 0x40004C0A
  • Port 1 Vyberte 1 Registrační adresa = 0x40004C0C

A možná budeme potřebovat další.

Dobře, nyní známe rozsah adres registrů GPIO pro ovládání jediné červené LED.

Velmi důležitá poznámka: Každý I/O port na desce MSP432 LaunchPad je souborem několika (obvykle 8) pinů nebo linek a každý lze individuálně nastavit jako vstup nebo výstup.

To například znamená, že pokud nastavujete hodnoty pro „adresu směrového registru portu 1“, musíte se zajímat o to, jaký bit (nebo bity) na dané adrese nastavujete nebo měníte. Více o tom později.

Sekvence programování portů GPIO

Konečně kus, který potřebujeme, je proces nebo algoritmus k ovládání LED.

Jednorázová inicializace:

  • Konfigurujte P1.0 (P1SEL1REG: P1SEL0REG Register) <--- 0x00, 0x00 pro normální funkci GPIO.
  • Nastavte bit směrového registru 1 P1DIRREG jako výstup nebo HIGH.

Smyčka:

Zapište červenou LED diodou HIGH do bitu 0 registru P1OUTREG

  • Volání funkce zpoždění
  • Zapište LOW do bitu 0 registru P1OUTREG, abyste vypnuli červenou LED
  • Volání funkce zpoždění
  • Opakujte smyčku

Která funkce vstupu / výstupu (Konfigurace SEL0 a SEL1)

Mnoho pinů na LaunchPadu má více použití. Stejný pin může být například standardní digitální GPIO nebo může být také použit v sériové komunikaci UART nebo I2C.

Chcete -li pro daný pin použít jakoukoli konkrétní funkci, musíte tuto funkci vybrat. Musíte nakonfigurovat funkci pinu.

K tomuto kroku je obrázek výše, který se pokouší vysvětlit tento koncept ve vizuální podobě.

Adresy SEL0 a SEL1 tvoří párovou kombinaci, která funguje jako jakýsi výběr funkce / funkce.

Pro naše účely chceme standardní digitální GPIO pro bit 0. To znamená, že potřebujeme, aby bit 0 pro SEL0 a SEL1 byl LOW.

Sekvence programování portů (znovu)

1. Zapište 0x00 do registru P1 SEL 0 (adresa 0x40004C0A). Tím se nastaví LOW pro bit 0

2. Zapište 0x00 do registru P1 SEL 1 (adresa 0x40004C0C). Tím se nastaví LOW pro bit 0, nastavení pro GPIO.

3. Napište 0x01 do registru P1 DIR (adresa 0x40004C04). Tím se nastaví HIGH pro bit 0, což znamená VÝSTUP.

4. Zapněte LED zapisováním 0x01 do P1 OUTPUT Register (adresa 0x40004C02)

5. Udělejte nějaké zpoždění (nebo jen jeden krok během ladění)

6. Vypněte LED zapsáním registru 0x00 až P1 VÝSTUP (adresa 0x40004C02)

7. Udělejte nějaké zpoždění (nebo jen jeden krok při ladění)

8. Opakujte kroky 4 až 7.

Přidružené video k tomuto kroku nás provede celým procesem v živé ukázce, když procházíme jednotlivými instalačními instrukcemi a promlouváme a ukazujeme akci LED. Omluvte prosím délku videa.

Krok 3: Zachytili jste jednu chybu ve videu?

Ve videu, které prochází celým procesem programování a rozsvícení LED, byl v hlavní smyčce další krok, který mohl být přesunut až k jednorázové inicializaci.

Děkujeme, že jste si našli čas na projití tohoto Instructable.

Další rozšiřuje to, co jsme zde začali.

Doporučuje: