Sisällysluettelo:

Osa 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 Steps
Osa 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 Steps

Video: Osa 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 Steps

Video: Osa 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 Steps
Video: Part 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo 2024, Heinäkuu
Anonim
Image
Image

Tämän ohjeen painopiste on STM32 Nucleo -mikro-ohjaimessa. Motivaatio sille, että pystytään luomaan kokoonpanoprojekti paljaista luista. Tämä auttaa meitä syventymään ja ymmärtämään MSP432 Launchpad -projektia (TI-RSLK), joka on ollut useiden Instructables-aiheiden aihe.

Verkossa ei ole paljon apua, jos haluat luoda MSP432: lle vain kokoonpanoprojektin Code Composer Studion avulla. Tähän asti olemme vain kopioineet/liittäneet olemassa olevasta kokoonpanoprojektista. Tämä lähestymistapa on palvellut meitä hyvin.

Kuitenkin nyt, laboratoriossa 7, olemme törmänneet pieneen ongelmaan. Tai ainakin tilapäinen hikka. Lab 7 esittelee äärellisen tilan koneita, ja ensimmäinen kohtaamamme asia on tarve luoda ja käyttää arvoryhmää. Koska TI -kurssi käyttää pääasiassa C -ohjelmointia - tämä ei ole ongelma. Mutta nämä ohjeet ovat keskittyneet kokoonpanoon, ei C.

Lisäksi, koska taulukko on vain lukuarvoja, olisi hyvä laittaa se flash-muistiin, ei RAM-muistiin.

STM32 MCU: ta käyttävissä kokoonpanoprojekteissa näyttää olevan paljon enemmän apua verkossa, joten aloitamme tällä Instructable -ohjelmalla, jonka tarkoituksena on käyttää opittua, ja hakea sitten MSP432: een ja Code Composer Studioon.

Matkalla tähän tavoitteeseen olemme saaneet kokemusta myös toisesta suositusta mikro-ohjaimesta.

Vaihe 1: Laitteen ensimmäinen testaus

Laitteen ensimmäinen testi
Laitteen ensimmäinen testi
Laitteen ensimmäinen testi
Laitteen ensimmäinen testi
Laitteen ensimmäinen testi
Laitteen ensimmäinen testi

Miksi taas valita STM32 Nucleo?

Rehellisesti? Koska etsin hyviä artikkeleita paljaiden metallien kokoonpanoprojekteista ARM-ohjaimille, ja törmäsin tähän sarjaan. Ja myös siksi, että STM32 näyttää olevan suosittu MCU.

Tein tutkimusta (valittavana on paljon versioita - katso kuva yllä), mutta lopulta siitä tuli mitä voin todella saada, koska aioin käyttää Amazonia (Yhdysvalloissa).

Se tulee yksinkertaisessa mutta ammattimaisessa paketissa, jossa on joitain käynnistysohjeita. Oli hieman hassua nähdä, että ohjaimeen poltettu demo oli melkein täsmälleen se, mitä olemme tehneet aiemmissa Instructablesissa - LED vilkkuu ja muuttaa nopeutta napin painalluksen mukaan.

Näyttää siltä, että tämä kehityskortti on hyvin samanlainen kuin MSP432, koska siinä on 2 LEDiä ja yksi käyttäjän painike. MSP432: ssa on 2 käyttäjäpainiketta.

Kuten kuvista näkyy, olin hieman hämmästynyt siitä, että piirilevyssä on mini- eikä mikro -USB. Johto oli pakko ostaa.

Toinen hyvä testi on, että kun liität sen tietokoneeseesi (käytän Linux -laatikkoa), se näkyy tiedostonhallinnassani tiedostojärjestelmänä nimeltä "NODE_F303RE". Avaaminen, joka paljastaa kaksi tiedostoa, yhden HTML: n ja yhden tekstin.

Siinä se, mutta ainakin se sanoo myös, että yhteys näyttää melko helpolta.

Nyt olemme valmiita aloittamaan.

Yritän olla toistamatta mitään hyvää tietoa IVONOMICON Bare Metal -artikkelisarjasta, vaan täydentämään sitä.

Vaihe 2: Olennaiset asiat

Ensimmäinen asia, jonka tarvitsemme, on kääntäjä.

Ja sitten tarvitsemme virheenkorjaimen:

devchu@chubox: ~ $ sudo apt-get install gdb-arm-none-eabi asennettu, 0 poistettava ja 8 ei päivitetty. Tarvitset 2 722 kt arkistoja. Tämän toimenpiteen jälkeen käytetään 7 738 kt lisälevytilaa. Hanki: 1 https://us.archive.ubuntu.com/ubuntu xenial/Universum amd64 gdb-arm-none-eabi amd64 7.10-1ubuntu3+9 [2, 722 kB] Haettu 2, 722 kB 1 sekunnissa (1, 988 kB/s) Aiemmin valitsemattoman paketin valitseminen gdb-arm-none-eabi. (Luetaan tietokantaa… 262428 tiedostoa ja hakemistoa on tällä hetkellä asennettu.) Pakkauksen purkamista valmistellaan…/gdb-arm-none-eabi_7.10-1ubuntu3+9_amd64.deb… gdb-arm-none-eabi-pakkauksen purkaminen (7.10-1ubuntu3+9)… Käsitellään laukaisee man-db (2.7.5-1)… gdb-arm-none-eabi (7.10-1ubuntu3+9) määrittäminen …

