Sadržaj:

Dio 1 ARM Montaža TI RSLK Robotika Nastavni plan i program Laboratorij 7 STM32 Nucleo: 16 koraka
Dio 1 ARM Montaža TI RSLK Robotika Nastavni plan i program Laboratorij 7 STM32 Nucleo: 16 koraka

Video: Dio 1 ARM Montaža TI RSLK Robotika Nastavni plan i program Laboratorij 7 STM32 Nucleo: 16 koraka

Video: Dio 1 ARM Montaža TI RSLK Robotika Nastavni plan i program Laboratorij 7 STM32 Nucleo: 16 koraka
Video: ZEITGEIST: MOVING FORWARD | OFFICIAL RELEASE | 2011 2024, Juli
Anonim
Image
Image

Fokus ovog instruktora je STM32 Nucleo mikrokontroler. Motivacija za to je da se iz golih kostiju može izraditi montažni projekt. To će nam pomoći da dublje proniknemo i razumijemo projekt MSP432 Launchpad (TI-RSLK) koji je već bio tema nekoliko instrukcija.

Na mreži nema velike pomoći u stvaranju projekta samo za montažu za MSP432, koristeći Code Composer Studio. Do sada smo samo kopirali/lijepili iz već postojećeg montažnog projekta. Ovaj pristup nam je dobro poslužio.

Međutim, sada smo za Lab 7 naišli na mali problem. Ili barem privremeno štucanje. Lab 7 uvodi strojeve konačnih stanja, a prvo s čime se susrećemo je potreba za stvaranjem i korištenjem niza vrijednosti. Budući da TI kurs uglavnom koristi C programiranje - to nije problem. Ali ove instrukcije su se fokusirale na montažu, a ne na C.

Nadalje, budući da niz ima vrijednosti samo za čitanje, bilo bi dobro staviti ga u flash memoriju, a ne u RAM.

Čini se da postoji mnogo više pomoći na mreži za montažne projekte koji koriste STM32 MCU, pa počinjemo s ovim Instructable -om, s ciljem da iskoristimo naučeno, a zatim se primijenimo na MSP432 i Code Composer Studio.

Na putu ka tom cilju, takođe ćemo steći iskustvo sa još jednim, popularnim mikrokontrolerom.

Korak 1: Početno testiranje uređaja

Početno testiranje uređaja
Početno testiranje uređaja
Početno testiranje uređaja
Početno testiranje uređaja
Početno testiranje uređaja
Početno testiranje uređaja

Opet, zašto odabrati STM32 Nucleo posebno?

Iskreno? Budući da sam tražio dobre članke o projektima montaže golih metala za ARM kontrolere, naišao sam na ovu seriju. A i zato što se čini da je STM32 popularan MCU.

Malo sam istraživao (postoji mnogo verzija za odabir - pogledajte sliku iznad), ali na kraju je postalo ono što zapravo mogu dobiti, jer sam namjeravao koristiti Amazon (u SAD -u).

Dolazi u jednostavnom, ali profesionalnom pakiranju s nekim uputama za pokretanje. Bilo je pomalo smiješno vidjeti da je demo snimljen u kontroler bio gotovo upravo ono što smo radili u prošlim Instructables - LED bljeska i mijenja brzinu prema pritisku tipke.

Čini se da je ova razvojna ploča vrlo slična MSP432 po tome što ima 2 LED diode i jedno korisničko dugme. MSP432 ima 2 korisnička dugmeta.

Kao što vidite na fotografijama, bio sam pomalo zatečen što ploča ima mini, a ne mikro USB. Morao sam pobjeći da kupim kabel.

Još jedan dobar test je da se, kada ga povežete sa računarom (koristim Linux kutiju), pojavi u mom upravitelju datoteka, kao datotečni sistem, nazvan "NODE_F303RE". Otvaranje koje otkriva dvije datoteke, jednu HTML i jedan tekst.

To je to, ali barem kaže da se povezivanje čini prilično lakim.

Sada smo spremni za početak.

Pokušat ću ne ponoviti nijednu dobru informaciju iz serije članaka IVONOMICON Bare Metal, nego je samo povećati.

Korak 2: Osnovne stvari

Prvo što nam treba je kompajler.

A onda nam je potreban debager:

devchu@chubox: ~ $ sudo apt-get install gdb-arm-none-eabiČitanje lista paketa … Gotovo Izgradnja stabla zavisnosti Čitanje informacija o stanju … Gotovo Sljedeći NOVI paketi će biti instalirani: gdb-arm-none-eabi 0 nadograđeno, 1 novo instalirano, 0 za uklanjanje i 8 nije nadograđeno. Potrebno je nabaviti 2, 722 kB arhive. Nakon ove operacije bit će iskorišteno 7, 738 kB dodatnog prostora na disku. Nabavite: 1 https://us.archive.ubuntu.com/ubuntu xenial/universe amd64 gdb-arm-none-eabi amd64 7.10-1ubuntu3+9 [2, 722 kB] Dohvaćeno 2, 722 kB u 1 s (1, 988 kB/s) Odabir prethodno neizabranog paketa gdb-arm-none-eabi. (Čitanje baze podataka… 262428 datoteka i direktorija trenutno instaliranih.) Priprema za raspakiranje…/gdb-arm-none-eabi_7.10-1ubuntu3+9_amd64.deb… Raspakiranje gdb-arm-none-eabi (7.10-1ubuntu3+9)… Obrada okidači za man-db (2.7.5-1)… Postavljanje gdb-arm-none-eabi (7.10-1ubuntu3+9)…

Korak 3: Osnovne stvari - Windows

Gornji korak je pretpostavio da koristimo Linux. Šta ako koristimo Windows?

Možete otići na web mjesto za razvojne programere, a na raspolaganju je nekoliko opcija za preuzimanje. Koristim Windows 8 mašinu.

Tokom instalacije, izabrao sam da ga instaliram na root "C: \" disk umjesto programskih datoteka samo zato što i ja koristim cygwin, i bilo je lakše stvoriti vezu iz moje lokalne kante za root C: fasciklu nego sve nered na putu do programskih datoteka (s razmacima itd.).

Dakle, moje cygwin okruženje i put, itd., Izgleda ovako:

C: / cygwin64 / home / bin / arm-none-eabi-gcc, gdje je arm-none-eabi-gcc veza na C: / GNUToolsArmEmbedded / 7.2018.q2.update / bin / arm-none-eabi- gcc.

Zatim sam stvorio "dev" fasciklu pod cygwin home, i tu sam postavio datoteku core. S i pokrenuo naredbu kompajlera. (vidi dalje u nastavku za stvari o kompajleru).

Uradio sam potpuno istu stvar za gdb (arm-none-eabi-gdb).

Korak 4: Šta je osnovno

Dakle, šta je "gcc-arm-none-eabi"?

Gnu kompajler (GCC) će kompajlirati programske jezike (poput C) u izvorni kod za mašinu na kojoj radi. Na primjer, ako biste sastavili neki C kod pomoću GCC -a na svom Windows računaru, on bi bio napravljen za rad na Windows stroju. Generirana izvršna datoteka (obično) neće raditi na ARM mikrokontroleru.

Dakle, kako bismo izgradili programe za preuzimanje i snimanje u ARM mikrokontroler (u našem slučaju to bi bio STM32 Nucelo), moramo GCC-u dati još nešto: mogućnost "unakrsne kompajliranja". To jest, mogućnost generiranja izvršne datoteke, ne za njen izvorni sistem (i procesor), već za ciljni sistem (ARM mikrokontroler). Tu nastupa "gcc-arm-none-eabi".

Pa šta je onda "gdb-arm-none-eabi"?

Nakon što preuzmemo i narežemo (fleširamo) novo-generiranu izvršnu datoteku u mikrokontroler, vjerojatno ćemo je htjeti otkloniti pogreške-korak po red koda. GDB je gnu ispravljač grešaka, i njemu je također potreban način da odradi svoj posao, ali cilja na drugi sistem.

Dakle, gdb-arm-none-eabi je za GDB, što je gcc-arm-none-eabi za GCC.

Druga predložena instalacija paketa bila je "libnewlib-arm-none-eabi". Šta je to?

Newlib je C biblioteka i matematička biblioteka namijenjena za upotrebu na ugrađenim sistemima. To je konglomeracija nekoliko bibliotečkih dijelova, a svi pod licencama besplatnog softvera koji ih čine lako upotrebljivim na ugrađenim proizvodima.

I na kraju, paket "libstdc ++-arm-none-eabi". Ta je prilično očigledna; to je C ++ biblioteka za unakrsni kompajler; za ugrađene ARM mikrokontrolere.

Korak 5: Datoteka povezivanja

Datoteka povezivanja
Datoteka povezivanja
Datoteka povezivanja
Datoteka povezivanja

Kreirajmo skriptu povezivanja.

Jedan ključni dio ili blok u ovoj datoteci bila bi naredba MEMORY.

--- s sourceware.org:

Standardna konfiguracija povezivača dopušta dodjelu sve dostupne memorije. Ovo možete nadjačati pomoću naredbe MEMORY. Naredba MEMORY opisuje lokaciju i veličinu blokova memorije u cilju. Pomoću njega možete opisati koja memorijska područja može koristiti povezivač, a koja memorijska područja mora izbjegavati. Zatim možete dodijeliti odjeljke određenim memorijskim regijama. Povezivač će postaviti adrese odjeljaka na temelju memorijskih regija i upozoriti na regije koje postaju previše pune. Povezivač neće miješati sekcije okolo kako bi se uklopio u dostupne regije. Skripta povezivača može sadržavati mnoge upotrebe naredbe MEMORY, međutim, svi definirani memorijski blokovi se tretiraju kao da su navedeni unutar jedne naredbe MEMORY. Sintaksa za MEMORY je:

PAMĆENJE

{name [(attr)]: ORIGIN = ishodište, LENGTH = len…}

Primjer u članku:

/* Definirajte kraj RAM -a i ograničenje memorije steka* //* (4KB SRAM na liniji STM32F031x6, 4096 = 0x1000)*//* (RAM počinje na adresi 0x20000000) _estack = 0x20001000;

PAMĆENJE

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

Zato moramo shvatiti koliko FLASH -a (za naš program i konstante, itd.) I koliko RAM -a (za upotrebu u programu; hrpa i stek, itd.) Za našu posebnu ploču. Ovo postaje pomalo zanimljivo.

Lijepa mala kartica koja dolazi s Nucleom kaže da ima flash memoriju od 512 Kbytes, a SRAM 80 Kbytes. Međutim, povezujući ga s USB -om, on se montira kao datotečni sistem s dvije datoteke, a i upravitelj datoteka i GParted pokazuju da ima više od 540+ Kbajta prostora. (RAM?).

ALI, pokušaj brisanja dviju datoteka pomoću upravitelja datoteka, prekidanje veze i ponovno povezivanje uređaja, i dalje prikazuje dvije datoteke. (i upravitelj datoteka je ipak prepoznao nešto jer na svakoj datoteci postoji mala ikona "zaključavanja".

Pa idemo sa brojkama na kartici. Dakle, sada uzimamo gornji primjer i pretvaramo ga u našu posebnu ploču.

Možda ćete htjeti upotrijebiti nešto poput ovog mrežnog pretvarača memorije za prelazak s općeg KB na određeni broj bajtova.

Tada biste mogli htjeti upotrijebiti mrežni pretvarač decimalnog u heksadecimalni broj.

/ * Odredite kraj RAM -a i ograničenje memorije steka */

/* (4KB SRAM na liniji STM32F031x6, 4096 = 0x1000)* //* primjer*/

/ * korak 1: (80KB SRAM na STM32F303RE, 81920 = 0x14000) * // * naša ploča */

/* korak 2, dodajte heksadecimalnu veličinu heksadecimalnoj početnoj adresi (ispod). */

/ * (RAM počinje na adresi 0x20000000) */

_estack = 0x20001000; / * primjer */

_estack = 0x20014000; / * naš odbor */

MEMORIJA {

Bljesak (rx): POREKLO = 0x08000000, DUŽINA = 512K

RAM (rxw): POREKLO = 0x20000000, DUŽINA = 80K

}

Nazovimo gornju datoteku "linker.script.ld".

Korak 6: Vektorska tablica

Vektorska tablica
Vektorska tablica

Sada ćemo stvoriti malu datoteku montaže (s direktivama) za izvršavanje nekih osnovnih postupaka u rukovanju prekidima. Slijedit ćemo primjer članka i kreirati datoteku pod nazivom "core. S".

Opet, ovdje je primjer datoteke datoteke, ali napravio sam promjenu za našu posebnu ploču:

// Ove upute definiraju atribute našeg čipa i

// jezik montaže koji ćemo koristiti:.syntax unified /*Pogledajte ispod ovog područja koda* //*.cpu cortex-m0* / /*komentirajte ovu liniju primjera* /.cpu cortex-m4 /* umjesto toga dodajte korteks naše ploče. pogledajte gornju sliku u ovom koraku * / /*.fpu softvfp * / / *komentirajte ovu liniju primjera * /.fpu vfpv4 / *umjesto toga dodajte našu ploču; ima FPU */.thumb // Lokacije globalne memorije..global vtable.global reset_handler / * * Stvarna vektorska tablica. * Uključene su samo veličina RAM -a i rukovatelj 'resetiranja' * radi jednostavnosti. */.type vtable, %object vtable:.word _estack.word reset_handler.size vtable,.-vtable

Hmm.. Ne '.align' Direktiva

Međutim, to nije kritično. Više o tome (možda) kasnije.

.sintaksa objedinjena

.sintaksa [objedinjena | podijeljeno]

Ova direktiva postavlja Sintaksu skupa instrukcija kako je opisano u odjeljku ARM-Skup instrukcija

9.4.2.1 Sintaksa skupa instrukcija Dvije neznatno različite sintakse podržavaju instrukcije ARM i THUMB. Zadana, podijeljena, koristi stari stil gdje su instrukcije ARM i THUMB imale vlastite, zasebne sintakse. Nova, jedinstvena sintaksa, koja se može odabrati putem.syntax direktive.

.fpu vfpv4

GCC kompajler može proizvesti binarne datoteke s nekoliko opcija u vezi s pomičnim zarezom: soft - pogodan za rad na CPU -ima bez FPU -a - proračuni se rade u softveru pomoću softvera generiranog od strane kompajlera - prikladni za rad na CPU -ima sa ili bez FPU -a - ako će biti prisutni, upotrijebit će FPU. Za naš specifični slučaj (morat ćete sami obaviti istraživanje), FPU ove ploče je u skladu s vfpv4. Možda ćete se morati igrati s ovim. Ili čak ostavite na softfp.

.thumb (vs.arm)

Ovi ARM mikrokontroler zapravo imaju mješavinu skupova instrukcija. Jedan je ARM, drugi THUMB. Jedna razlika su 16-bitne instrukcije u odnosu na 32-bitne. Stoga ova direktiva govori kompajleru da slijedeće instrukcije tretira kao THUMB ili ARM.

Uzećemo ostatak datoteke onakvom kakva jeste jer se ove Instructables još nisu udubile u programiranje montaže vođeno prekidima.

Korak 7: Montažna verzija programa 'Hello World'

Sledeće takođe može ići u prethodno kreiranu datoteku "core. S". Ovo je opet iz primjera u članku.

/ * * Rukovatelj Reset. Pozvan pri resetovanju. */.type reset_handler, %function reset_handler: // Postavite pokazivač steka na kraj steka. // Vrijednost '_estack' definirana je u našoj skripti povezivanja. LDR r0, = _stack MOV sp, r0

// Postavljanje nekih lažnih vrijednosti. Kad vidimo te vrijednosti

// u našem debageru ćemo znati da je naš program // učitan na čip i da radi. LDR r7, = 0xDEADBEEF MOVS r0, #0 main_loop: // Dodajte 1 za registraciju 'r0'. ADDS r0, r0, #1 // Petlja unatrag. B main_loop.size reset_handler,.-Reset_handler

Dakle, cilj gornjeg programa je učitavanje prepoznatljivog uzorka u jedan jezgreni MCU registar (u ovom slučaju R7), a povećavajuća vrijednost koja počinje od nule u drugi matični MCU registar (u ovom slučaju R0). Ako prođemo kroz izvršni kod, trebali bismo vidjeti povećanje podataka R0.

Ako ste zajedno sa Instructables slijedili MSP432 i TI-RSLK tečaj/laboratorije, onda bi vam svi gore navedeni programi trebali biti poznati.

Jedna nova stvar koju mogu vidjeti je upotreba "=" pri učitavanju "DEADBEEF -a" za registraciju R7. To nismo koristili.

Ovdje priložena datoteka "core. S" sadrži potpuni izvor.

Korak 8: Sastavljanje Kodeksa

Vrijeme je da obavite neke stvari iz komandne linije. Konačno nešto stvarno.

Međutim, nismo baš tu. Opet moramo prilagoditi naredbu datu u članku i prilagoditi je vlastitoj situaciji.

Evo primjera koda:

arm -none -eabi -gcc -x asembler -sa -cpp -c -O0 -mcpu = cortex -m0 -mthumb -Zidno jezgro. S -o jezgro.o

Ako posjetimo gnu.org web lokaciju za GCC, (u ovom slučaju verzija 7.3),

x

-X označava jezik. U suprotnom, ako nema -x, kompajler će pokušati pogoditi pomoću ekstenzije datoteke. (u našem slučaju, *. S).

Gornji primjer iz članka navodi asembler-sa-cpp, ali mogli bismo samo napraviti asembler.

c

-C kaže "kompajliraj, ali ne povezuj".

O0

-O treba postaviti nivo optimizacije. Korištenje -O0 (oh -nula) kaže "smanjite vrijeme kompajliranja i učinite da otklanjanje grešaka proizvede očekivane rezultate. Ovo je zadano".

mcpu = cortex-m0

-Mcpu navodi ime ciljnog procesora. U našem slučaju to bi bio cortex-m4.

mthumb

-Mthumb specificira odabir između generiranja koda koji izvršava ARM i THUMB stanja.

Zid

Zid je naravno vrlo uobičajen i dobro poznat. Uključuje sve zastavice upozorenja.

Konačno, na kraju naredbe imamo ulaznu datoteku core. S i izlaznu datoteku core.o.

Evo rezultirajuće nove naredbene linije koja odgovara našem specifičnom slučaju.

arm -none -eabi -gcc -x asembler -c -O0 -mcpu = cortex -m4 -mthumb -Zidno jezgro. S -o jezgro.o

I to je sastavljeno.

Korak 9: Povezivanje programa

Izravno iz primjera u članku imamo ovo:

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

Većinu gore navedenih ste vidjeli. U nastavku se nalazi šta je novo.

specs = nosys.specs

Ovo je malo nezgodno za objasniti.

To ima veze sa "semihostingom" i "retargetingom", a ima i sa ulazom / izlazom. To takođe ima veze sa sistemskim pozivima i bibliotekama.

Uobičajeno, ugrađeni sistemi ne pružaju standardne ulazno/izlazne uređaje. To bi utjecalo na sistemske ili bibliotečke pozive (primjer: printf ()).

Poluhostiranje znači da program za otklanjanje grešaka (vidi sliku 11. koraka s dijelom otklanjanja pogrešaka zaokruženim crvenom bojom) ima poseban kanal i koristi protokol poluhostovanja, a izlaz printf () možete vidjeti na računaru domaćinu (putem programa za otklanjanje grešaka).

Ponovno ciljanje, s druge strane, znači da ti isti pozivi sistema ili biblioteke znače nešto drugo. Oni rade nešto drugo, što ima smisla za ugrađeni sistem. U određenom smislu, recimo za printf (), postoji nova implementacija, ponovno ciljana implementacija te funkcije.

Rekavši sve to, --specs = nosys.specs znači da nećemo biti poluhostovi. To bi obično značilo da ponovno ciljamo. To nas dovodi do sljedeće zastave.

nostdlib

Opcija povezivanja -nostdlib koristi se za povezivanje programa koji se namjerava pokrenuti samostalno. -nostdlib implicira pojedinačne opcije -nodefaultlibs i -nostartfiles. U nastavku raspravljamo o dvije opcije odvojeno, ali najčešća upotreba je samo nostdlib za kupovinu na jednom mjestu. Prilikom povezivanja hostiranog programa standardne sistemske biblioteke, poput libc, zadano su povezane, dajući programu pristup svim standardnim funkcijama (printf, strlen i prijatelji). Opcija povezivanja -nodefaultlibs onemogućuje povezivanje s tim zadanim bibliotekama; jedine povezane biblioteke su upravo one koje izričito imenujete povezivaču pomoću oznake -l.

lgcc

libgcc.a je standardna biblioteka koja pruža interne potprograme za prevladavanje nedostataka određenih strojeva. Na primjer, ARM procesor ne uključuje upute za podjelu. ARM verzija libgcc.a uključuje funkciju podjele i kompajler emituje pozive toj funkciji gdje je to potrebno.

T

Ovo je samo način da povežite povezivaču da koristi ovu datoteku kao skriptu povezivanja. U našem slučaju, naziv datoteke je linker.script.ld.

o main.elf

Na kraju, povezivaču kažemo kako će se zvati konačna izlazna slikovna datoteka koja će biti narezana/umetnuta u naš uređaj.

Evo naše verzije kompletne naredbene linije, izmijenjene za našu specifičnu situaciju:

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

Vodimo računa da se datoteka skripte i datoteka core.o nalaze u istom direktoriju, gdje ćemo pokrenuti gornju naredbenu liniju.

I povezuje se bez problema.

A ček

Zatim pokrećemo:

arm-none-eabi-nm main.elf

i dobijamo:

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

Izgleda dobro. Naredba arm-none-eabi-nm je način za ispisivanje simbola u datotekama objekata.

Korak 10: Testiranje veze na STM32 Nucleo-64

TestingConnection to STM32 Nucleo-64
TestingConnection to STM32 Nucleo-64
TestiranjePovezivanje na STM32 Nucleo-64
TestiranjePovezivanje na STM32 Nucleo-64

Vaša prva misija, ako je odlučite prihvatiti, je da vaš sistem vidi vašu razvojnu ploču.

Korišćenje operativnog sistema Windows

Za Windows sam odlučio instalirati TrueSTUDIO iz Atollic -a (besplatna verzija). To je bila bezbolna instalacija i automatski je instalirao upravljački program tako da sam mogao koristiti st-link za testiranje veze. Nakon što sam instalirao TrueSTUDIO i upravitelj uređaja vidio uređaj, preuzeo sam texan/stlink alate predložene u članku Bare Metal koji smo pratili. Ponovo sam stavio fasciklu direktno pod "C: \", i ponovo stvorio neke veze iz moje lokalne cygwin kućne kante za komande.

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

Kao početni test da vidim da li zaista možemo komunicirati s uređajem, pokrenuo sam:

st-info --probe

I vratio se:

Pronađeno 1 stlink programera

Dakle, sada znamo da možemo razgovarati/pitati našu razvojnu ploču.

Korištenje Linuxa

Za Linux, zapravo vam ne treba upravljački program. Ali za Debian ćete morati izgraditi st alate iz izvora.

git clone

Provjerite imate li instaliran libusb-1.0-0-dev.

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

Trebali biste vidjeti:

libusb-1.0-0-dev/xenial, sada 2: 1.0.20-1 amd64 [instalirano]

ili nesto slicno tome.

Da biste ga instalirali:

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

Imajte na umu da gore navedeno nije isto što i:

sudo apt-get install libusb-dev

Tačan nedostajući libusb dev može uzrokovati probleme u cmake -u.

CMake greška: Sljedeće varijable se koriste u ovom projektu, ali su postavljene na NOTFOUND. Molimo vas da ih postavite ili provjerite jesu li pravilno postavljene i testirane u CMake datotekama: LIBUSB_INCLUDE_DIR (NAPREDNO)

Promijenite u osnovni direktorij projekta (… blah /blah /stlink). Napravite "make release".

Nakon tog sastavljanja, alati bi trebali biti pod ".. /build /Release".

Zatim možete pokrenuti "st-info --probe". Evo izlaza s povezanim Nucleom, a zatim ne.

devchu@chubox: ~/Development/stlink $./build/Release/st-info --probeFound 1 stlink programeri serijski: 303636414646353034393535363537 openocd: "\ x30 / x36 / x36 / x41 / x46 / x46 / x35 / x30 / x34 / x39 / x35 / x35 / x36 / x35 / x37 "flash: 524288 (veličina stranice: 2048) sram: 65536 čipid: 0x0446 descr: F303 uređaj velike gustoće devchu@chubox: ~/Development/stlink $./build/Release/st- info --probe Pronađeno 0 stlink programera devchu@chubox: ~/Development/stlink $

Korak 11: Koristimo GDB sa Linuxom

Koristimo GDB sa Linuxom
Koristimo GDB sa Linuxom
Koristimo GDB sa Linuxom
Koristimo GDB sa Linuxom

Ako ste sve ovo pokušavali, a uspjeli ste dovde - odlično! Odlično. Hajdemo se sad malo zabaviti.

Kada kupujete ove ARM razvojne ploče, bilo da se radi o lansirnoj podlozi MSP432 iz kompanije Texas Instruments, ili o ovoj o kojoj sada govorimo, Nucleo-F303 (STM32 Nucleo-64), obično stižu već ispunjene programom, obično neki trepćući program koji uključuje i pritiskanje prekidača za promjenu brzine treptanja LED -a.

Prije nego što budemo toliko brzo to napisali, da vidimo šta ima za vidjeti i raditi.

U Linuxu otvorite terminal, promijenite direktorij stlink git projekta koji smo upravo izgradili i pronađite alat st-util.

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

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

Pokrenite taj alat. Budući da smo već ranije testirali našu vezu sa st-info --probe, trebali bismo dobiti neki izlaz ovako:

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: Učitavanje parametara uređaja…. 2018-10-20T18: 33: 23 INFO common.c: Uređaj je povezan: F303 uređaj velike gustoće, id 0x10036446 2018-10-20T18: 33: 23 INFO common.c: SRAM veličina: 0x10000 bajtova (64 KiB), Flash: 0x80000 bajtova (512 KiB) na stranicama od 2048 bajtova 2018-10-20T18: 33: 23 INFO gdb-server.c: ID čipa je 00000446, Core ID je 2ba01477. 2018-10-20T18: 33: 23 INFO gdb-server.c: Slušanje na *: 4242…

To je GDB server koji je sada pokrenut i vidi našu razvojnu ploču, a što je još važnije, sluša na portu 4242 (zadani port).

Sada smo spremni za pokretanje GDB klijenta.

U Linuxu otvorite drugi terminal, unesite ovo:

arm-none-eabi-gdb -tui

To je isto što i pokretanje gdb strogo naredbene linije, međutim umjesto toga proizvodi terminal zasnovan na tekstu (pretpostavljam da koristi psovke).

Imamo pokrenut GDB klijent i GDB server. Međutim, klijent nije povezan s poslužiteljem. Trenutno ne zna ništa o našem Nucleu (ili ploči po vašem izboru). Moramo to reći. U terminalu bi vaš upit sada trebao biti "(gdb)". Unesite:

help target

Daće vam spisak. Primijetite da je ono što želimo ciljno prošireno -daljinsko - Koristite udaljeno računalo putem serijske linije.

Ali moramo mu dati i lokaciju. Dakle, na upit (gdb) unesite:

(gdb) cilj prošireni-udaljeni lokalni host: 4242

Trebali biste dobiti odgovor otprilike ovako:

(gdb) cilj prošireni-udaljeni lokalni host: 4242

Daljinsko otklanjanje grešaka koristeći localhost: 4242 0x080028e4 u ?? ()

U međuvremenu, na terminalu koji pokreće st-util gdbserver dobili smo ovo:

2018-10-20T18: 42: 30 INFO gdb-server.c: Pronađeno 6 registara tačaka prekida

2018-10-20T18: 42: 30 INFO gdb-server.c: GDB povezan.

Korak 12: Ponovimo, uz Windows i Flash naš program

Ponovimo, uz Windows i Flash naš program
Ponovimo, uz Windows i Flash naš program
Ponovimo, uz Windows i Flash naš program
Ponovimo, uz Windows i Flash naš program
Ponovimo, uz Windows i Flash naš program
Ponovimo, uz Windows i Flash naš program

Koraci za pokretanje st-util gdbservera i klijenta arm-none-eabi-gdb su u osnovi isti kao što smo radili tokom prethodnog koraka. Otvorite dva terminala (cygwin, DOS cmd ili Windows Powershell), pronađete lokaciju st-utila, pokrenete ga. Na drugom terminalu pokrenite klijent arm-none-eabi-gdb. Jedina razlika je u tome što način -tui (prikaz teksta zasnovan na terminalu) najvjerojatnije nije podržan.

Ako je gore navedeno radilo u sustavu Windows, vjerojatno ćete morati prestati (samo klijent). U ovom trenutku ćete nekako morati pokrenuti GDB klijent gdje se nalazi vaša datoteka za izgradnju ("core.out") ili dodati cijelu putanju do te datoteke kao argument GDB klijentu.

Pojednostavio sam svoj život pomoću cygwina i stvaranjem veza iz mog lokalnog direktorija $ HOME // bin do mjesta gdje se nalaze oba alata.

U redu, sastavili smo i povezali kao i prije, a imamo datoteku main.elf spremnu za fleširanje.

Imamo st-util koji radi u jednom prozoru. Ponovno pokrećemo GDB klijenta, ovaj put radimo:

arm-none-eabi-gdb main.elf

Puštamo ga da se pokrene, čekamo (gdb) upit, izvršavamo istu naredbu povezivanja s GDB poslužiteljem (st-util) i spremni smo za fleširanje izvršne datoteke. Vrlo je klimatski:

(gdb) opterećenje

Radeći sa cygwin terminalima, poznat je problem s tim da se neke naredbe konzole ponekad ne emituju. Dakle, u našem slučaju, prozor na kojem je poslužitelj bio je potpuno tih. Ona koja pokreće klijenta, gdje smo pokrenuli učitavanje, prikazuje ovo:

Učitavanje odjeljka.tekst, veličina 0x1c lma 0x8000000Start adresa 0x8000000, veličina učitavanja 28 Brzina prijenosa: 1 KB/s, 28 bajtova/upis.

Korak 13: Bljeskanje s Linuxom - više nagrađivanja: D

Flashing With Linux - više nagrađivanja: D
Flashing With Linux - više nagrađivanja: D

Korak 14: Zaronimo malo dublje

Ako ste stigli ovdje, odlično. Idemo dalje.

Zašto ne pogledate unutar datoteke main.elf, izvršne datoteke? Pokrenite sljedeće:

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

Trebali biste vidjeti izlaz ovako:

main.elf: format datoteke elf32-littlearm

Rastavljanje.text odjeljka:

08000000:

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

08000008:

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

08000010:

8000010: 3001 dodaje r0, #1 8000012: e7fd b.n 8000010 8000014: 20014000. Riječ 0x20014000 8000018: mrtva govedina. Riječ 0xdeadbeef

Koje male grudice možemo dobiti iz gornjeg izlaza?

Ako se sjećate kada smo raspravljali i stvarali datoteku linker.script.ld, izjavili smo da ovi ARM uređaji imaju RAM počevši od 0x20000000, a da FLASH memorija počinje od 0x08000000.

Dakle, možemo vidjeti da je program zaista takav da se sve nalazi u FLASH memoriji.

Zatim, gore, ali kasnije, kada smo raspravljali o dijelu "Hello World", došlo je do izjave u kojoj učitavamo trenutnu, konstantnu, doslovnu vrijednost ("0xDEADBEEF") u registar jezgre MCU -a ("R7").

Izjava je glasila:

LDR R7, = 0xDEADBEEF

U našem kodu to je jedino mjesto gdje uopće spominjemo DEADBEEF. Ne gde drugde. Pa ipak, ako pogledate gornje rastavljene/rekonstruirane upute, itd., Postoji više stvari vezanih za DEADBEEF nego što smo mislili da jesmo.

Dakle, kompajler/povezivač je nekako odlučio trajno prebaciti vrijednost DEADBEEF -a u FLASH adresu, na lokaciji 0x8000018. A onda je kompajler promijenio našu gornju LDR instrukciju u:

LDR R7, [PC, #8]

Čak nam je izazvao komentar. Kako lijepo. I govori nam da uzmemo trenutnu programsku vrijednost brojača (PC registar), dodamo 0x8 toj vrijednosti, i tu je narezan DEADBEEF, i dobijemo tu vrijednost i stavimo je u R7.

To znači i da je programski brojač (PC) pokazivao na adresu 0x8000010, koja je početak main_loop, i da vrijednost DEADBEEF stoji na dvije adrese nakon kraja main_loop.

Korak 15: Na kraju, kratak pogled na program koji se izvodi

Čak i ako napustite GDB, samo ponovo unesite naredbu. Ne morate mu čak ni dati nikakav fajl; više ne bljeskamo, samo ga pokrećemo.

Nakon što ste ponovo povezali GDB klijenta sa GDB serverom, u komandnoj liniji (gdb):

(gdb) registri podataka

Trebali biste vidjeti ovako nešto:

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 42949800800c0080000000

Ali zatim, na (gdb) upit, unesite:

(gdb) nastavi

I vrlo brzo pritisnuo CTRL-C. To bi trebalo pauzirati program. Ponovo unesite naredbu "info registri".

Ovaj put izgleda drugačije:

(gdb) registri podataka

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 0x00x00x0000 16777216

Šta se desilo? Upravo ono što smo htjeli. DEADBEEF je učitan u R7, a R0 se (izuzetno brzo) povećavao. Ako ponovite, ponovo ćete vidjeti R0 s drugom vrijednošću.

Korak 16: Željeli smo stvoriti niz samo za čitanje u Flash-u

Jedan od načina za stvaranje ekvivalenta niza pomoću sklopa i direktiva je sljedeći:

.type myarray, %object // ime ili oznaka 'myarray' definirano je kao tip objekta.

myarray: // ovo je početak deklaracije 'myarray' // (od čega će se sastojati)..word 0x11111111 // prvi član ili vrijednost sadržana u 'myarray'..word 0x22222222 // druga vrijednost (susjedne adrese)..word 0x33333333 // i tako dalje..size myarray,.-myarray // kompajler/asembler sada zna gdje je kraj ili // granica 'myarray'.

Sada kada smo ga postavili u FLASH memoriju, možemo ga koristiti u programu. Ispod je dio:

LDR R1, myarray // učitava podatke sadržane na prvoj lokaciji 'myarray'. ' // ovo nije ono što želimo.

LDR R1, = myarray // ovo učitava samu vrijednost lokacije (prva adresa), // ne podaci.. // ovo je ono što želimo.

MOV R2, #0 // R2 će voditi računa da ne odemo

// kraj niza. LDR R3, = myarrsize // R3 će biti ekvivalent 'myarrsize'.

// R0 čuva naše podatke

main_loop:

LDR R0, [R1] // Učitati podatke na koje ukazuje R1 ('myarray') u R0. CMP R2, R3 // Jesmo li na granici niza? BEQ main_loop // Ako jesmo, gotovi smo, pa ćemo zauvijek samo petljati.

ADD R2, #1 // Inače, možemo nastaviti ponavljati niz.

ADD R1, #4 // Dodajte 4 za registraciju R1, tako da ispravno ukazuje na sljedeće

// adresa..

B main_loop // Petlja natrag.

Videozapis prolazi kroz sve ovo i u njemu postoji greška. Dobro je; pokazuje da je važan kôd za pokretanje i otklanjanje grešaka. Prikazuje klasičan slučaj odlaska s kraja niza.

Preporučuje se: