Sadržaj:
- Korak 1: Početno testiranje uređaja
- Korak 2: Osnove
- Korak 3: Osnove - Windows
- Korak 4: Što je bitno
- Korak 5: Datoteka povezivanja
- Korak 6: Vektorska tablica
- Korak 7: Montažna verzija programa 'Hello World'
- Korak 8: Sastavljanje Kodeksa
- Korak 9: Povezivanje programa
- Korak 10: Testiranje veze na STM32 Nucleo-64
- Korak 11: Koristimo GDB s Linuxom
- Korak 12: Ponovimo, uz Windows i Flash naš program
- Korak 13: Bljeskanje s Linuxom - više nagrađivanja: D
- Korak 14: Zaronimo malo dublje
- Korak 15: Konačno, kratki pogled na program koji se izvodi
- Korak 16: Željeli smo u Flash-u stvoriti niz samo za čitanje
Video: 1. dio ARM Montaža TI RSLK Robotika Kurikulum za učenje Laboratorij 7 STM32 Nucleo: 16 koraka
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:34
Fokus ovog Instructable-a je mikrokontroler STM32 Nucleo. Motivacija za to da se može izraditi montažni projekt od golih kostiju. To će nam pomoći da dublje proniknemo i razumijemo projekt MSP432 Launchpad (TI-RSLK) koji je već bio tema nekoliko Instructables.
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 kolegij uglavnom koristi C programiranje - to nije problem. Ali ti Instructables su se usredotočili 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 na Internetu ima puno više pomoć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 do tog cilja također ćemo steći iskustvo s još jednim, popularnim mikrokontrolerom.
Korak 1: Početno testiranje uređaja
Opet, zašto posebno odabrati STM32 Nucleo?
Iskreno? Budući da sam tražio dobre članke o montažnim projektima od 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 gornju sliku), 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 točno 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 gumba.
Kao što možete vidjeti na fotografijama, bio sam pomalo zatečen što ploča ima mini, a ne mikro USB. Morao sam pobjeći kupiti kabel.
Još jedan dobar test je da se, kad ga povežete s računalom (koristim Linux okvir), pojavi u mojem upravitelju datoteka, kao datotečni sustav, 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 povećati.
Korak 2: Osnove
Prvo što nam treba je prevoditelj.
Zatim nam je potreban alat za ispravljanje pogrešaka:
devchu@chubox: ~ $ sudo apt-get install gdb-arm-none-eabiČitanje popisa paketa … Gotovo Izgradnja stabla ovisnosti Čitanje informacija o stanju … Gotovo Instalirat će se sljedeći NOVI paketi: gdb-arm-none-eabi 0 nadograđeno, 1 novo instalirano, 0 za uklanjanje i 8 nije nadograđeno. Trebate nabaviti 2, 722 kB arhive. Nakon ove operacije koristit će se 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: Osnove - Windows
Gornji korak je pretpostavio da koristimo Linux. Što ako koristimo Windows?
Možete otići na web mjesto za razvojne programere, a dostupno je nekoliko mogućnosti preuzimanja. Koristim stroj sa sustavom Windows 8.
Tijekom instalacije odlučio sam instalirati ga na korijenski pogon "C: \" umjesto programskih datoteka samo zato što i ja koristim cygwin i bilo je lakše stvoriti vezu iz moje lokalne kante u korijensku mapu C: 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" mapu pod cygwin home, i tu sam stavio datoteku core. S i pokrenuo naredbu kompajlera. (vidi dalje u nastavku za prevoditelje).
Uradio sam potpuno istu stvar za gdb (arm-none-eabi-gdb).
Korak 4: Što je bitno
Dakle, što je "gcc-arm-none-eabi"?
Prevodilac gnu (GCC) će kompajlirati programske jezike (poput C) u izvorni kod za stroj na kojem radi. Na primjer, ako biste sastavili neki C kod pomoću GCC -a na svom Windows stroju, on bi bio izgrađen 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 kompilacije". To jest, mogućnost generiranja izvršne datoteke, ne za njezin izvorni sustav (i procesor), već za ciljni sustav (ARM mikrokontroler). Tu dolazi do izražaja "gcc-arm-none-eabi".
Što je onda "gdb-arm-none-eabi"?
Nakon što preuzmemo i narežemo (bljeskamo) novo generiranu izvršnu datoteku u mikrokontroler, vjerojatno ćemo je htjeti otkloniti pogreške-korak po redak koda. GDB je gnu ispravljač pogrešaka, a i njemu je potreban način da odradi svoj posao, ali cilja na drugi sustav.
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". Što je to?
Newlib je C knjižnica i matematička knjižnica namijenjena za upotrebu na ugrađenim sustavima. To je konglomerat nekoliko knjižničnih dijelova, a sve pod licencama besplatnog softvera što ih čini lako upotrebljivima na ugrađenim proizvodima.
I na kraju, paket "libstdc ++-arm-none-eabi". Ta je prilično očita; to je C ++ knjižnica za unakrsni prevoditelj; za ugrađene ARM mikrokontrolere.
Korak 5: Datoteka povezivanja
Kreirajmo skriptu povezivanja.
Jedan ključni dio ili blok u ovoj datoteci bila bi naredba MEMORY.
--- s sourceware.org:
Zadana konfiguracija povezivača dopušta dodjelu sve dostupne memorije. To možete nadjačati pomoću naredbe MEMORY. Naredba MEMORY opisuje mjesto 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 dijelove okolo kako bi se uklopio u dostupna područja. Skripta povezivača može sadržavati mnoge upotrebe naredbe MEMORY, međutim, svi definirani memorijski blokovi tretiraju se kao da su navedeni unutar jedne naredbe MEMORY. Sintaksa za MEMORY je:
MEMORIJA
{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;
MEMORIJA
{FLASH (rx): ORIGIN = 0x08000000, LENGTH = 32K RAM (rxw): ORIGIN = 0x20000000, LENGTH = 4K}
Stoga moramo shvatiti koliko FLASH -a (za naš program i konstante, itd.) I koliko RAM -a (za korištenje u programu; hrpa i hrpa itd.) Za našu 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, postavlja se kao datotečni sustav s dvije datoteke, a i upravitelj datoteka i GParted pokazuju da ima više od 540+ Kbajta prostora. (RADNA MEMORIJA?).
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 s 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.
/ * Definirajte 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ša ploča */
SJEĆANJE {
Bljeskalica (rx): PORIJEKLO = 0x08000000, DUŽINA = 512K
RAM (rxw): POREKLO = 0x20000000, DUŽINA = 80K
}
Nazovimo gornju datoteku "linker.script.ld".
Korak 6: Vektorska tablica
Sada ćemo stvoriti malu datoteku montaže (s direktivama) za obavljanje nekih vrlo osnovnih postupaka s prekidima. Slijedit ćemo primjer članka i stvoriti datoteku pod nazivom "core. S".
Opet, evo primjera sadržaja datoteke, ali sam napravio 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 ovaj redak primjera* /.cpu cortex-m4 /* umjesto toga dodajte korteks naše ploče. pogledajte gornju sliku u ovom koraku * / /*.fpu softvfp * / / *komentirajte ovaj redak 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 'reset' rukovatelj *, 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 uputa kako je opisano u odjeljku ARM-Nabor uputa
9.4.2.1 Sintaksa skupa uputa 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 prevoditelj može proizvesti binarne datoteke s nekoliko opcija u vezi s pomičnim zarezom: mekani - prikladni za rad na CPU -ima bez FPU -a - izrač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 u skladu je s vfpv4. Možda ćete se morati igrati s ovim. Ili čak ostavite na softfp.
.palac (naspram
Ovi ARM mikrokontroler zapravo imaju mješavinu skupova uputa. Jedan je ARM, drugi THUMB. Jedna razlika su 16-bitne upute u odnosu na 32-bitne. Stoga ova direktiva govori prevoditelju da slijedeće upute tretira kao THUMB ili ARM.
Ostatak datoteke ćemo uzeti onakvim kakav jest budući da se ti Instructables još nisu udubili u programiranje montaže vođeno prekidima.
Korak 7: Montažna verzija programa 'Hello World'
Sljedeće također može ući u prethodno stvorenu datoteku "core. S". Ovo je opet iz primjera u članku.
/ * * Rukovatelj Reset. Pozvano pri resetiranju. */.type reset_handler, %function reset_handler: // Postavite pokazivač steka na kraj stoga. // 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 programu za otklanjanje pogrešaka znat ćemo da je naš program // učitan na čip i da radi. LDR r7, = 0xDEADBEEF MOVS r0, #0 main_loop: // Dodajte 1 za registraciju 'r0'. DODAJA r0, r0, #1 // Petlja natrag. B main_loop.dimenzija 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 MCU registar jezgre (u ovom slučaju R0). Ako prođemo kroz izvršni kôd, trebali bismo vidjeti povećanje podataka R0.
Ako ste zajedno s Instruktables slijedili MSP432 i tečaj/laboratorije TI-RSLK, tada bi vam gotovo svi gore navedeni programi trebali biti poznati.
Jedna nova stvar koju mogu vidjeti je korištenje "=" prilikom učitavanja "DEADBEEF" u za registraciju R7. To nismo koristili.
Ovdje priložena datoteka "core. S" sadrži potpuni izvor.
Korak 8: Sastavljanje Kodeksa
Vrijeme je za neke stvari iz naredbenog retka. Napokon nešto stvarno.
Međutim, nismo baš tu. Ponovno 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 -Zidna jezgra. S -o jezgra.o
Ako posjetimo gnu.org web mjesto za GCC, (u ovom slučaju verzija 7.3),
x
-X služi za određivanje jezika. Inače, ako nema -x, prevoditelj će pokušati pogoditi pomoću nastavka datoteke. (u našem slučaju, *. S).
Gornji primjer iz članka navodi asembler-s-cpp, ali mogli bismo samo napraviti asembler.
c
-C kaže "kompajliraj, ali ne povezuj".
O0
-O treba postaviti razinu optimizacije. Korištenje -O0 (oh -nula) kaže "smanjite vrijeme kompajliranja i učinite da pogreške daju očekivane rezultate. To je zadana vrijednost".
mcpu = kora-m0
-Mcpu navodi naziv ciljnog procesora. U našem slučaju to bi bio cortex-m4.
palac
-Mthumb specificira odabir između generiranja koda koji izvršava ARM i THUMB stanja.
Zid
Zid je, naravno, vrlo uobičajen i 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 -Zidna jezgra. S -o jezgra.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. Ispod je ono što je novo.
specs = nosys.specs
Ovo je malo nezgodno za objasniti.
To ima veze s "semihostingom" i "retargetingom", a ima i s ulazom / izlazom. To također ima veze sa sistemskim pozivima i knjižnicama.
Uobičajeno, ugrađeni sustavi ne pružaju standardne ulazno/izlazne uređaje. To bi utjecalo na pozive sustava ili knjižnice (primjer: printf ()).
Poluhostiranje znači da program za ispravljanje pogreš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čunalu domaćinu (putem programa za otklanjanje pogrešaka).
Ponovno ciljanje, s druge strane, znači da ti isti pozivi sustava ili knjižnice znače nešto drugo. Oni rade nešto drugo, što ima smisla za ugrađeni sustav. 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 polugostovi. 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 podrazumijeva 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 knjižnice sustava, 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 knjižnicama; jedine povezane knjižnice su upravo one koje izričito imenujete povezivaču pomoću oznake -l.
lgcc
libgcc.a standardna je knjižnica koja pruža unutarnje potprograme za prevladavanje nedostataka pojedinih strojeva. Na primjer, ARM procesor ne uključuje upute za podjelu. ARM verzija libgcc.a uključuje funkciju podjele i prevoditelj emitira pozive toj funkciji gdje je to potrebno.
T
Ovo je samo način da povezivaču povežete da koristi ovu datoteku kao skriptu povezivanja. U našem slučaju, naziv datoteke je linker.script.ld.
o glavno.elf
Na kraju, povezivaču kažemo kako će se zvati konačna izlazna slikovna datoteka koja će se snimiti/umetnuti 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
Provjeravamo jesu li skriptna datoteka i core.o datoteka u istom direktoriju, gdje ćemo pokrenuti gornji naredbeni redak.
I povezuje se bez problema.
A Ček
Zatim pokrećemo:
arm-none-eabi-nm main.elf
i dobivamo:
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 način je za popis simbola unutar objektnih datoteka.
Korak 10: Testiranje veze na STM32 Nucleo-64
Vaša prva misija, ako je odlučite prihvatiti, jest da vaš sustav vidi vašu razvojnu ploču.
Korištenje sustava 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. Ponovno sam stavio mapu izravno pod "C: \" i opet stvorio neke veze iz moje lokalne cygwin kućne kante za naredbe.
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-sonda
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.
prikladan popis | grep -E "*libusb.*dev*"
Trebali biste vidjeti:
libusb-1.0-0-dev/xenial, sada 2: 1.0.20-1 amd64 [instalirano]
ili tako nešto.
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
Točan nedostajući libusb dev može uzrokovati probleme s cmakeom.
CMake pogreška: Sljedeće varijable se koriste u ovom projektu, ali su postavljene na NOTFOUND. Molimo vas da ih postavite ili provjerite jesu li ispravno postavljene i testirane u datotekama CMake: LIBUSB_INCLUDE_DIR (NAPREDNO)
Promijenite u korijenski direktorij projekta (… blah /blah /stlink). Napravite "make release".
Nakon te nadogradnje alati bi trebali biti pod ".. /build /Release".
Zatim možete pokrenuti "st-info --probe". Evo izlaza s spojenim 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 "blic: 524288 (veličina stranice: 2048) sram: 65536 chipid: 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 s Linuxom
Ako ste sve ovo pokušavali, a došli ste dovde - super! Izvrsno. Hajdemo se sad malo zabaviti.
Kad kupite ove razvojne ploče ARM, bilo da se radi o lansirnoj ploči MSP432 iz tvrtke Texas Instruments, ili o onoj o kojoj sada govorimo, Nucleo-F303 (STM32 Nucleo-64), one obično stižu već ispunjene programom, obično neki treptavi program koji također uključuje pritiskanje prekidača za promjenu brzine treptanja LED -a.
Prije nego što budemo toliko brzo to napisali, pogledajmo što možemo vidjeti i učiniti.
S Linuxom 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ć prethodno testirali svoju vezu sa st-info --probe, trebali bismo dobiti neke rezultate 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 spojen: 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 poslužitelj 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 kao i pokretanje gdb strogo naredbenog retka, no umjesto toga proizvodi terminal temeljen na tekstu (pretpostavljam da koristi kletve).
Imamo pokrenut GDB klijent i GDB poslužitelj. 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)". Unesi:
pomoć cilj
To će vam dati popis. 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 uklanjanje pogrešaka pomoću localhost -a: 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 točaka prekida
2018-10-20T18: 42: 30 INFO gdb-server.c: GDB povezan.
Korak 12: Ponovimo, uz Windows i Flash naš program
Koraci za pokretanje st-util gdbservera i klijenta arm-none-eabi-gdb u biti su isti kao i mi u prethodnom koraku. Otvorite dva terminala (cygwin, DOS cmd ili Windows Powershell), pronađete lokaciju st-utila, pokrenite ga. Na drugom terminalu pokrenite klijent arm-none-eabi-gdb. Jedina razlika je u tome što način -tui (prikaz teksta temeljen 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 cijeli put do te datoteke kao argument GDB klijentu.
Pojednostavio sam svoj život pomoću cygwina i stvaranjem veza iz svog 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
Pustili smo da se pokrene, pričekali (gdb) upit, izvršili istu naredbu povezivanja s GDB poslužiteljem (st-util) i spremni smo za fleširanje izvršne datoteke. Vrlo je klimatski:
(gdb) opterećenje
Pokretanje s cygwin terminalima, poznat je problem s tim da se neke naredbe konzole ponekad ne emitiraju. Dakle, u našem slučaju prozor s poslužiteljem bio je potpuno tih. Ona koja pokreće klijenta, gdje smo pokrenuli učitavanje, ispisuje ovo:
Učitavanje odjeljka.tekst, veličina 0x1c lma 0x8000000Start adresa 0x8000000, veličina učitavanja 28 Brzina prijenosa: 1 KB/s, 28 bajtova/pisanje.
Korak 13: Bljeskanje s Linuxom - više nagrađivanja: D
Korak 14: Zaronimo malo dublje
Ako ste stigli ovdje, odlično. Idemo dalje.
Zašto ne biste pogledali unutar datoteke main.elf, izvršne datoteke? Pokrenite sljedeće:
arm-none-eabi-objdump -d glavni.elf
Trebali biste vidjeti izlaz ovako:
main.elf: format datoteke elf32-littlearm
Rastavljanje odjeljka.teksta:
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.word 0x20014000 8000018: deadbeef.word 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 doista 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 neposrednu, 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. Nigdje drugdje. Pa ipak, ako pogledate gornje rastavljene/rekonstruirane upute itd., Postoji više stvari povezanih s DEADBEEF -om nego što smo mislili.
Dakle, prevoditelj/povezivač je nekako odlučio trajno prenijeti vrijednost DEADBEEF -a u FLASH adresu, na lokaciji 0x8000018. A onda je prevoditelj promijenio gornju LDR uputu u:
LDR R7, [PC, #8]
Čak nam je izazvao komentar. Kako lijepo. I govori nam da uzmemo trenutnu vrijednost brojača programa (registar računala), toj vrijednosti dodamo 0x8, i tu je snimljen DEADBEEF, te dobijemo tu vrijednost i ubacimo je u R7.
Dakle, to također znač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 završetka main_loop.
Korak 15: Konačno, kratki pogled na program koji se izvodi
Čak i ako napustite GDB, samo ponovno unesite naredbu. Ne morate mu čak dati niti datoteku; više ne bljeskamo, samo ga pokrećemo.
Nakon što ste ponovno povezali GDB klijent s GDB poslužiteljem, u naredbenom retku (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 4294900000000000000000000000000000000000000
No, zatim, u odzivu (gdb) unesite:
(gdb) nastaviti
I vrlo brzo pritisnuo CTRL-C. To bi trebalo pauzirati program. Ponovno unesite naredbu "info registri".
Ovaj put izgleda drugačije:
(gdb) info registri
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 r0 0x0 0x00x00x0000 16777216
Što se dogodilo? Upravo ono što smo htjeli. DEADBEEF je učitan u R7, a R0 se (izuzetno brzo) povećavao. Ako ponovite, ponovno ćete vidjeti R0 s drugom vrijednošću.
Korak 16: Željeli smo u Flash-u stvoriti niz samo za čitanje
Jedan od načina za stvaranje ekvivalenta niza pomoću sklopa i direktiva je sljedeći:
.type myarray, %object // naziv 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'..rijeka 0x22222222 // druga vrijednost (susjedne adrese)..riječ 0x33333333 // i tako dalje..size myarray,.-myarray // prevoditelj/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 1. mjestu '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 polja? 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 pokazuje na sljedeći
// adresa..
B main_loop // Petlja natrag.
Videozapis prolazi kroz sve to, a u njemu je i greška. Dobro je; pokazuje da je važan kôd za pokretanje i otklanjanje pogrešaka. Prikazuje klasičan slučaj odlaska s kraja niza.
Preporučeni:
Dio 3: GPIO: ARM sklop: Sljedbenik linije: TI-RSLK: 6 koraka
Dio 3: GPIO: ARM sklop: Sljedbenik linije: TI-RSLK: Pozdrav. Ovo je sljedeći nastavak u kojem nastavljamo koristiti ARM sklop (umjesto jezika više razine). Inspiracija za ovaj Instructable Lab 6 je kompleta za učenje robotskog sustava Texas Instruments Robotics System ili TI-RSLK. Koristit ćemo mikrofon
Animacija na LCD -u 16x2 I2c KORIŠTENJE STM32 Nucleo: 4 koraka
Animacija na LCD -u 16x2 I2c KORIŠTENJEM STM32 Nucleo: Zdravo prijatelji, ovo je vodič koji prikazuje kako napraviti prilagođenu animaciju na LCD -u 16x2 i2c. Za projekt je potrebno vrlo malo stvari, pa ako imate pristup kodu, možete dovršiti to za 1 sat. Nakon što slijedite ovaj vodič, bit ćete abl
ROS MoveIt Robotic Arm 2. dio: Robotski kontroler: 6 koraka
ROS MoveIt Robotic Arm Dio 2: Robot Controller: https://github.com/AIWintermuteAI/ros-moveit-arm.gitU prethodnom dijelu članka stvorili smo URDF i XACRO datoteke za našu robotsku ruku i pokrenuli RVIZ za kontrolu naše robotska ruka u simuliranom okruženju. Ovaj put ćemo to učiniti s rea
DIO 2 - SKLOP GPIO ARM - RGB - FUNKCIONI POZIVI - Prekidači: 6 koraka
DIO 2 - SKLOP GPIO ARM - RGB - FUNKCIONI POZIVI - Prekidači: U prvom dijelu naučili smo kako prebaciti jednu crvenu LED diodu na razvojnoj ploči MSP432 LaunchPad iz Texas Instruments, koristeći sklop umjesto C / C ++. U ovom Instructableu učinit će nešto slično - upravljati RGB LED diodom koja je također na tom uzorku
SKLOP GPIO ARM - T.I. KOMPLET ZA UČENJE SUSTAVA ROBOTIKE - LAB 6: 3 koraka
SKLOP GPIO ARM - T.I. KOMPLET ZA UČENJE SUSTAVA ROBOTIKE - LAB 6: Pozdrav, U prethodnom Instructable o učenju ARM sklopa pomoću Texas Instruments TI -RSLK (koristi mikrokontroler MSP432), zvani Lab 3 ako radite T.I. naravno, prešli smo neke vrlo osnovne upute, poput pisanja u registar