Vaihe 3: Essentials - Windows

Yllä oleva vaihe oletti, että käytämme Linuxia. Mitä jos käytämme Windowsia?

Voit siirtyä arm Developer -sivustolle, ja saatavilla on useita latausvaihtoehtoja. Käytän Windows 8 -konetta.

Asennuksen aikana valitsin sen asentamisen juurihakemistoon "C: \" ohjelmatiedostojen sijasta vain siksi, että käytän myös cygwiniä, ja oli helpompaa luoda linkki paikallisesta roskakoristani C -pääkansioon kuin kaikki sotku ohjelmatiedostojen polulla (välilyönneillä jne.).

Näin ollen cygwin -ympäristöni ja polkuni jne. Näyttää tältä:

C: / cygwin64 / home / bin / arm-none-eabi-gcc, jossa arm-none-eabi-gcc on linkki C: / GNUToolsArmEmbedded / 7.2018.q2.update / bin / arm-none-eabi- gcc.

Sitten loin "dev" -kansion cygwin homeen, ja sinne sijoitin core. S -tiedoston ja suoritin kääntäjäkomennon. (katso tarkemmin alla kääntäjän juttuja).

Tein täsmälleen saman asian gdb: lle (arm-none-eabi-gdb).

Vaihe 4: Mitkä ovat olennaiset asiat

Joten mikä on "gcc-arm-none-eabi"?

Gnu -kääntäjä (GCC) kokoaa ohjelmointikielet (kuten C) sen koneen natiivikoodiksi, jolla se toimii. Jos esimerkiksi kääntäisit jonkin C -koodin käyttämällä GCC: tä Windows -koneellasi, se rakennettaisiin toimimaan Windows -koneessa. Luotu suoritettava tiedosto ei (yleensä) toimi ARM-mikro-ohjaimella.

Joten voidaksemme rakentaa ohjelmia, jotka ladataan ja poltetaan ARM-mikro-ohjaimeen (tässä tapauksessa se olisi STM32 Nucelo), meidän on annettava GCC: lle jotain muuta: mahdollisuus "ristikääntää". Toisin sanoen kyky luoda suoritettava tiedosto, ei sen alkuperäiselle järjestelmälle (ja prosessorille), vaan kohdejärjestelmälle (ARM-mikro-ohjain). Siellä "gcc-arm-none-eabi" tulee peliin.

Mikä sitten on "gdb-arm-none-eabi"?

Kun olemme ladanneet ja polttaneet (välähtäneet) äskettäin luodun suoritustiedoston mikro-ohjaimeen, haluamme todennäköisesti korjata sen-askel rivi riviltä koodia. GDB on gnu -virheenkorjaaja, ja myös se tarvitsee tavan tehdä tehtävänsä, mutta se on kohdistettu eri järjestelmään.

Siten gdb-arm-none-eabi on GDB: lle, mitä gcc-arm-none-eabi on GCC: lle.

Toinen ehdotettu paketin asennus oli "libnewlib-arm-none-eabi". Mikä se on?

Newlib on C -kirjasto ja matematiikkakirjasto, joka on tarkoitettu käytettäväksi sulautetuissa järjestelmissä. Se on ryhmittymä useista kirjaston osista, jotka kaikki kuuluvat ilmaisten ohjelmistolisenssien alle, joten ne ovat helposti käytettäviä sulautetuissa tuotteissa.

Ja lopuksi paketti "libstdc ++-arm-none-eabi". Se on aika ilmeinen; se on ristikääntäjän C ++ -kirjasto; sulautetuille ARM-mikro-ohjaimille.

Vaihe 5: Linkkitiedosto

Linkkeritiedosto
Linkkeritiedosto
Linkkeritiedosto
Linkkeritiedosto

Luodaan linkkiskripti.

Yksi keskeinen osa tai lohko tässä tiedostossa olisi MEMORY -komento.

--- from sourceware.org:

Linkkerin oletusasetukset sallivat kaiken käytettävissä olevan muistin varaamisen. Voit ohittaa tämän käyttämällä MEMORY -komentoa. MEMORY -komento kuvaa kohteen muistilohkojen sijainnin ja koon. Voit käyttää sitä kuvaamaan, mitä muistialueita linkki voi käyttää ja mitä muistialueita sen on vältettävä. Voit sitten määrittää osia tietyille muistialueille. Linkki määrittää osioosoitteet muistialueiden perusteella ja varoittaa alueista, jotka täyttyvät liian täyteen. Linkittäjä ei sekoita osioita ympäri sopimaan käytettävissä oleville alueille. Linkkerikomentosarja voi sisältää monia MEMORY -komennon käyttötarkoituksia, mutta kaikkia määritettyjä muistilohkoja käsitellään ikään kuin ne olisi määritetty yhdessä MEMORY -komennossa.:

MUISTI

{nimi [(attr)]: ALKUPERÄ = alkuperä, PITUUS = len…}

Esimerkki artikkelissa:

/* Määritä RAM -muistin loppu ja pino -muistin raja* //* (4KB SRAM linjalla STM32F031x6, 4096 = 0x1000)*//* (RAM alkaa osoitteesta 0x20000000) _estack = 0x20001000;

MUISTI

{FLASH (rx): ORIGIN = 0x08000000, LENGTH = 32K RAM (rxw): ORIGIN = 0x20000000, LENGTH = 4K}

Meidän on siis selvitettävä, kuinka paljon FLASH -ohjelmaa (ohjelmamme ja vakioimme jne.) Ja kuinka paljon RAM -muistia (ohjelman käytettäväksi; kasa ja pino jne.) Tietylle levyllemme. Tästä tulee vähän mielenkiintoista.

Mukava pieni kortti, joka tulee Nucleon mukana, sanoo, että sen flash -muisti on 512 kt ja SRAM on 80 kt. Kuitenkin, kun se liitetään USB: hen, se asennetaan tiedostojärjestelmäksi, jossa on kaksi tiedostoa, ja sekä tiedostonhallinta että GParted osoittavat, että sillä on yli 540+ tavua tilaa. (RAM?).

MUTTA, kun yrität poistaa kaksi tiedostoa tiedostonhallinnan avulla, irrotat laitteen ja kytket sen uudelleen, molemmat tiedostot näkyvät edelleen. (ja tiedostonhallinta tunnisti jotain, koska jokaisessa tiedostossa on pieni "lukko" -kuvake.

Joten mennään kortilla oleviin lukuihin. Joten nyt otamme yllä olevan esimerkin ja muunnamme sen erityiseksi alukseksemme.

Voit halutessasi käyttää jotain tällaista online -muistimuunninta siirtyäksesi yleisestä KB: stä tiettyyn tavumäärään.

Sitten voit halutessasi käyttää online -desimaali -heksaani -muunninta.

/ * Määritä RAM -muistin loppu ja pino -muistin raja */

/* (4KB SRAM linjalla STM32F031x6, 4096 = 0x1000)* //* esimerkki*/

/ * vaihe 1: (80 kt: n SRAM STM32F303RE: ssä, 81920 = 0x14000) * // * meidän levy */

/* vaihe 2, lisää heksakoko heksadesimaaliseen aloitusosoitteeseen (alla). */

/ * (RAM alkaa osoitteesta 0x20000000) */

_pino = 0x20001000; /* esimerkki */

_pino = 0x20014000; / * hallituksemme */

MUISTI {

FLASH (rx): ALKUPERÄ = 0x08000000, PITUUS = 512K

RAM (rxw): ALKUPERÄ = 0x20000000, PITUUS = 80K

}

Kutsutaan yllä olevaa tiedostoa "linker.script.ld".

Vaihe 6: Vektoritaulukko

Vektoritaulukko
Vektoritaulukko

Nyt aiomme luoda pienen kokoonpanotiedoston (jossa on direktiivejä) suorittamaan joitain hyvin yksinkertaisia keskeytysten käsittelyä. Seuraamme artikkelin esimerkkiä ja luomme tiedoston nimeltä "core. S".

Tässä on jälleen esimerkkitiedoston sisältö, mutta tein muutoksen erityiselle aluksellemme:

// Nämä ohjeet määrittävät sirumme ja

// käyttämämme kokoonpanokieli:.syntax unified /*Katso alla tämän koodialueen jälkeen* //*.cpu cortex-m0* / /*kommentoi esimerkin riviä* /.cpu cortex-m4 /* lisää sen sijaan korttimme kuori. katso yllä oleva kuva tässä vaiheessa * / /*.fpu softvfp * / / *kommentoi esimerkin riviä * /.fpu vfpv4 / *lisää sen sijaan taulumme; sillä on FPU */.thumb // Globaalit muistipaikat..global vtable.global reset_handler / * * Todellinen vektoritaulukko. * Mukana on vain RAM -muistin koko ja nollauskäsittelijä * yksinkertaisuuden vuoksi. */.type vtable, %object vtable:.word _estack.word reset_handler.size vtable,.-vtable

Hmm.. Ei ".align" -direktiiviä

Se ei kuitenkaan ole kriittistä. Siitä lisää (ehkä) myöhemmin.

.syntax yhtenäinen

.syntax [yhtenäinen | jaettu]

Tämä direktiivi asettaa käskyjoukon syntaksin ARM-ohjejoukko-osassa kuvatulla tavalla

9.4.2.1 Käskyjoukon syntaksi Kaksi hieman erilaista syntaksia tukevat ARM- ja THUMB -käskyjä. Oletusarvoisesti jaettu käyttää vanhaa tyyliä, jossa ARM- ja THUMB -ohjeilla oli oma, erillinen syntaksi. Uusi, yhtenäinen syntaksi, joka voidaan valita.syntax -direktiivin avulla.

.fpu vfpv4

GCC -kääntäjä voi tuottaa binääritiedostoja, joissa on useita liukuluvun vaihtoehtoja: pehmeä - soveltuu käytettäväksi suorittimissa ilman FPU: ta - laskelmat tehdään ohjelmistolla kääntäjän luoman softfp: avulla - soveltuu käytettäväksi suorittimilla FPU: n kanssa tai ilman - käyttää FPU: ta, jos sellainen on. Erityistapauksessamme (sinun on tehtävä oma tutkimus), tämän levyn FPU on vfpv4: n mukainen. Saatat joutua leikkimään tämän kanssa. Tai jopa jättää sen softfp: lle.

. peukalo (vs. käsivarsi)

Näissä ARM -mikrokontrollereissa on itse asiassa sekoitus käskysarjoja. Yksi on ARM, toinen on THUMB. Yksi ero on 16-bittiset ohjeet ja 32-bittiset ohjeet. Näin ollen tämä direktiivi käskee kääntäjää käsittelemään myöhemmät ohjeet joko THUMB- tai ARM -muodossa.

Otamme loput tiedostosta sellaisenaan, koska nämä ohjeet eivät ole vielä perehtyneet keskeytysvetoiseen kokoonpano-ohjelmointiin.

Vaihe 7: Hello World -ohjelman kokoonpanoversio

Seuraavat asiat voivat mennä myös aiemmin luotuun "core. S" -tiedostoon. Tämä taas on artikkelin esimerkistä.

/ * * Nollauskäsittelijä. Soitettiin nollaushetkellä. */.type reset_handler, %function reset_handler: // Aseta pino -osoitin pinon loppuun. // _stack -arvo määritetään linkkiskriptissämme. LDR r0, = _pinoa MOV sp, r0

// Aseta joitakin tyhjiä arvoja. Kun näemme nämä arvot

// debuggerissamme tiedämme, että ohjelmamme // on ladattu sirulle ja toimii. LDR r7, = 0xDEADBEEF MOVS r0, #0 main_loop: // Lisää 1 rekisteröidäksesi 'r0'. ADDS r0, r0, #1 // Silmukka takaisin. B main_loop.size reset_handler,.-Reset_handler

Yllä olevan ohjelman tarkoitus on siis ladata tunnistettava kuvio yhteen ydin MCU -rekisteriin (tässä tapauksessa R7) ja nouseva arvo, joka alkaa nollasta toiseen ydin MCU -rekisteriin (tässä tapauksessa R0). Jos käymme läpi suorituskoodin, meidän pitäisi nähdä R0: n datan lisäys.

Jos olet seurannut MSP432: n ja TI-RSLK-kurssin/-laboratorioiden ohjekirjoja, kaikkien edellä mainittujen ohjelmien pitäisi olla sinulle tuttuja.

Ainoa uusi asia, jonka näen, on "=": n käyttö ladattaessa DEADBEEF -tiedostoa R7: n rekisteröintiin. Emme olleet käyttäneet sitä.

Tähän liitetty "core. S" -tiedosto sisältää nyt koko lähteen.

Vaihe 8: Koodin kokoaminen

On aika tehdä joitain komentorivin asioita. Jotain todellista, vihdoinkin.

Emme kuitenkaan ole aivan siellä. Meidän on jälleen säädettävä artikkelissa annettua komentoa ja muokattava sitä omaan tilanteeseemme.

Tässä on esimerkkikoodi:

arm -none -eabi -gcc -x assembler -with -cpp -c -O0 -mcpu = cortex -m0 -mthumb -Wall core. S -o core.o

Jos siirrymme GCC: n gnu.org -sivustoon (tässä tapauksessa versio 7.3),

x

-X on kielen määrittäminen. Muuten, jos ei -x, kääntäjä yrittää arvata käyttämällä tiedostotunnistetta. (meidän tapauksessamme *. S).

Yllä oleva esimerkki artikkelista määrittelee assembler-with-cpp, mutta voimme tehdä vain assemblerin.

c

-C sanoo koota, mutta älä linkitä.

O0

-O on optimointitason asettaminen. Käyttämällä -O0 (oh -zero) sanotaan "lyhennä kääntämisaikaa ja anna virheenkorjaus tuottaa odotetut tulokset. Tämä on oletus".

mcpu = kuori-m0

-Mcpu määrittää kohdeprosessorin nimen. Meidän tapauksessamme se olisi cortex-m4.

peukalo

-Mthumb määrittää valinnan ARM- ja THUMB -tiloja suorittavan luovan koodin välillä.

Seinä

-Seinä on tietysti hyvin yleinen ja tunnettu. Se ottaa kaikki varoitusliput käyttöön.

Lopuksi, komennon lopussa meillä on syötetiedosto core. S ja tulostiedosto core.o.

Tässä on tuloksena oleva uusi komentorivi, joka sopii tapaukseemme.

arm -none -eabi -gcc -x assembler -c -O0 -mcpu = cortex -m4 -mthumb -seinäydin. S -o core.o

Ja se koottu.

Vaihe 9: Ohjelman linkittäminen

Suoraan artikkelissa olevasta esimerkistä meillä on tämä:

arm -none -eabi -gcc core.o -mcpu = cortex -m0 -mthumb -Wall --specs = nosys.specs -nostdlib -lgcc -T./STM32F031K6T6.ld -o main.elf

Suurin osa edellämainituista on nähty. Alla on mitä uutta.

specs = nosys.specs

Tämä on hieman hankala selittää.

Se liittyy "semihosting" ja "retargeting", ja se liittyy input / output. Se liittyy myös järjestelmäpuheluihin ja kirjastoihin.

Yleensä sulautetut järjestelmät eivät tarjoa vakiotulo-/tulostuslaitteita. Tämä vaikuttaisi järjestelmä- tai kirjastokutsuihin (esimerkki: printf ()).

Semihosting tarkoittaa, että virheenkorjaimella (katso vaiheen 11 kuva, jossa virheenkorjaimen osa on ympyröity punaisella) on erityinen kanava ja se käyttää puolihosting -protokollaa, ja näet printf (): n tuloksen isäntäkoneessa (virheenkorjaimen kautta).

Uudelleenkohdistus tarkoittaa sitä vastoin, että samat järjestelmä- tai kirjastokutsut tarkoittavat jotain muuta. He tekevät jotain muuta, mikä on järkevää sulautetulle järjestelmälle. Tietyssä mielessä, esimerkiksi printf (): lle, on olemassa uusi toteutus, uudelleen kohdennettu toteutus kyseisestä toiminnosta.

Kun kaikki tämä on sanottu, --specs = nosys.specs tarkoittaa, että emme ole puolihosting. Se tarkoittaisi yleensä, että kohdennamme uudelleen. Siitä päästään seuraavaan lippuun.

nostdlib

Linkkivaihtoehtoa -nostdlib käytetään linkittämään ohjelma, joka on tarkoitettu toimimaan itsenäisesti. -nostdlib tarkoittaa yksittäisiä vaihtoehtoja -nodefaultlibs ja -nostartfiles. Alla keskustelemme kahdesta vaihtoehdosta erikseen, mutta tyypillisin käyttötarkoitus on vain yhden luukun ostaminen. Kun linkität isännöidyn ohjelman, vakiokirjastot, kuten libc, on linkitetty oletusarvoisesti, jolloin ohjelma pääsee kaikkiin vakiotoimintoihin (printf, strlen ja ystävät). Linkkivaihtoehto -nodefaultlibs poistaa linkityksen näihin oletuskirjastoihin; Ainoat linkitetyt kirjastot ovat nimenomaan niitä, jotka nimenomaisesti nimetät linkittimelle käyttämällä -l -lippua.

lgcc

libgcc.a on vakiokirjasto, joka tarjoaa sisäisiä aliohjelmia tiettyjen koneiden puutteiden korjaamiseksi. Esimerkiksi ARM -prosessori ei sisällä jako -käskyä. Libgcc.a: n ARM -versio sisältää jakotoiminnon ja kääntäjä lähettää kutsuja kyseiselle toiminnolle tarvittaessa.

T

Tämä on vain tapa kertoa linkittäjälle käyttää tätä tiedostoa linkkiskriptinä. Meidän tapauksessamme tiedostonimi on linker.script.ld.

itse pää

Lopuksi kerromme linkittäjälle, mikä on lopullisen tulostustiedoston nimi, joka poltetaan/salataan laitteeseemme.

Tässä on versiomme täydellisestä komentorivistä, joka on muutettu erityistilanteemme mukaan:

arm -none -eabi -gcc core.o -mcpu = cortex -m4 -mthumb -Wall --specs = nosys.specs -nostdlib -lgcc -T./linker.script.ld -o main.elf

Varmistamme, että komentotiedosto ja core.o-tiedosto ovat molemmat samassa hakemistossa, jossa suoritamme yllä olevan komentorivin.

Ja se yhdistää ilman ongelmia.

A Tarkista

Sitten juoksemme:

arm-none-eabi-nm main.elf

ja saamme:

devchu@chubox: ~/Development/Atollic/TrueSTUDIO/STM32_workspace_9.1 $ arm-none-eabi-nm main.elf 20014000 A _estack 08000010 t main_loop 08000008 T reset_handler 08000000 T vtable

Näyttää hyvältä. Komento arm-none-eabi-nm on tapa luetella symbolit objektitiedostoissa.

Vaihe 10: Testaus Yhteys STM32 Nucleo-64 -laitteeseen

Liitäntä STM32 Nucleo-64 -laitteeseen
Liitäntä STM32 Nucleo-64 -laitteeseen
Liitäntä STM32 Nucleo-64 -laitteeseen
Liitäntä STM32 Nucleo-64 -laitteeseen

Ensimmäinen tehtäväsi, jos päätät hyväksyä sen, on saada järjestelmäsi näkemään kehityskorttisi.

Windowsin käyttö

Windowsille päätin asentaa TrueSTUDIO: n Atollicista (ilmainen versio). Se oli kivuton asennus ja se asensi ohjaimen automaattisesti, jotta voisin testata yhteyden st-linkillä. Kun asensin TrueSTUDIOn ja laitehallinta näki laitteen, latasin Bare Metal -artikkelin ehdottamat texan/stlink -työkalut. Laitoin kansion jälleen suoraan "C: \" -kansioon ja loin jälleen joitain linkkejä paikallisesta cygwin -kotisäiliöstä komentoihin.

ln -s /c/STM32. MCU/stlink-1.3.0-win64/bin/st-info.exe ~/bin/st-info

Aluksi testasin, pystymmekö todella kommunikoimaan laitteen kanssa, suoritin:

st-info-anturi

Ja palasi takaisin:

Löytyi 1 stlink -ohjelmoijaa

Joten nyt tiedämme, että voimme keskustella/kysyä kehityskortiltamme.

Linuxin käyttö

Linuxissa et todellakaan tarvitse ohjainta. Mutta Debianille sinun on rakennettava st -työkalut lähteestä.

git -klooni

Varmista, että libusb-1.0-0-dev on asennettu.

sopiva lista | grep -E "*libusb.*dev*"

Sinun pitäisi nähdä:

libusb-1.0-0-dev/xenial, nyt 2: 1.0.20-1 amd64 [asennettu]

Tai jotain sellaista.

Asenna se seuraavasti:

sudo apt-get install libusb-1.0-0-dev

Huomaa, että yllä oleva ei ole sama kuin:

sudo apt-get install libusb-dev

Oikea puuttuva libusb -kehittäjä voi aiheuttaa cmake -ongelmia.

CMake -virhe: Seuraavia muuttujia käytetään tässä projektissa, mutta niiden arvo on NOTFOUND. Aseta ne tai varmista, että ne on asetettu ja testattu oikein CMake -tiedostoissa: LIBUSB_INCLUDE_DIR (ADVANCED)

Vaihda projektin juurihakemistoon (… blah /blah /stlink). Tee "vapautus".

Tämän koonnin jälkeen työkalujen tulee olla kohdassa ".. /build /Release".

Voit sitten suorittaa "st-info --probe". Tässä on lähtö, jossa Nucleo on kytketty, mutta ei.

devchu@chubox: ~/Development/stlink $./build/Release/st-info --probeEtsi 1 stlink-ohjelmoijan sarja: 303636414646353034393535363537 openocd: "\ x30 / x36 / x36 / x41 / x46 / x46 / x35 / x30 / x34 / x39 / x35 / x35 / x36 / x35 / x37 "flash: 524288 (sivukoko: 2048) sram: 65536 chipid: 0x0446 descr: F303 high density device devchu@chubox: ~/Development/stlink $./build/Release/st- info --probe Löytyi 0 stlink -ohjelmoijaa devchu@chubox: ~/Development/stlink $

Vaihe 11: Käytämme GDB: tä Linuxin kanssa

Käytämme GDB: tä Linuxin kanssa
Käytämme GDB: tä Linuxin kanssa
Käytämme GDB: tä Linuxin kanssa
Käytämme GDB: tä Linuxin kanssa

Jos olet kokeillut kaikkea tätä ja olet päässyt näin pitkälle - hienoa! Erinomainen. Pidetään nyt vähän hauskaa.

Kun ostat näitä ARM-kehityskortteja, olivatpa ne Texas Instrumentsin MSP432-käynnistyslevyä tai tätä, josta keskustelemme nyt, Nucleo-F303 (STM32 Nucleo-64), ne saapuvat yleensä jo vilkkuneena käynnissä olevan ohjelman kanssa, tyypillisesti vilkkuva ohjelma, joka sisältää myös kytkimen painamisen LED -valojen vilkkumisnopeuden muuttamiseksi.

Ennen kuin olemme niin nopeita ylikirjoittamaan, katsotaanpa mitä on nähtävää ja tehtävää.

Linuxissa avaa päätelaite, vaihda juuri rakentamamme stlink git -projektin hakemisto ja etsi st-util-työkalu.

devchu@chubox: ~/Development/stlink $ find. -nimi st-util

./build/Release/src/gdbserver/st-util

Suorita työkalu. Koska olemme jo testanneet yhteytemme st-info --probe -laitteeseen, meidän pitäisi saada jonkinlainen tulos seuraavalla tavalla:

devchu@chubox: ~/Development/stlink $./build/Release/src/gdbserver/st-util

st-util 1.4.0-50-g7fafee2 2018-10-20T18: 33: 23 INFO common.c: Laitteen parametrien lataaminen…. 2018-10-20T18: 33: 23 INFO common. C: Laite on kytketty: F303-suuritiheyksinen laite, tunnus 0x10036446 2018-10-20T18: 33: 23 INFO common. C: SRAM-koko: 0x10000 tavua (64 KiB), Flash: 0x80000 tavua (512 KiB) sivuilla 2048 tavua 2018-10-20T18: 33: 23 INFO gdb-server. C: Sirun tunnus on 00000446, ydintunnus on 2ba01477. 2018-10-20T18: 33: 23 INFO gdb-server.c: Kuunteleminen *: 4242…

Se on GDB -palvelin, joka toimii nyt, ja se näkee kehityskorttimme, ja mikä tärkeintä, se kuuntelee portissa 4242 (oletusportti).

Nyt olemme valmiita käynnistämään GDB -asiakkaan.

Avaa Linuxissa toinen päätelaite ja kirjoita tämä:

arm-none-eabi-gdb -tui

Se on sama kuin gdb: n suorittaminen tiukasti komentorivillä, mutta se tuottaa sen sijaan tekstipohjaisen päätelaitteen (veikkaan, että se käyttää kirousta).

Meillä on käynnissä GDB -asiakas ja GDB -palvelin. Asiakas ei kuitenkaan ole yhteydessä palvelimeen. Tällä hetkellä se ei tiedä mitään meidän Nucleosta (tai valitsemastasi levystä). Meidän on kerrottava se. Päätelaitteessa kehotteen pitäisi nyt olla "(gdb)". Tulla sisään:

apua kohde

Se antaa sinulle luettelon. Huomaa, että haluamamme kohde on laajennettu kaukosäädin - Käytä etätietokonetta sarjalinjan kautta.

Mutta meidän on myös annettava sille sijainti. Kirjoita siis (gdb) -kehotteeseen:

(gdb) kohde laajennettu etäinen paikallinen isäntä: 4242

Sinun pitäisi saada vastaus vastaavalla tavalla:

(gdb) kohde laajennettu etäinen paikallinen isäntä: 4242

Etävianetsintä localhostin avulla: 4242 0x080028e4 in ?? ()

Samaan aikaan st-util gdbserveriä käyttävässä terminaalissa saimme tämän:

2018-10-20T18: 42: 30 INFO gdb-server. C: Löytyi 6 hw-taukorekisteriä

2018-10-20T18: 42: 30 INFO gdb-palvelin. C: GDB yhdistetty.

Vaihe 12: Toistetaan, Windowsin kanssa ja Flash -ohjelmamme

Toistetaan, Windowsin kanssa ja Flash -ohjelmamme
Toistetaan, Windowsin kanssa ja Flash -ohjelmamme
Toistetaan, Windowsin kanssa ja Flash -ohjelmamme
Toistetaan, Windowsin kanssa ja Flash -ohjelmamme
Toistetaan, Windowsin kanssa ja Flash -ohjelmamme
Toistetaan, Windowsin kanssa ja Flash -ohjelmamme

Vaiheet st-util gdbserverin ja arm-none-eabi-gdb-asiakkaan suorittamiseen ovat olennaisesti samat kuin edellisen vaiheen aikana. Avaat kaksi päätelaitetta (cygwin, DOS cmd tai Windows Powershell), löydät st-utilin sijainnin ja suoritat sen. Suorita toisessa päätelaitteessa arm-none-eabi-gdb-asiakas. Ainoa ero on, että -tui (päätepohjainen tekstinäkymä) -tilaa ei todennäköisesti tueta.

Jos yllä oleva toimi Windowsissa, sinun on todennäköisesti lopetettava (vain asiakas). Tässä vaiheessa sinun on jotenkin suoritettava GDB -asiakas, jossa rakennustiedosto on ("core.out"), tai lisättävä koko polku kyseiseen tiedostoon argumenttina GDB -asiakkaalle.

Yksinkertaistin elämääni käyttämällä cygwinia ja luomalla linkkejä paikallisesta $ HOME // bin -hakemistostani molempien työkalujen sijaintiin.

Okei, olemme koonneet ja linkittäneet kuten ennenkin, ja meillä on tiedosto main.elf valmis vilkuttamaan.

Meillä on st-util käynnissä yhdessä ikkunassa. Käynnistämme GDB-asiakkaan uudelleen tällä kertaa:

arm-none-eabi-gdb main.elf

Annamme sen käynnistyä, odotamme (gdb) -kehotusta, teemme saman yhteyskomennon GDB-palvelimelle (st-util) ja olemme valmiita suorittamaan suoritettavan tiedoston. Se on hyvin ilmastonvastaista:

(gdb) kuorma

Kun käytät Cygwin -päätelaitteita, tunnetaan ongelma, jossa konsolin komennot eivät koskaan tuota. Joten meidän tapauksessamme palvelinta käyttävä ikkuna oli täysin hiljainen. Asiakas, joka käyttää kuormaa, tuottaa tämän:

Ladataan osio.teksti, koko 0x1c lma 0x8000000Käynnistysosoite 0x8000000, latauskoko 28 Siirtonopeus: 1 kt/s, 28 tavua/kirjoitus.

Vaihe 13: Vilkkuminen Linuxilla - enemmän palkitsemista: D

Vilkkuminen Linuxilla - enemmän palkitsevaa: D
Vilkkuminen Linuxilla - enemmän palkitsevaa: D

Vaihe 14: Sukelletaan hieman syvemmälle

Jos pääset tänne, erinomainen. Siirrytään eteenpäin.

Miksi et katso main.elf -tiedoston, suoritettavan tiedoston sisälle? Suorita seuraava:

arm-none-eabi-objdump -d main.elf

Sinun pitäisi nähdä tulostus jotain tällaista:

main.elf: tiedostomuoto elf32-littlearm

Osan.teksti purkaminen:

08000000:

8000000: 00 40 01 20 09 00 00 08.@. ….

08000008:

8000008: 4802 ldr r0, [kpl, #8]; (8000014) 800000a: 4685 mov sp, r0 800000c: 4f02 ldr r7, [pc, #8]; (8000018) 800000e: 2000 movs r0, #0

08000010:

8000010: 3001 lisää r0, #1 8000012: e7fd b.n 8000010 8000014: 20014000.word 0x20014000 8000018: deadbeef.word 0xdeadbeef

Mitä pieniä paloja voimme saada yllä olevasta tuotoksesta?

Jos muistat, kun keskustelimme ja loimme linker.script.ld -tiedoston, totesimme, että näissä ARM -laitteissa on RAM -muistia alkaen 0x20000000 ja että FLASH -muisti alkaa 0x08000000.

Näin ollen voimme nähdä, että ohjelma on todellakin sellainen, että se kaikki sijaitsee FLASH -muistissa.

Sitten edellä, mutta myöhemmässä vaiheessa, kun keskustelimme "Hello World" -osiosta, oli lausunto, jossa lataamme välittömän, vakion, kirjaimellisen arvon ("0xDEADBEEF") MCU -ydinrekisteriin ("R7").

Lausunto oli:

LDR R7, = 0x DEADBEEF

Koodissamme se on ainoa paikka, jossa mainitsemme jopa DEADBEEFin. Ei missään muualla. Ja kuitenkin, jos katsot yllä olevia purettuja/rekonstruoituja ohjeita jne., DEADBEEFiin liittyy enemmän kuin luulimme.

Joten kääntäjä/linkittäjä jotenkin päätti vilkuttaa DEADBEEF -arvon pysyvästi FLASH -osoitteeseen, paikassa 0x8000018. Ja sitten kääntäjä muutti yllä olevan LDR -ohjeemme seuraavasti:

LDR R7, [PC, #8]

Se jopa tuotti meille kommentin. Kuinka mukavaa. Ja se kehottaa meitä ottamaan nykyisen ohjelmalaskurin arvon (PC -rekisteri), lisäämään arvoon 0x8, ja siellä DEADBEEF on poltettu, ja hae tämä arvo ja täytä se R7: een.

Tämä tarkoittaa myös sitä, että ohjelmalaskuri (PC) osoitti osoitetta 0x8000010, joka on main_loopin alku, ja että DEADBEEF -arvo sijaitsee kahdessa osoitteessa main_loopin päättymisen jälkeen.

Vaihe 15: Lopuksi lyhyt katsaus ohjelman suorittamiseen

Vaikka lopetat GDB: n, kirjoita komento uudelleen. Sinun ei tarvitse edes antaa sille mitään tiedostoa; emme vilku enää, vain ajamme sitä.

Kun olet yhdistänyt GDB-asiakkaan uudelleen GDB-palvelimeen, (gdb) -komentokehotteessa:

(gdb) tietorekisterit

Sinun pitäisi nähdä jotain tällaista:

r0 0x0 0

r1 0x0 0 r2 0x0 0 r3 0x0 0 r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0x0 0 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0 r12 0x0 0 sp 0x20014000 0x20014000 lr 0xffffffff 42x49000000 pc

Kirjoita sitten (gdb) -kehotteeseen:

(gdb) jatka

Ja paina nopeasti CTRL-C. Tämän pitäisi keskeyttää ohjelma. Kirjoita "tietorekisterit" -komento uudelleen.

Tällä kertaa näyttää erilaiselta:

(gdb) tietorekisterit

r0 0x350ffa 3477498 r1 0x0 0 r2 0x0 0 r3 0x0 0 r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0xdeadbeef 3735928559 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0 r12 0x0 0x0x00x00000000000000000000 16777216

Mitä tapahtui? Juuri mitä halusimme. DEADBEEF ladattiin R7: een ja R0 on (erittäin nopea) kasvava. Jos toistat, näet jälleen R0 ja toisen arvon.

Vaihe 16: Halusimme luoda vain luku -ryhmän Flashissa

Yksi tapa luoda vastaava taulukko kokoonpanon ja direktiivien avulla on seuraava:

.type myarray, %object // nimi tai tarra "myarray" määritellään objektityypiksi.

myarray: // tästä alkaa julistus "myarray" // (mistä se koostuu)..word 0x11111111 // ensimmäinen jäsen tai arvo, joka sisältyy "myarray": een..word 0x22222222 // toinen arvo (vierekkäiset osoitteet)..sana 0x33333333 // ja niin edelleen..size myarray,.-myarray // kääntäjä/kokoonpanija tietää nyt, missä 'myarray'n loppu tai // raja.

Nyt kun olemme asettaneet sen FLASH -muistiin, voimme käyttää sitä ohjelmassa. Alla on osa:

LDR R1, myarray // tämä lataa tiedot, jotka sisältyvät "myarray": n ensimmäiseen sijaintiin. ' // tätä emme halua.

LDR R1, = myarray // tämä lataa itse sijainnin arvon (1. osoite), // ei dataa.. // tätä me haluamme.

MOV R2, #0 // R2 pitää laskua varmistaakseen, ettemme kävele pois

// taulukon loppu. LDR R3, = myarrsize // R3 vastaa arvoa "myarrsize".

// R0 säilyttää tietomme

main_loop:

LDR R0, [R1] // Lataa R1: n ('myarray') osoittamat tiedot R0: een. CMP R2, R3 // Olemmeko matriisin rajalla? BEQ main_loop // Jos olemme, olemme valmiita, joten jatkamme silmukkaa ikuisesti.

LISÄÄ R2, #1 // Muussa tapauksessa voimme jatkaa iterointia taulukon kautta.

LISÄÄ R1, #4 // Lisää 4 rekisteröidäksesi R1, joten se osoittaa oikein seuraavaan

// osoite..

B main_loop // Silmukka takaisin.

Video käy tämän kaiken läpi, ja siinä on vika. Se on hyvä; se osoittaa, että se on tärkeä suoritus- ja virheenkorjauskoodi. Se näyttää klassisen tapauksen kävellä matriisin päässä.

Suositeltava: