Sigurnost.  Postaviti.  Internet.  Oporavak.  Instalacija

Počinjemo proučavati Cortex-M koristeći STM32 kao primjer. Priprema razvojnog okruženja za "odrasle" za STM32 u Linuxu Upravljanje taktom perifernih jedinica

Pozdravljam sve ljubitelje programiranja, mikrokontrolera i elektronike općenito na našoj web stranici! U ovom članku ću vam reći nešto o tome šta ćemo ovdje raditi, odnosno o kursu obuke o ARM mikrokontrolerima.

Dakle, prvo, hajde da shvatimo šta trebate znati i biti u mogućnosti da počnete učiti ARM. Ali, u principu, ništa superkomplicirano i očaravajuće 😉 Naravno, ljudi obično prelaze na ARM kontrolere nakon što su se već dovoljno poigrali sa PIC-ovima i AVR-ovima, odnosno većina njih su iskusni programeri. Ali pokušat ću što detaljnije i jasnije opisati sve što ćemo analizirati, kako bi oni koji su se odlučili prvi put okušati u programiranju mikrokontrolera mogli lakše razumjeti materijal. Usput, ako imate bilo kakvih pitanja, ili ako nešto jednostavno ne radi kako je predviđeno, napišite u komentarima, pokušat ću to shvatiti i pomoći.

Pređimo sada na tehnička pitanja) Već sam nekoliko puta spomenuo naziv „Kurs za obuku ARM“, ali, uglavnom, to nije sasvim tačno. Ne postoji takva stvar kao što je ARM mikrokontroler. Postoji kontroler sa ARM jezgrom(!), ali ovo, vidite, još uvijek nije ista stvar. Dakle, takve uređaje proizvodi niz kompanija, među kojima se ističu STMicroelectronics i NXP Semiconductors. U skladu s tim proizvode STM i LPC kontrolere. Odlučio sam se za STM32, samo su mi se više svidjeli =) Sa STM-om je vrlo zadivljujuće da kada jednom prođete bilo koji MK iz STM32F10x linije, nećete imati problema ni sa jednim drugim. Jedan red – jedan list sa podacima. Inače, postoji ogroman broj kako skupih tako i ne tako skupih razvojnih ploča sa STM32 kontrolerima, što je jako drago, iako ćemo u početku debugirati naše programe u simulatoru kako bismo procijenili mogućnosti kontrolera prije kupovine hardvera. Evo, za svaki slučaj, službena web stranica STMicroelectronics -.

Nekako smo glatko prešli na temu kompajlera, pa ću reći nekoliko riječi o tome. Bez razmišljanja, izabrao sam Keila, ne samo zbog moćnog ugrađenog simulatora. Možete pogledati UART tamo, i bilo koji registar, pa čak je dostupan i logički analizator. Jednom riječju, Keil je na mene ostavio uglavnom samo ugodne utiske, mada ima i nedostataka, naravno, ali ne katastrofalnih. Tako da možete bezbedno preuzeti Keil uvision4 sa off. site(). Istina, postoji jedno ALI - IDE se plaća, ali je dostupan demo mod sa ograničenjem koda od 32 kB, što nam je za sada više nego dovoljno. Kome ovo nije dovoljno, postoji ogroman broj crackova za Keila 😉 Sve se instalira bez problema - guramo dalje par puta i sve se savršeno instalira i radi bez dodatnih plesova s ​​tamburom.

Zapravo, to je sve što sam vam ovdje htio reći, vrijeme je da prijeđete s riječi na djela, ali to je u sljedećem članku. Naučit ćemo programirati STM32 mikrokontrolere od nule!

Ovaj članak je prvi u planiranoj seriji članaka o proučavanju programiranja mikrokontrolera. Proučavajući razne materijale, primijetio sam da gotovo svi oni počinju činjenicom da se od početnika traži da preuzme (ili koristi biblioteku koja dolazi uz razvojno okruženje) za rad s perifernim uređajima i da je koristi za pisanje svog prvog programa (obično treperi LED).

Ovo me je jako iznenadilo. Ako vjerujete u ove članke, ne morate čak ni čitati dokumentaciju da bi programabilni kontroler programirao. Učili su me mudrosti "hardversko programiranje" potpuno drugačije.

U ovom članku, put od fraze "Da, želim pokušati!" dok će radosni mig LED-a biti mnogo duži od onog kod drugih autora. Pokušat ću otkriti aspekte programiranja mikrokontrolera koji se kriju iza upotrebe bibliotečkih funkcija i gotovih primjera.
Ako namjeravate ozbiljno proučavati programiranje mikrokontrolera, ovaj članak je za vas. Možda bi to moglo biti interesantno i onima koji su se dovoljno igrali sa Arduinom i žele se dočepati svih hardverskih mogućnosti hardvera.

Odabir mikrokontrolera

Mnogi će možda reći da je bolje početi učiti mikrokontrolere sa AVR, PIC, 8051 ili nečim drugim. Pitanje je višestruko i kontroverzno. Znam dovoljno primjera gdje su ljudi nakon proučavanja Cortex-M programirali AVR, ARM7 itd. I sam sam počeo sa Cortex-M3. Ako ste suočeni sa određenim zadatkom, na internetu postoji mnogo informacija u kojima se upoređuju različite vrste mikrokontrolera i zadatke koje oni mogu riješiti. Ovo pitanje je pokrenuto i na Habréu, na primjer.

Pretpostavićemo da smo otkrili tip mikrokontrolera. Ali tržište nudi veliki izbor različitih modifikacija različitih proizvođača. Razlikuju se po mnogim parametrima - od veličine flash memorije do broja analognih ulaza. Za svaki zadatak, izbor treba napraviti pojedinačno. Ovdje nema i ne može biti nikakvih općih preporuka. Napomenuću samo da je vrijedno započeti studij sa proizvođačima MK koji imaju najveći mogući asortiman. Zatim, kada birate MK za određeni zadatak, postoji prilično velika šansa da će vam nešto iz predstavljenog asortimana odgovarati.

ja biram STM32(iako mislim da je bolje početi učiti s MK iz TexasInstruments - dokumentacija je vrlo dobro sastavljena), jer su široko rasprostranjeni među ruskim programerima elektronike. Ako imate bilo kakvih problema ili pitanja, rješenja možete lako pronaći na forumima. Još jedan plus je širok izbor demo ploča kako proizvođača tako i organizacija trećih strana.

Šta vam je potrebno za učenje?

Nažalost, za početak programiranja MK-a nije dovoljan samo PC. Negdje ćete morati nabaviti demo ploču i programator. Iako to smanjuje konkurenciju na tržištu rada.

I lično koristim demo ploču. STM3220G-EVAL i programer J-Link PRO. Ali za početak, to će biti sasvim dovoljno STM32F4DISCOVERY, koji se bez problema može kupiti za malu količinu.

Svi primjeri će biti posebno za ploču za otklanjanje grešaka STM32F4DISCOVERY. U ovoj fazi nam uopće neće biti važno da ova ploča ima MCU baziran na Cortex-M4 jezgri. Nećemo koristiti njegove karakteristike i prednosti u odnosu na Cortex-M3 u bliskoj budućnosti. Vidjet ćemo šta će biti dalje.

Ako imate bilo koju drugu ploču baziranu na STM32F2xx/STM32F4xx, možete raditi s njom. U predstavljanju materijala, pokušaću da opišem što je moguće detaljnije. Zašto mi to radimo na ovaj način, a ne drugačije. Nadam se da niko neće imati problema s prijenosom primjera na drugi hardver.

Razvojno okruženje

Kao što je već nekoliko puta pomenuto, postoji dovoljan broj razvojnih okruženja za ARM mikrokontrolere, kako plaćenih, tako i ne toliko. I opet bih želio da izostavim kontroverzu po ovom pitanju. Koristim IAR Embedded Workbench za ARM 6.60. Svi primjeri će biti u ovom okruženju. Ako volite (ili vaša organizacija koristi) nešto drugo (Keil, Eclipse, CCS, CooCoc, itd.) onda vam ni ovo neće naškoditi. Posebnu pažnju posvetiću karakteristikama koje se odnose na razvojno okruženje.

Zašto plaćeno razvojno okruženje?

Možda neko neće biti sasvim zadovoljan činjenicom da predlažem korištenje plaćenog razvojnog okruženja, ali u IAR-u je moguće dobiti privremenu licencu bez ograničenja funkcionalnosti, ili neograničenu licencu s ograničenjem veličine koda (32KB za MK je puno ).
Osim toga, odmah ću napomenuti da za neke MK-ove ne postoje besplatna razvojna okruženja. I nažalost, ovi MK-ovi su u nekim oblastima nezamjenjivi.


Neću opisivati ​​proces instalacije.

Gdje početi?

Kreiranje projekta
Prvo, napravimo prazan projekat. IAR vam omogućava da kreirate projekte u ASM, C i C++. Koristićemo C.

Pred nama će se pojaviti prazan projekat sa glavnim fajlom.

Sada morate da konfigurišete projekat da počne da radi sa "našim" MK-om i debagerom. MK instaliran na STM32F4DISCOVERY ploči STM32F407VG. Mora biti odabran u svojstvima projekta (Opće opcije->Cilj->Uređaj):

Kada odaberete ciljni programabilni procesor, učitava se njegov opis, što pruža obilje mogućnosti za otklanjanje grešaka (o tome će biti riječi u nastavku). Osim toga, automatski se prilaže konfiguracijska datoteka koja opisuje raspoloživi adresni prostor za linker. Ako je potrebno, dotaknut ćemo se teme konfiguracijske datoteke linkera u budućim člancima.

Nakon toga, potrebno je da konfigurišete program za otklanjanje grešaka. Otklanjanje grešaka programa se dešava direktno „u hardveru“. Ovo se radi pomoću JTAG debuggera. Više o tome kako se to dešava možete saznati na Wikipediji. ST-LINK/V2 debugger je integrisan na STM32F4DISCOVERY ploči. Da biste radili sa programom za otklanjanje grešaka, morate izabrati njegov drajver u meniju Debugger->Setup->Driver. Također je potrebno naznačiti da se otklanjanje grešaka provodi direktno u hardveru. Da biste to učinili, morate postaviti zastavu Debugger->Download->Koristi flash loader(e)


Za one koji su vidjeli riječ Simulator

U teoriji, IAR vam omogućava da otklanjate greške u programima koristeći simulator. Ali nikada nisam vidio da se to koristi u praksi.

Sada je projekat spreman za rad (programiranje, punjenje i otklanjanje grešaka).

"TZ" za prvi projekat
Hajde da rezimiramo: MK i debug ploča su odabrani, projekat je pripremljen. Vrijeme je da se odlučite za zadatak.

Ne odstupajmo od klasike. Prvi projekat će biti trepćuća LED dioda. Na sreću, ima ih dosta na ploči.Šta to znači sa programske tačke gledišta? Prva stvar koju trebate učiniti je proučiti shemu kola demo ploče i razumjeti kako se LED „pokreće“.
dostupno na web stranici proizvođača. Ovaj opis čak ima poseban odjeljak o LED diodama na ploči - 4.4 LED diode. Na primjer, mi ćemo koristiti Korisnik LD3. Nađimo ga na dijagramu:

Najjednostavnija analiza kruga sugerira da kako biste "upalili" LED, morate primijeniti "1" na MK pin (što za ovaj MK odgovara 3,3V). Isključivanje se vrši primjenom “0” na ovaj pin. Na dijagramu je ova igla označena PD13(ovo je vjerovatno najvažnija informacija iz ovog dokumenta).

Kao rezultat, možemo napisati "TK" za naš prvi program:
Program za MK mora prenijeti stanje pina MK PD13 iz stanja "0" u stanje "1" i nazad sa određenom periodičnošću koja je vidljiva ljudskom oku (važna napomena, ako LED prečesto treperi okom ovo možda neće moći razlikovati).

Prije nego počnete programirati, ili malo teorije
Prije nego počnemo implementirati naše tehničke specifikacije, potrebno je razumjeti kako se upravlja MK.

Počnimo s činjenicom da svaki MK uključuje jezgru, memoriju i periferne jedinice. Mislim da je sa pamćenjem za sada sve jasno. Samo da napomenem da STM32 ima flash memoriju u kojoj je pohranjen MK program (uopšteno govoreći, ovo nije tačna izjava, program se može pohraniti u vanjsku nepromjenjivu memoriju, ali to ćemo za sada zanemariti) i druge podatke, uključujući korisničke podatke. Tu je i SRAM - random access memory.

Jezgro je dio mikrokontrolera koji izvršava jedan tok naredbi. U našem MK tip jezgra je Cortex-M4. MK jezgro se može uporediti sa procesorom u računaru. Može samo izvršavati komande i prenositi podatke drugim jedinicama (procesori sa integrisanim grafičkim akceleratorima nisu uzeti u obzir u ovom poređenju).
Istovremeno, proizvođač MK ne razvija jezgru. Jezgro je kupljeno od ARM Limited. Glavna razlika između različitih MK-a je u periferiji.

Periferni blokovi su blokovi koji stupaju u interakciju sa “spoljnim svijetom” ili obavljaju specifične funkcije koje su nedostupne MK jezgri. Moderni MCU (uključujući STM32) sadrže ogroman raspon perifernih jedinica. Periferni blokovi su dizajnirani za rješavanje različitih problema, od očitavanja vrijednosti napona sa analognog ulaza MK do prenošenja podataka na vanjske uređaje preko SPI magistrale.
Za razliku od MK jezgre, periferne jedinice ne izvršavaju instrukcije. Oni samo izvršavaju naredbe kernela. U ovom slučaju, učešće kernela pri izvršavanju naredbe nije potrebno.

Primjer

Primjer je UART blok, koji je dizajniran za primanje i prijenos podataka sa MK-a na vanjske uređaje. Kernel samo treba da konfiguriše blok i da mu da podatke za prenos. Nakon toga, kernel može nastaviti s izvršavanjem instrukcija. Periferna jedinica je odgovorna za kontrolu odgovarajućeg MK izlaza za prijenos podataka u skladu s protokolom. Sama periferna jedinica prenosi MK izlaz u potrebno stanje "0" ili "1" u pravo vrijeme, izvodeći prijenos.

Interakcija jezgra sa perifernom jedinicom
Interakcija MK jezgra sa perifernom jedinicom se vrši pomoću posebnih registara (postoji i interakcija kroz mehanizam prekida i DMA, ali o tome više u narednim objavama). Sa tačke gledišta kernela, ovo je jednostavno komad memorije sa specifičnom adresom, to jednostavno nije istina. Upisivanje podataka u poseban registar je ekvivalentno prenošenju komande ili podataka perifernoj jedinici. Čitanje - primanje podataka iz bloka ili čitanje njegovog stanja. Opis perifernih blokova i njihovih posebnih registara zauzima lavovski dio opisa MK.

BITAN: Nakon što upišete podatke u poseban registar i zatim ih pročitate, možete dobiti potpuno drugačije podatke. Na primjer, slanje podataka u UART blok za slanje i čitanje podataka koje je blok primio od vanjskog uređaja, obavljaju se pomoću istog registra.

Posebni registri se obično dijele na bitna polja. Jedan (ili više) bitova kontrolira određeni parametar perifernog bloka, obično nezavisno. Na primjer, različiti bitovi jednog registra kontroliraju stanje različitih MK izlaza.

Zapamtite C
Ako ste guru C jezika, možete bezbedno da preskočite ovaj odeljak. Namijenjen je prvenstveno onima koji su naučeni (ili koji su sami naučili) da programiraju za PC. Iskustvo pokazuje da ljudi često ne pamte važne komande. Ovdje ću vas ukratko podsjetiti na bitne operacije i rad direktno s memorijom na njenoj adresi.

Zapisivanje podataka na memorijsku adresu

Pretpostavimo da smo čitajući opis perifernog bloka shvatili da je za njegov ispravan rad potrebno u njega upisati broj 0x3B. Posebna adresa registra je 0x60004012. Registar je 32-bitni.
Ako odmah ne znate kako to učiniti, pokušat ću opisati lanac razmišljanja kako bih dobio ispravnu naredbu.

Vrijednost 0x60004012 nije ništa drugo do vrijednost pokazivača na memorijsku lokaciju. Upravo to treba da naznačimo u našem programu, odnosno da izvršimo konverziju tipa prema sintaksi jezika C:

(nepotpisano dugo*)(0x60004012)

Dakle, imamo pokazivač na element. Sada morate upisati traženu vrijednost u ovaj element. Ovo se radi dereferenciranjem pokazivača. Tako dobijamo ispravnu naredbu:

*(unsigned long*)(0x60004012) = 0x3B;

Postavljanje proizvoljnih bitova na 1

Pretpostavimo da želite da postavite bitove 7 i 1 na adresi 0x60004012 na “1” bez promjene vrijednosti svih ostalih bitova u registru. Da biste to učinili, trebate koristiti binarnu operaciju |. Odmah ću vam dati tačan odgovor:

*(unsigned long*)(0x60004012) |= 0x82;

Obratite pažnju na 2 činjenice. Bitovi se broje od nule, a ne od prvog. Ova operacija zapravo traje najmanje 3 ciklusa takta - čitanje vrijednosti, modificiranje, pisanje. Ponekad to nije prihvatljivo jer između čitanja i pisanja, periferna jedinica je možda promijenila vrijednost jednog od bitova koje ne smijemo mijenjati. Ne zaboravite na ovu funkciju, inače se mogu pojaviti greške koje je izuzetno teško uhvatiti.

Postavljanje proizvoljnih bitova na 0

Pretpostavimo da želimo da postavimo bitove 7 i 1 na adresi 0x60004012 na "0" bez promjene vrijednosti svih ostalih bitova u registru. Da biste to učinili, trebate koristiti binarni & operator. Odmah ću vam dati tačan odgovor:

*(unsigned long*)(0x60004012) &= 0xFFFFFF7D;

Ili njegova jednostavnija notacija (ne brinite o dodatnoj operaciji, kompajler će sve izračunati unaprijed čak i uz minimalnu optimizaciju):

*(unsigned long*)(0x60004012) &= (~0x82);

Neke karakteristike programa za MK
Ovdje ću pokušati opisati neke karakteristike programa za MK koje je važno zapamtiti. Stvari su sasvim očigledne, ali ipak.
Programu nema kraja
Za razliku od većine PC programa, MK program nikada ne bi trebao završiti, NIKADA! Šta će tačno MK morati da uradi nakon završetka vašeg programa? Pitanje je praktično retoričko. Stoga, ne zaboravite da se uvjerite da niste zaboravili vječni ciklus. Ako želite, možete staviti MK u stanje mirovanja.
Koristite cjelobrojne varijable
Unatoč činjenici da koristimo mikrokontroler sa Cortex-M4 jezgrom, koji u hardveru izvodi operacije nad brojevima s pomičnim zarezom, savjetujem vam da ih ne koristite. U mikrokontroleru bez podrške za takve operacije, vrijeme računanja će biti jednostavno ogromno.
Izbjegavajte dinamičku dodjelu memorije
Ovo je samo savjet. Razlog je jednostavan - nema dovoljno memorije. Često sam nailazio na biblioteke koje su imale „sporo“ curenje memorije. Bilo je veoma neprijatno kada se, nakon nekoliko nedelja stabilnog rada, MK srušio sa greškom. Bolje je unaprijed razmisliti o arhitekturi vašeg programa kako ne biste morali koristiti dinamičku dodjelu memorije.
Ako ga i dalje želite koristiti, pažljivo proučite rad upravitelja memorije ili napišite svoj.

Hajdemo na posao!

Rad na programu za MK uvijek počinje čitanjem dokumentacije. Za naš MK dostupan je na web stranici proizvođača. Ima puno stranica, ali pročitajte ih sve ćao nema potrebe. Kao što je već spomenuto, najveći dio dokumentacije sastoji se od opisa perifernih jedinica i njihovih registara. Takođe želim da vam skrenem pažnju na činjenicu da ovaj Referentni priručnik nije napisan za jedan MK, već za nekoliko redova. Ovo sugerira da će kod biti prenosiv prilikom prelaska na druge MK-ove u ovim redovima (osim ako, naravno, ne pokušate koristiti periferne jedinice koje nisu u MK-u koji koristite).

Prije svega, morate odlučiti s kojim blokovima ćete raditi. Da biste to učinili, samo proučite odjeljke Uvod I Glavne karakteristike.

Direktna kontrola stanja MK pinova se vrši pomoću GPIO bloka. Kao što je navedeno u dokumentaciji, STM32 MCU može imati do 11 nezavisnih GPIO blokova. Različiti periferni GPIO blokovi se obično nazivaju portovima. Portovi su označeni slovima od A do K. Svaki port može sadržavati do 16 pinova. Kao što smo ranije napomenuli, LED je spojen na pin PD13. To znači da ovaj pin kontroliše GPIO port D periferne jedinice. Pin broj 13.

Ovaj put nam neće trebati nikakve druge periferne jedinice.

Periferna kontrola sata
Kako bi se smanjila potrošnja energije MK-a, gotovo sve periferne jedinice se isključuju nakon uključivanja MK-a. Blok se uključuje/isključuje primjenom/zaustavljanjem dovoda satnog signala na njegov ulaz. Za ispravan rad potrebno je konfigurirati MK kontroler signala sata tako da potrebna periferna jedinica prima signal takta.
Bitan: Periferna jedinica ne može započeti s radom odmah nakon što se uključi signal sata. Morate pričekati nekoliko tikova dok ne "počne". Ljudi koji koriste periferne biblioteke često ni ne znaju za ovu funkciju.

Registri su odgovorni za omogućavanje takta perifernih jedinica Registar za omogućavanje perifernog sata RCC XXX.Umjesto XXX mogu biti gume AHB1, AHB2, AHB3, APB1 i APB2. Nakon pažljivog proučavanja opisa odgovarajućih registara, možemo zaključiti da je taktiranje GPIOD perifernog bloka uključeno postavljanjem "1" u treći bit registra RCC AHB1 registar omogućavanja perifernog sata (RCC_AHB1ENR):

Sada morate shvatiti kako saznati adresu samog registra RCC_AHB1ENR.

komentar: Opis sistema za taktiranje STM32 MK zaslužuje poseban članak. Ako čitatelji žele, detaljnije ću obraditi ovaj odjeljak u jednom od sljedećih članaka.

Određivanje adresa posebnih registara
Određivanje adresa posebnih registara mora početi čitanjem odjeljka Mapa memorije u Referentnom priručniku. Možete vidjeti da je svakom bloku dodijeljen vlastiti dio adresnog prostora. Na primjer, za RCC blok ovo je odjeljak 0x4002 3800 - 0x4002 3BFF:

Za dobivanje adrese registra potrebno je dodati početnoj vrijednosti adresnog prostora RCC bloka Adr. offset potreban registar. Pomak adresa je takođe naznačeno u opisu registra (pogledajte snimak ekrana iznad).

Kao rezultat toga, odredili smo adresu registra RCC_AHB1ENR- 0x4002 3830.

GPIO blok
Za opšte razumevanje GPIO bloka, toplo preporučujem da pročitate ceo odeljak Referentnog priručnika. Za sada ne možete obraćati puno pažnje Alternativni način rada. Ostavićemo to za kasnije.

Sada je naš zadatak naučiti kako upravljati stanjem MK pinova. Pređimo direktno na opis GPIO registara.

Način rada
Prije svega, potrebno je postaviti način rada pina 13 porta D kao Način izlaza opće namjene, što znači da će GPIO blok kontrolirati stanje MK pina. Način rada MK pinova se kontrolira pomoću registra Registar načina rada GPIO porta (GPIOx_MODER) (x = A..I/J/K):

Kao što se vidi iz opisa, da bismo izvršili podešavanje koje nam je potrebno, potrebno je da upišemo vrijednost 01b u 26-27 bita registra GPIOx_MODER. Adresa registra se može odrediti koristeći isti metod kao što je gore opisano.

Konfigurisanje parametara rada izlaznih pinova GPIO porta
GPIO blok vam omogućava da primenite dodatna podešavanja za izlazne pinove porta. Ova podešavanja se vrše u registrima:
  • Registar tipa izlaza GPIO porta (GPIOx_OTYPER)- postavite tip izlaza push-pull ili open-drain
  • Registar izlazne brzine GPIO porta (GPIOx_OSPEEDR)- podesite brzinu izlaza
Nećemo mijenjati ove parametre, jer smo prilično zadovoljni zadanim vrijednostima.
Postavljanje vrijednosti na MK pin
Konačno, došli smo do trenutka kontrole izlaznog stanja MK-a. Postoje dva načina za postavljanje izlazne vrijednosti na određeni MK pin.

Koristimo registar bitova GPIO porta za postavljanje/resetovanje (GPIOx_BSRR)

Upisivanje “0” ili “1” u bitove 0-16 uzrokuje odgovarajuću promjenu u stanju pinova porta. Da biste postavili određenu vrijednost na izlazu jednog ili više MK pinova, a ne promijenili stanje ostalih, bit će potrebno koristiti operaciju modifikacije pojedinačnih bitova. Ova operacija se izvodi u najmanje 3 ciklusa. Ako je potrebno napisati 1s u neke bitove i 0s u druge, tada će biti potrebna najmanje 4 ciklusa takta. Ova metoda se najbolje koristi za promjenu stanja izlaza u njegovo suprotno stanje ako je njegovo izvorno stanje nepoznato.

GPIO port bita set/reset registar (GPIOx_BSRR)

Za razliku od prethodne metode, upisivanje 0 u bilo koji od bitova ovog registra neće dovesti ni do čega (i općenito, svi bitovi su samo za pisanje!). Upisivanje 1 u bitove 0-15 će rezultirati postavljanjem "1" na odgovarajućem izlazu MK-a. Upisivanje 1 u bitove 16-31 će postaviti “0” na odgovarajući izlaz MK. Ova metoda je poželjnija od prethodne ako trebate postaviti određenu vrijednost na "MK" pin umjesto da je mijenjate.

Upalimo LED!
Nakon što ste pronašli adrese svih potrebnih registara, možete napisati program koji uključuje LED:
void main() ( //Omogući taktiranje porta D *(unsigned long*)(0x40023830) |= 0x8; //malo kašnjenje za GPIOD spremite se volatile unsigned long i=0; i++; i++; i++; i=0; / /Podesite PD13 kao izlaz opšte namene *(unsigned long*)(0x40020C00) = (*(unsigned long*)(0x40020C00)& (~0x0C000000)) | (0x04000000); //Uključite LED! *(unsigned long*) (0x40020C14) |= 0x2000; dok(1); )
Može se kompajlirati ( Projekt->Kompiliraj) i ispunite ( Projekt->Preuzmi->Preuzmi aktivnu aplikaciju). Ili pokrenite otklanjanje grešaka ( Project->Dpwnload i Debug) i pokrenite izvršavanje (F5).
LED dioda se upalila!
Treperi LED
Treptanje LED-a nije ništa drugo do naizmjenično uključivanje i isključivanje s kašnjenjem između ovih radnji. Najlakši način je uključivanje i isključivanje u vječnu petlju i umetanje odgode između njih.
void main() ( //Omogući taktiranje porta D *(unsigned long*)(0x40023830) |= 0x8; //malo kašnjenje za GPIOD spremite se volatile unsigned long i=0; i++; i++; i++; i=0; / /Postavi PD13 kao izlaz opšte namjene *(unsigned long*)(0x40020C00) = (*(unsigned long*)(0x40020C00)& (~0x0C000000)) | (0x04000000); while(1) ( //Uključite LED *( unsigned long*)(0x40020C14) |= 0x2000; //Odgoda za(i=0; i<1000000 ;++i); //Turn LED OFF *(unsigned long*)(0x40020C14) &= ~0x2000; //Delay for(i=0; i<1000000 ;++i); } }
Vrijednost kašnjenja od 1.000.000 odabrana je eksperimentalno tako da je period treptanja LED diode bio vidljiv oku, ali nije bio predug.
Optimizacija algoritma
Nedostatak odabranog LED trepćućeg pristupa je što MK jezgro većinu vremena provodi u praznim petljama, iako bi moglo raditi nešto korisno (u našem primjeru nema drugih zadataka, ali će se pojaviti u budućnosti).

Kako bi se to izbjeglo, obično se koristi brojač ciklusa, a stanje MK pina se mijenja kada program prođe određeni broj ciklusa.
void main() ( //Omogući taktiranje porta D *(unsigned long*)(0x40023830) |= 0x8; //malo kašnjenje za GPIOD spremite se volatile unsigned long i=0; i++; i++; i++; i=0; / /Postavi PD13 kao izlaz opšte namjene *(unsigned long*)(0x40020C00) = (*(unsigned long*)(0x40020C00)& (~0x0C000000)) | (0x04000000); while(1) ( i++; if(!(i) %2000000)) ( //Uključi LED diodu *(unsigned long*)(0x40020S14) |= 0x2020; ) else if(!(i%1000000)) ( //Isključi LED *(unsigned long*)(0x40020S14) & = ~0x2000; ) ) )
Ali čak i ovdje neće biti bez problema, s promjenom broja naredbi koje se izvršavaju unutar ciklusa, promijenit će se i period treptanja LED-a (ili period izvršavanja drugih naredbi u ciklusu). Ali u ovoj fazi ne možemo se boriti protiv toga.

Malo o otklanjanju grešaka
IAR vam omogućava da debugujete aplikaciju direktno na hardveru. Sve izgleda skoro isto kao i otklanjanje grešaka u računarskoj aplikaciji. Postoji način za izvršavanje korak po korak, ulazak u funkciju, pregled vrijednosti varijabli (U načinu za otklanjanje grešaka Pogled->Gledati->Gledati1/4).

Ali pored ovoga, moguće je vidjeti vrijednosti registara kernela, posebnih registara perifernih jedinica (View->Register) itd.
Toplo preporučujem da se upoznate sa mogućnostima debagera dok učite MK programiranje.

Nekoliko riječi u zaključku

Možda će mnogi reći da ručno upisivanje adresa u program nije ispravno, jer proizvođač daje datoteke sa definicijama registara i bitnih polja, biblioteke za rad sa periferijama i drugim alatima koji olakšavaju život programeru. U potpunosti se slažem sa ovim, ali ipak smatram da se prvi koraci u programiranju MK-a moraju poduzeti ručnim kopanjem po dokumentaciji, samostalno određujući potrebne registre i bitna polja. Ne morate ovo koristiti u budućnosti, ali svakako morate znati kako to učiniti.
Evo samo nekoliko razloga za ovu izjavu:
  • Ponekad biblioteke proizvođača sadrže greške! Jednom sam zamalo propustio rok za projekat zbog ovoga. Prelemio sam čip nekoliko puta, misleći da je kristal oštećen tokom lemljenja (to se i ranije dešavalo). Problem je bio što je adresa posebnog registra pogrešno upisana u biblioteku. To se obično dešava sa MK ili MK linijama koje su tek ušle na tržište.
  • Biblioteke za rad sa periferijama nekih proizvođača ne implementiraju sve mogućnosti perifernih jedinica. Ovim sam posebno zgrešio Luminary Micro, koje je kasnije kupio TI. Morao sam ručno napisati inicijalizaciju periferije.
  • Mnogi se ljudi naviknu na pokretanje MK programiranja proučavanjem primjera. Vjerujem da prvo morate odlučiti šta vam omogućava da implementirate MK. To se može razumjeti samo čitanjem dokumentacije. Ako nešto nije u primjerima, to ne znači da hardver to ne podržava. Posljednji primjer je PTP STM32 hardverska podrška. Naravno, možete pronaći nešto na internetu, ali to nije uključeno u standardni set proizvođača.
  • Drajveri perifernih jedinica nekih proizvođača su toliko neoptimizirani da prebacivanje stanja pina pomoću biblioteke traje do 20 taktova. Ovo je luksuz koji se ne može priuštiti za neke zadatke.

Hvala svima koji su pročitali moj post, ispalo je mnogo više nego što sam očekivao na početku.
Radujem se vašim komentarima i obrazloženim kritikama. Ako oni koji ga čitaju imaju želju, pokušaću da nastavim seriju članaka. Možda neko ima ideje o temama koje bi vrijedilo obraditi - bilo bi mi drago čuti ih.

Još u studentskim godinama, morao sam da se dobro upoznam sa mikrokontrolerima, tada su to bili 8-bitni 8051 i AVR. Sada, želeći da se vratim ovoj aktivnosti, skrenuo sam pažnju na veoma široku porodicu STM32 kontrolera. O njima se dosta pisalo na internetu, međutim, izrazio sam želju da napišem kratku seriju članaka o radu sa STM-ima. Želio bih da počnem da se upoznajem s njima, kako kažu, od potpune 0. Za eksperimente sam kupio jednostavnu i jeftinu (3$) Maple Mini ploču za otklanjanje grešaka. STM32F103CB kontroler koji se koristi u njemu ima vrlo impresivan raspon mogućnosti. (posebno u poređenju sa rješenjima u svojoj cjenovnoj kategoriji). Možete detaljno pročitati na internetu, i naravno, u. Nije mi se odmah svidjelo izvorno razvojno okruženje nalik Arduinu (ukus i boja, kako kažu...). Od svog obilja različitih razvojnih okruženja, usredsredio sam se na mikroC za ARM iz mikroelektronike. Jednom sam naišao na njihove kompajlere (za 8081) i jako su mi se svidjeli. Iako ne bez grešaka, odlučio sam da probam.


Ploča izgleda ovako, sve je vrlo jednostavno i sažeto:



Šema sklopa ploče je također jednostavna, ali sve što vam treba je ovdje:



Odabrani programator je kineski klon ST-LINK2 (3$), međutim, savršeno radi sa mikroS-om



Link ka demo verziji mikroC-a. Ograničenje demo verzije: maksimalno 4KB binarnog koda. Ne mnogo, ali sasvim dovoljno za upoznavanje. Ne bi trebalo da bude problema sa instalacijom aplikacije, jedino što treba da uradite je da instalirate drajvere za ST-LINK2 pre pokretanja mikroC instalatera.


Nakon pokretanja i kreiranja projekta, dočekuje nas prozor aplikacije:



Prvi korak nakon odabira tipa mikrokontrolera koji će se koristiti je konfiguracija svojstava našeg projekta. Konfiguracija mikroC projekta se poziva prečicom na tastaturi Shift-Ctrl-E(Projekat - Uredi projekat). U ovom prozoru su konfigurisane sve užitke povezane sa složenom unutrašnjom organizacijom sistema sata mikrokontrolera STM32. Općenito, savjetujem vam da se barem nakratko upoznate sa ovom porodicom mikrokontrolera. Na to ćemo se više puta vraćati.



Blok dijagram sistema sata iz STM32F103 datasheet-a


Ovaj prozor specificira konfiguraciju registra RCC_CR i RCC_CFGR

  • Omogućavanje unutrašnjeg sata velike brzine - Omogućite ili onemogućite ugrađeni oscilator od 8 MHz (HSI) (oscilator isključen)
  • Omogućavanje eksternog sata velike brzine - Omogućite ili onemogućite ugrađeni oscilator od 8 MHz (HSE) (oscilator uključen)
  • Omogućavanje eksternog brzog sata - Mogućnost povezivanja generatora takta na OSC ulaz umjesto kvarca. Postavili smo da koristimo kvarc (HSE oscilator nije zaobiđen)
  • Omogućavanje sigurnosnog sistema sata - Omogućava sisteme zaštite ugrađene u kontroler od gubitka signala sata; Još ga ne koristimo (Detektor sata ISKLJUČEN)
  • PLL Enable - Omogući/onemogući modul za množenje frekvencije (PLL UKLJUČEN)
  • Prekidač sistemskog sata - Odaberite signal takta SYSCLOCK: PLL, eksterni ili interni oscilator. Koristimo PLL. Na HSE frekvenciji pomnoženoj sa PLL koeficijentom radi jezgro našeg kontrolera (PLL odabran kao sistemski sat)
  • Postavljanje i brisanje softverom za kontrolu faktora podjele AHB sata - Podešavanje SYSCLOCK predskalera za AHB sabirnicu, koja opslužuje periferne module MK-a; za sada isključujemo predskaler * (SYSCLOCK nije podijeljen)
  • APB preskaler niske brzine APB1 - djelitelj frekvencije za periferne uređaje male brzine MK, kao što je I2C sabirnica, maksimalna radna frekvencija: 36 MHz (HCLK podijeljen sa 2)
  • APB brzi predskaler APB 2 - djelitelj frekvencije za brze MK periferne uređaje, kao što su I/O portovi, tajmeri itd. (HCLK nije podijeljen)
  • ADC predskaler - predskaler za ADC modul u odnosu na APB 2 (PCLK2 podijeljeno sa 2)
  • PLL ulazni izvor takta - izvor taktnog signala na PLL ulaz, izbor između 1/2 ugrađenog RC oscilatora ili eksternog oscilatora koji prolazi kroz PREDIV1; to je ono što koristimo (Sat iz PREDIV1 odabran kao PLL ulazni sat)
  • HSE razdjelnik za PLL ulaz - postavljanje ovog PREDIV1; Još ga ne koristimo (HSE sat nije podijeljen)
  • PLL faktor množenja - PLL faktor množenja. Na ulazu imamo kvarcnu frekvenciju od 8 MHz, sa faktorom 9 imamo frekvenciju od 72 MHz za SYSCLOCK (PLL ulazni sat x 9)
  • USB predskaler - frekvencija USB magistrale. USB prema specifikaciji radi na frekvenciji od 48 MHz, odaberite predskaler od 1,5 (PLL sat podijeljen sa 1,5)

Odabir frekvencije MSU takta SYSCLOCK frekvencija - 72 MHz (72.000000)




Za postavljanje izlaza GPIO porta na izlaz u microC postoji funkcija


GPIO_Digital_Output(&GPIOh_BASE, _GPIO_PINMASK_ALL);// Konfigurišite izlazni port

uključuje taktiranje GPIOx bloka i upisuje vrijednosti u registar konfiguracije. Podaci koje upisujemo u port se unose u registar GPIOh_ODR.


GPIOh_ODR = ; // Upisni registar luka

Kompajler vam omogućava pristup određenom bitu registra ili promenljivoj. Da biste to učinili, upišite broj bita (počevši od 0) iza imena registra odvojenog tačkom


REGx.by; // Pristup pojedinačnom (y) bitu registra (x)

Za generiranje kašnjenja koristimo ugrađenu funkciju Delay_ms()(ili Delay_us()) kompajler. Evo našeg prvog programa:


void main() ( GPIO_Digital_Output(&GPIOb_BASE, _GPIO_PINMASK_1); //Napravi PB1 kao izlaz GPIOb_ODR.b1 = 0; //Upisuje u registar GPIOb_ODR u 15 bita = 0 while(1) // Beskonačna petlja ( GPIOb1=~O GPIOb_ODR. b1; //Inverzija bita 15 Delay_ms(500); //Kašnjenje 500 ms ) )

Da bi se jedna naredba za inicijalizaciju primijenila na nekoliko krakova porta odjednom, pišemo _GPIO_PINMASKn kroz operator "ili", na primjer:


GPIO_Digital_Output(&GPIOb_BASE, _GPIO_PINMASK_1 | _GPIO_PINMASK_7); //PB1 i PB7 su konfigurisani za izlaz GPIO_Digital_Output(&GPIOa_BASE, _GPIO_PINMASK_ALL); //Sve PA noge su postavljene na izlaz

Pokušajmo sada izvesti meandar na jedan od MK pinova, mijenjajući stanje izlaza PB15 porta u intervalu od 5 ms. :


void main() ( GPIO_Digital_Output(&GPIOb_BASE, _GPIO_PINMASK_15); GPIOb_ODR.b15 = 0; while(1) ( GPIOb_ODR.b15=~GPIOb_ODR.b15; Delay_ms(5); // Odgoda 5 ms, frekvencija 10 ms. Hz) ) )

Na pinu PB15 imamo sljedeći signal:



Ako trebamo pročitati stanje porta, koristimo registar GPIOh_IDR, nakon što ste prethodno konfigurirali port kao ulaz koristeći funkciju GPIO_Digital_Input (*port, pin_mask). Naša ploča ima dugme spojeno na pin PB8 porta. Sljedeći program pali trepćuće LED na pin PB1 kada se pritisne dugme.


void main() ( GPIO_Digital_Output(&GPIOb_BASE, _GPIO_PINMASK_1); GPIO_Digital_Input(&GPIOb_BASE, _GPIO_PINMASK_8); // Konfigurišite izlaz PB8 na ulaz GPIOb_ODR.b1 = 0 (Dugme Ifr;) je pritisnut bit 8 registar GPIOb_IDR je jednak 1 ( GPIOb_ODR.b1=~GPIOb_ODR.b1; Delay_ms(500); //Kašnjenje 500 ms) inače (GPIOb_ODR.b1 = 0; //Ako je dugme otpušteno, isključite LED) ) )

Ovim se završava prvi dio. U drugom dijelu pokušat ću da vas upoznam sa implementacijom PWM modulacije, radom sa tajmerima i funkcijom suzbijanja odbijanja kontakata na dugmetu.

Oznake: Dodajte oznake

Poslednjih godina, 32-bitni mikrokontroleri (MCU) bazirani na ARM procesorima ubrzano osvajaju svet elektronike. Ovaj proboj je rezultat njihovih visokih performansi, napredne arhitekture, niske potrošnje energije, niske cijene i naprednih alata za programiranje.

PRIPOVIJETKA
Naziv ARM je akronim za napredne RISC mašine, gde RISC (Reduced Instruction Set Computer) označava arhitekturu procesora smanjenog skupa instrukcija. Ogroman broj popularnih mikrokontrolera, kao što su PIC i AVR porodice, takođe imaju RISC arhitekturu, koja je povećala performanse pojednostavljujući dekodiranje instrukcija i ubrzavajući njihovo izvršavanje. Pojava naprednih i produktivnih 32-bitnih ARM mikrokontrolera omogućava nam da pređemo na rešavanje složenijih problema sa kojima se 8 i 16-bitni MCU više ne mogu nositi. Arhitekturu ARM mikroprocesora sa 32-bitnom jezgrom i RISC skupom instrukcija razvila je britanska kompanija ARM Ltd, koja isključivo razvija kernele, kompajlere i alate za otklanjanje grešaka. Kompanija ne proizvodi MK, već prodaje licence za njihovu proizvodnju. MK ARM je jedan od najbrže rastućih segmenata MK tržišta. Ovi uređaji koriste tehnologije za uštedu energije, tako da se široko koriste u ugrađenim sistemima i dominiraju tržištem mobilnih uređaja za koje je važna niska potrošnja energije. Osim toga, ARM mikrokontroleri se aktivno koriste u komunikacijama, prijenosnim i ugrađenim uređajima gdje su potrebne visoke performanse. Karakteristika ARM arhitekture je računarsko jezgro procesora, koje nije opremljeno dodatnim elementima. Svaki programer procesora mora samostalno opremiti ovu jezgru potrebnim blokovima za svoje specifične zadatke. Ovaj pristup je dobro funkcionisao za velike proizvođače čipova, iako je u početku bio fokusiran na klasična procesorska rešenja. ARM procesori su već prošli kroz nekoliko faza razvoja i dobro su poznati po porodicama ARM7, ARM9, ARM11 i Cortex. Potonji je podijeljen na podfamilije klasičnih CortexA procesora, CortexR procesora u realnom vremenu i CortexM mikroprocesorskih jezgara. CortexM jezgra su postala osnova za razvoj velike klase 32-bitnih MCU-a. Razlikuju se od ostalih varijanti Cortex arhitekture prvenstveno po upotrebi 16-bitnog Thumb2 skupa instrukcija. Ovaj set kombinuje performanse i kompaktnost “klasičnih” ARM i Thumb instrukcija i razvijen je posebno za rad sa C i C++ jezicima, što značajno poboljšava kvalitet koda. Velika prednost mikrokontrolera izgrađenih na CortexM jezgri je njihova softverska kompatibilnost, koja teoretski omogućava korištenje programskog koda visokog nivoa u modelima različitih proizvođača. Osim što ukazuju na područje primjene jezgre, MK programeri ukazuju na performanse CortexM jezgre na skali od deset bodova. Danas su najpopularnije opcije CortexM3 i CortexM4. MCU sa ARM arhitekturom proizvode kompanije kao što su Analog Devices, Atmel, Xilinx, Altera, Cirrus Logic, Intel, Marvell, NXP, STMicroelectronics, Samsung, LG, MediaTek, MStar, Qualcomm, SonyEricsson, Texas Instruments, nVidia, Freescale, Milander , HiSilicon i drugi.
Zahvaljujući optimizovanoj arhitekturi, cena MCU-ova baziranih na CortexM jezgri je u nekim slučajevima čak niža nego kod mnogih 8-bitnih uređaja. "Mlađi" modeli trenutno se mogu kupiti za 30 rubalja. za tijelo, što stvara konkurenciju prethodnim generacijama MK. STM32 MIKROCONTROLLERI Razmotrimo najpristupačniji i najrašireniji MCU iz STM32F100 porodice iz STMicroelectronics, koji je jedan od vodećih svjetskih proizvođača MCU-a. Kompanija je nedavno najavila početak proizvodnje 32-bitnog MK-a koji koristi prednosti industrijske
STM32 jezgre u jeftinim aplikacijama. MCU-ovi porodice STM32F100 Value line dizajnirani su za uređaje kod kojih performanse 16-bitnih MCU-ova nisu dovoljne, a bogata funkcionalnost "običnih" 32-bitnih uređaja je suvišna. STM32F100 linija MCU-a je zasnovana na modernom ARM CortexM3 jezgru sa periferijama optimizovanim za upotrebu u tipičnim aplikacijama gde su korišćeni 16-bitni MCU-ovi. Performanse STM32F100 MCU na 24 MHz su superiornije od većine 16-bitnih MCU-a. Ova linija uključuje uređaje s različitim parametrima:
● od 16 do 128 kbajta programske fleš memorije;
● od 4 do 8 kbajta RAM-a;
● do 80 GPIO ulaznih/izlaznih portova;
● do devet 16-bitnih tajmera sa naprednim funkcijama;
● dva watchdog tajmera;
● 16-kanalni brzi 12-bitni ADC;
● dva 12-bitna DAC-a sa ugrađenim generatorima signala;
● do tri UART interfejsa koji podržavaju IrDA, LIN i ISO7816 modove;
● do dva SPI interfejsa;
● do dva I2C interfejsa koji podržavaju SMBus i PMBus režime;
● 7-kanalni direktni pristup memoriji (DMA);
● CEC (Consumer Electronics Control) interfejs uključen u HDMI standard;
● sat realnog vremena (RTC);
● NVIC ugniježđeni kontroler prekida.

Funkcionalni dijagram STM32F100 prikazan je na slici 1.

Rice. 1. Arhitektura MK linije STM32F100

Dodatna pogodnost je pin kompatibilnost uređaja, što omogućava, ako je potrebno, korištenje bilo kojeg MK porodice sa većom funkcionalnošću i memorijom bez prerade štampane ploče. STM32F100 linija kontrolera se proizvodi u tri tipa paketa LQFP48, LQFP64 i LQFP100, sa 48, 64 i 100 pinova. Raspored pinova je prikazan na slikama 2, 3 i 4. Ovakva kućišta se mogu instalirati na štampane ploče bez upotrebe posebne opreme, što je značajan faktor u maloj proizvodnji.


Rice. 2. STM32 MCU u LQFP48 paketu Sl. 3. STM32 MCU u LQFP64 paketu


Rice. 4. STM32 MCU u LQFP100 paketu

STM32F100 je pristupačan i optimizovan uređaj zasnovan na CortexM3 jezgri, podržan od strane naprednog razvojnog okruženja za STM32 familiju mikrokontrolera, koji sadrži
Besplatne biblioteke za sve periferne uređaje, uključujući kontrolu motora i tastature na dodir.

DIJAGRAM PRIKLJUČIVANJA STM32F100C4
Razmotrimo praktičnu upotrebu MK na primjeru najjednostavnijeg uređaja STM32F100C4, koji ipak sadrži sve glavne blokove linije STM32F100. Šema električnog kola STM32F100C4 prikazana je na slici 5.


Rice. 5. Dijagram povezivanja za MK STM32F100C4

Kondenzator C1 osigurava da se MK resetuje kada se napajanje uključi, a kondenzatori C2-C6 filtriraju napon napajanja. Otpornici R1 i R2 ograničavaju struju signala MK pinova. Interni oscilator se koristi kao izvor takta, tako da nema potrebe za korištenjem eksternog kristala.


Ulazi BOOT0 i BOOT1 vam omogućavaju da odaberete način punjenja MK-a pri uključivanju napajanja u skladu sa tabelom. BOOT0 ulaz je povezan na sabirnicu nultog potencijala preko otpornika R2, koji štiti BOOT0 pin od kratkog spoja kada se koristi kao izlazni port PB2. Koristeći konektor J1 i jedan kratkospojnik, možete promijeniti potencijal na BOOT0 ulazu, određujući na taj način kako se MK učitava - iz flash memorije ili iz ugrađenog bootloadera. Ako trebate učitati MK iz RAM-a, sličan konektor sa kratkospojnikom se može spojiti na BOOT1 ulaz.
Programiranje MK-a se vrši preko UART1 serijskog porta ili preko posebnih programatora - JTAG ili STLink debuggera. Potonji je dio popularnog uređaja za otklanjanje grešaka STM32VLDISCOVERY, prikazanog na slici 6. Na STM32VLDIS COVERY ploči, 4-pinski konektor programatora - STLink debugger - označen je kao SWD. Autor članka predlaže programiranje MK preko UART1 serijskog porta, jer je mnogo jednostavniji, ne zahtijeva posebnu opremu i nije inferiorniji u brzini od JTAG ili ST Linka. Bilo koji personalni računar (PC) koji ima serijski COM port ili USB port sa USBRS232 konvertorom može se koristiti kao kontrolni uređaj sposoban da generiše komande i prikazuje rezultate MK programa, kao i kao programator.

Za povezivanje COM porta PC-a s MK-om, prikladan je bilo koji pretvarač RS232 signala u logičke razine signala od 0 do 3,3 V, na primjer, mikrokolo ADM3232. TXD prenosni vod kompjuterskog serijskog porta, nakon konvertora nivoa, treba da bude povezan na PA10 ulaz mikrokontrolera, a RXD prijemni vod, preko sličnog pretvarača, na PA9 izlaz.

Ako trebate koristiti neisparljiv MK sat, na njega bi trebali spojiti bateriju CR2032 napona od 3 V i kvarcni rezonator frekvencije 32768 Hz. U tu svrhu, MK je opremljen Vbat/GND i OSC32_IN/OSC32_OUT pinovima. Vbat pin se prvo mora odvojiti od 3,3 V strujne magistrale.

Preostali slobodni terminali MK-a mogu se koristiti po potrebi. Da biste to učinili, trebali bi biti povezani na konektore koji se nalaze po obodu tiskane ploče za MK, po analogiji s popularnim Arduino uređajima i STM32VLDISCOVERY pločom za otklanjanje grešaka.


Rice. 6. Uređaj za otklanjanje grešaka STM32VLDISCOVERY


Šema električnog kola STM32VLDISCOVERY.

Dakle, ovisno o namjeni i načinu korištenja MK-a, na njega možete povezati potrebne elemente za korištenje drugih funkcionalnih blokova i portova, na primjer, ADC, DAC, SPI, I2C, itd. U budućnosti će se ovi uređaji detaljnije razmatrati.

PROGRAMIRANJE
Danas mnoge kompanije nude alate za kreiranje i otklanjanje grešaka u programima za STM32 mikrokontrolere. To uključuje Keil iz ARM Ltd, IAR Embedded Workbench za ARM, Atol lic TrueStudio, CooCox IDE, GCC i Eclipse IDE. Programer može odabrati softver prema svojim željama. U nastavku ćemo opisati komplet alata Keil uVision 4 kompanije Keil, koji podržava veliki broj tipova mikrokontrolera, ima razvijen sistem alata za otklanjanje grešaka i može se koristiti besplatno uz ograničenja veličine generiranog koda od 32 kbajta ( što je, zapravo, maksimum za mikrokontrolere koji se razmatraju).

Lak i brz početak sa CooCox CoIDE.

Pa počnimo. Idite na službenu web stranicu CooCoxa i preuzmite najnoviju verziju CooCox CoIDE. Za preuzimanje morate se registrirati, registracija je jednostavna i besplatna. Zatim instalirajte preuzetu datoteku i pokrenite je.

CooCox CoIDE- razvojno okruženje zasnovano na Eclipse-u, koje pored STM32 podržava gomilu drugih familija mikrokontrolera: Freescale, Holtek, NXP, Nuvoton, TI, Atmel SAM, Energy Micro, itd. Sa svakom novom verzijom CoIDE-a, lista mikrokontrolera se stalno ažurira. Nakon uspješne instalacije CoIDE, pokrenite:

Pojavit će se prozor za početak koraka 1 u kojem trebate odabrati proizvođača našeg mikrokontrolera. Pritisnite ST i idite na korak 2 (odabir mikrokontrolera), u kojem trebate odabrati određeni model. Imamo STM32F100RBT6B, pa kliknite na odgovarajući model:

Sa desne strane, prozor pomoći prikazuje kratke karakteristike svakog čipa. Nakon odabira mikrokontrolera koji nam je potreban, prelazimo na treći korak, korak 3 - odabiru potrebnih biblioteka za rad:

Kreirajmo jednostavan projekt za treptanje LED diode, kao što je uobičajeno za učenje mikrokontrolera.

Da bismo to uradili, potrebna nam je GPIO biblioteka, kada je omogućena, CoIDE će od vas tražiti da kreirate novi projekat. Kliknite na Da na ovom prijedlogu, naznačite mapu u kojoj će naš projekt biti pohranjen i njegov naziv. Istovremeno, CoIDE će na projekat povezati 3 druga potrebna za rad biblioteke, a takođe će kreirati svu potrebnu strukturu projekta:

Još jedna dobra stvar kod CoIDE-a je da ima mogućnost učitavanja primjera direktno u razvojno okruženje. Na kartici Komponente možete vidjeti da postoje primjeri za skoro svaku biblioteku, kliknite na GPIO (sa 4 primjera) i pogledajte ih:

Tamo možete dodati svoje primjere. Kao što možete vidjeti na slici iznad, primjeri već sadrže kod za treptanje GPIO_Blink LED. Možete kliknuti na dugme za dodavanje i on će biti dodan projektu, ali kao uključena datoteka, tako da ćemo to učiniti drugačije i jednostavno kopirati cijeli primjer koda u datoteku main.c. Jedina stvar je zamijeniti void GPIO_Blink(void) liniju sa int main(void). Dakle, pritisnite F7 (ili odaberite Project->Build iz menija) da kompajlirate projekat i... nema sreće!

Okruženju je potreban GCC kompajler, ali mi ga nemamo. Stoga idite na stranicu GNU Alati za ARM ugrađene procesore, odaberite svoj tip OS-a na desnoj strani i preuzmite najnoviju verziju lanca alata. Zatim pokrećemo datoteku i instaliramo gcc toolchain. Zatim ćemo u postavkama CoIDE naznačiti ispravan put do lanca alata:

Ponovo pritisnite F7 (Project->Build) i vidite da je kompilacija bila uspješna:

Ostaje samo da flešujete mikrokontroler. Da bismo to učinili, povezujemo našu ploču s računalom pomoću USB-a. Zatim, u postavkama za otklanjanje grešaka potrebno je da instalirate ST-Link; da biste to uradili, izaberite Project->Configuration u meniju i otvorite karticu Debugger. Odaberite ST-Link sa padajuće liste i zatvorite prozor:

Hajde da probamo da flešujemo MK. U meniju izaberite Flash->Program Download (ili kliknite na odgovarajuću ikonu na traci sa alatkama) i vidite da je MK uspešno flešovan:

Vidimo da trepće LED na tabli, mislim da nema smisla davati video ili fotografiju, jer... svi su to vidjeli.

Takođe, u CoIDE-u rade različiti načini otklanjanja grešaka; da to uradite, pritisnite CTRL+F5 (ili u meniju Debug->Debug):

To je sve. Kao što vidite, postavljanje i rad sa CoIDE je vrlo jednostavan. Nadam se da će vas ovaj članak potaknuti da proučavate vrlo obećavajuće i jeftine STM32 mikrokontrolere.

Jedan od razloga popularnosti mikrokontrolera STM32 proizvodnja STMicroelectronics– razne alate za razvoj i otklanjanje grešaka. Ovo se odnosi i na hardver i na softver. Moguće je kreirati i otklanjati greške rezidentni softver za STM32 bez materijalnih troškova uz pomoć kompleta besplatni programi. Članak daje pregled najznačajnijih alata za razvoj besplatnog softvera: ST MCU Finder, STM32CubeMX, SW4STM32, STM32 Studio.

Kompanija STMicroelectronics(ST) je najveći proizvođač mikrokontrolera na svijetu, a većina njih dolazi iz STM32 porodice. Prilikom razvoja novih linija kontrolera, STMicroelectronics teži nekoliko strateških ciljeva:

  • povećanje produktivnosti;
  • povećanje nivoa integracije: povećanje memorijskog kapaciteta, proširenje liste perifernih uređaja;
  • smanjenje potrošnje;
  • smanjenje troškova.

Svakom inženjeru je očigledno da se ovi ciljevi često međusobno isključuju. Iz tog razloga, STMicroelectronics proizvodi porodice i linije mikrokontrolera sa naglaskom na jedno ili drugo od gore navedenih svojstava. Trenutno asortiman uključuje deset porodica, od kojih svaka ima svoje prednosti i zauzima određenu nišu na tržištu (Slika 1).

Hajde da ukratko opišemo familije STM32 mikrokontrolera iz ST.

Mikrokontroleri male snage iz porodice STM32L. Ova grupa objedinjuje porodice fokusirane prvenstveno na postizanje minimalnog nivoa potrošnje. Za to se koriste različite metode: dinamička kontrola napona napajanja, fleksibilni sistem takta, specijalizovani periferni uređaji (LP-Timer, LP-UART), razvijeni sistem režima niske potrošnje itd.

Osnovne porodice STM32F0, STM32F1, STM32F3. Ova grupa uključuje porodice sa uravnoteženim karakteristikama i kompromisom u performansama/potrošnji/cijeni.

Zauzvrat, pojedinačni STMCube paketi uključuju:

  • hardverski nezavisne HAL biblioteke za rad sa hardverom mikrokontrolera;
  • biblioteke srednjeg nivoa. Na primjer, kao dio najnaprednijeg softverskog paketa STM32CubeF7 uključuje sljedeće biblioteke i stekove: CMSIS-RTOS baziran na FreeRTOS-u, TCP/IP stack baziran na LwIP-u, FAT sistem datoteka baziran na FatF-ovima sa podrškom za NAND Flash, StemWin - grafički stog baziran na SEGGER emWin-u, puni USB stog (host i uređaj) . Touch biblioteka za aplikacije na dodir je dostupna za brojne porodice;
  • primjeri i predlošci projekata za različita okruženja i komplete za otklanjanje grešaka (Discovery, Nucleo, Evaluation Boards).

Da biste razumeli kako komponente softverske platforme STM32Cube međusobno deluju, pogledajte primer prikazan na slici 9. U ovom primeru, korisnik konfiguriše mikrokontroler koristeći STM32CubeMX. Nakon završetka vizuelnog podešavanja (pinovi, taktiranje, itd.), STM32CubeMX generiše C kod, koristeći biblioteke iz softverskog paketa STM32CubeF4. Kao rezultat, korisnik dobija kompletan C projekat generisan za specifično integrisano razvojno okruženje: IAR™ EWARM, Keil™MDK-ARM, Atollic® TrueSTUDIO i AC6 System Workbench (SW4STM32). Ovaj projekat već uključuje sve potrebne biblioteke i datoteke.

Program STM32CubeMX uvelike pojednostavljuje rad programera, ali njegove mogućnosti nisu neograničene. Prije nego što krenete dalje, vrijedi napomenuti postojeća ograničenja:

  • generirani C kod pokriva samo konfiguraciju blokova i periferije mikrokontrolera. To znači da se algoritamski dio programa ne može generirati automatski, već će se morati dodati ručno;
  • STM32CubeMX će vam pomoći da kreirate samo početnu konfiguraciju. Ponekad tokom rada korisnik treba promijeniti radnu frekvenciju periferne jedinice ili promijeniti konfiguraciju izlaza. Sve ovo ćete morati sami propisati;
  • standardne biblioteke niskog nivoa (HAL i LL) i biblioteke srednjeg nivoa, na primer, StemWin ili STM32_USB_Device_Library, koriste se za generisanje koda;
  • Tokom procesa generisanja, C datoteka je izgrađena na način da se za korisnika dodjeljuju posebne sekcije u koje može smjestiti svoj kod. Ako je korisnički kod izvan ovog okvira, on će biti prepisan u narednim generacijama;
  • Postoje i druga ograničenja specifična za blok, o kojima bi trebalo detaljnije govoriti u STM32CubeMX priručniku.

Sada kada su opisani sastav, princip rada i ograničenja STM32CubeMX-a, možemo dati primjer rada s ovim programom, kreirati "kostur" jednostavnog projekta i demonstrirati rad pojedinačnih uslužnih programa.

Kreiranje jednostavnog programa pomoću STM32CubeMX

Pogledajmo bliže kreiranje kostura projekta u okruženju STM32CubeMX. Prvo morate preuzeti samo okruženje STM32CubeMX. Ovo se može učiniti potpuno besplatno na web stranici ST. Nakon instalacije, i sam STM32CubeMX i fascikle sa STM32Cube bibliotekama će se nalaziti na disku korisnika.

Proces kreiranja skeleta projekta odvija se u koracima.

Prvi korak. Preuzimanje trenutnih verzija biblioteka pomoću posebnog uslužnog programa. Da biste to uradili, prvo morate da konfigurišete mrežna podešavanja (Pomoć → Podešavanja ažuriranja), a zatim da pokrenete automatska ažuriranja (Pomoć → Proveri ažuriranja). Ako računar nije povezan na mrežu, moraćete ručno da ažurirate biblioteke.

Drugi korak. Nakon pokretanja STM32CubeMX na početnom ekranu ili u meniju „Datoteka“, potrebno je da kreirate novi projekat klikom na „Novi projekat“. Zatim, STM32CubeMX će od vas zatražiti da odaberete ciljnu platformu: kontroler sa navedenim parametrima ili ploču za otklanjanje grešaka. Slika 10 prikazuje, kao primjer, kako je ugrađena pretraga odabrala listu kontrolera prema sljedećim parametrima: STM32F4 porodica, TQFP100 paket, Flash volumen od najmanje 592 KB, RAM više od 214 KB.

Treći korak. U trećoj fazi, programer će morati da odredi svrhu pinova pomoću Čarobnjaka za pinove (slika 11). Ovaj uslužni program vam pomaže da kreirate potrebnu konfiguraciju i provjerite ima li grešaka. Vrijedi napomenuti zgodan sistem osvjetljenja, na primjer, igle sistema su obojene blijedo žutom bojom.

Četvrti korak. Sistem sata se konfiguriše pomoću kartice Konfiguracija sata (uslužni program Clock Wizard). U ovom slučaju korisnik radi sa vizualiziranim stablom sata (slika 12). Uz pomoć Clock Wizard-a možete odabrati izvor signala sistemskog takta, vrijednosti determinanti i množitelja, kao i izvore takta perifernih blokova u nekoliko klikova mišem. Ako ste kod napisali ručno, to bi zahtijevalo mnogo truda.

Korak peti. Kreiranje C koda počinje odabirom ciljnog okvira u postavkama projekta (Projekat → Postavke). Trenutno dostupno korisniku: IAR™ EWARM, Keil™MDK-ARM, Atollic® TrueSTUDIO i AC6 System Workbench (SW4STM32) (Slika 13). Zatim, na kartici Generator koda, treba da odlučite o sastavu biblioteka kopiranih u direktorijum projekta, postavkama za obradu korisničkog koda tokom regeneracije (na primer, spremanje ili brisanje), postavkama za korišćenje HAL-a (slika 13).

Za detaljnije postavke generatora idite na karticu Napredne postavke (Slika 14). Glavna karakteristika C-generatora u STM32CubeMX je mogućnost korištenja i HAL i LL drajvera. O ovoj tački treba detaljnije razgovarati.

HAL je skup apstraktnih drajvera koji pružaju maksimalnu međuplatformsku kompatibilnost među STM32 kontrolerima. U isto vrijeme, neki drajveri su apsolutno univerzalni (pogodni za sve STM32 kontrolere), dok su neki primjenjivi samo na pojedinačne linije s odgovarajućim perifernim blokovima (na primjer, blokovi šifriranja). Glavne prednosti HAL-a su:

  • maksimalna cross-platforma;
  • funkcionalna orijentacija. Ovi drajveri nisu dizajnirani za rad sa pojedinačnim blokovima kontrolera, već za obavljanje specifičnih zadataka. Ovo omogućava rad ne sa registrima, već sa smislenim funkcijama;
  • nije potrebno duboko poznavanje arhitekture mikrokontrolera.

Istovremeno, HAL ima i nedostatke: značajnu količinu koda, nedovoljnu optimizaciju izvršavanja zadataka i relativno niske performanse. Ako su ovi nedostaci kritični, onda treba koristiti LL drajvere.

API-ji niskog sloja (LL) su drajveri zavisni od hardvera koji vam omogućavaju direktan rad sa periferijama kontrolera, uključujući korišćenje inline funkcija i izvođenje atomskog pristupa registrima. Ovaj pristup ne zahtijeva značajne troškove memorije, funkcije su što je moguće kraće i brzinski efikasnije. Očigledni nedostaci LL drajvera su smanjena kompatibilnost koda pri prelasku s jednog kontrolera na drugi i potreba za dubinskim poznavanjem arhitekture kontrolera.

U okviru istog projekta na STM32CubeMX, možete istovremeno koristiti i HAL i LL, ali za različite periferne jedinice. Na primjer, slika 15 prikazuje postavke C-generatora, u kojem se LL drajveri koriste za UART/TIM/RTC, a HAL se koristi za preostale blokove.

Šesti korak. Nakon podešavanja projekta, trebalo bi da generišete kod tako što ćete otići na meni Projekat → Generiši kod. Kao rezultat toga, kostur projekta za navedeno razvojno okruženje će biti generiran u navedenom direktoriju projekta.

Ponekad postoji potreba za migracijom projekta s jedne platforme na drugu. Uz pomoć STM32CubeMX ovo se može uraditi uz minimalno vrijeme.

Migracija projekata koristeći STM32CubeMX

Za migraciju projekta s jedne platforme na drugu koristite dodatni uslužni program File → Import Project (Slika 15). Zahtijeva da navedete tip novog mikrokontrolera i način migracije. Nakon toga, program automatski generiše novi kod ili, ako postoji nepotpuna kompatibilnost kernela, ukazuje na poteškoće koje su nastale, pozivajući korisnika da ih eliminiše.

Nekompatibilnosti pronađene tokom migracije mogu se, ali ne moraju, popraviti. Fatalni slučaj nastaje kada se periferni sastav kontrolera značajno razlikuje. Na primjer, ranije je korišten Ethernet modul, koji nedostaje na novom MK-u (slika 15). Očigledno je da je u ovom slučaju migracija nemoguća.

Ali često je nekompatibilnost lokalne prirode, kada je, na primjer, potrebno samo rekonfigurirati parametre stabla takta tako da odgovaraju radnim frekvencijama, ili promijeniti broj ADC ili DMA kanala i tako dalje (slika 16). U takvim slučajevima, STM32CubeMX će ponuditi da izvrši migraciju ručno, eliminišući sve poteškoće koje nastanu uređivanjem projekta u gore navedenim uslužnim programima. U ovom slučaju, STM32CubeMX će signalizirati korisniku o postojanju problema dok se oni ne riješe.

Nakon što dobijemo konačni kostur projekta, ostaje samo dodati prilagođeni algoritamski dio koda, kompajlirati i otkloniti greške. U tu svrhu koriste se specijalizirana okruženja. AC6-ovo SW4STM32 okruženje za STM32 vam omogućava da to učinite potpuno besplatno.

AC6 System Workbench – besplatni IDE za STM32

Specijalni integrisani IDE su dizajnirani za uređivanje, kompajliranje i otklanjanje grešaka u programima. Većina njih su komercijalni proizvodi (IAR™ EWARM, Keil™MDK-ARM, Atollic® TrueSTUDIO i drugi), ali postoje i besplatni alati, kao što je AC6-ov System Workbench. Unutar STMicroelectronics sistema imenovanja, ovaj IDE se zove SW4STM32.

Integrisano okruženje SW4STM32 je dizajnirano za rad sa STM32 mikrokontrolerima. Zasnovan je na Eclipse platformi i besplatan je i međuplatformski. Njegove glavne prednosti su:

  • podrška za rad sa STM32 mikrokontrolerima, hardverskim kompletima za otklanjanje grešaka (STM32 Nucleo, Discovery i Evaluation boards), sa softverskim bibliotekama (Standard Peripheral library i STM32Cube HAL);
  • nema ograničenja u količini programskog koda;
  • besplatni GCC C/C++ kompajler;
  • besplatni GDB debugger (GNU projekat);
  • otvorena platforma Eclipse IDE sa podrškom za grupni razvoj ugrađenog softvera sa SVN/GIT sistemom kontrole verzija;
  • kompatibilnost sa Eclipse dodacima;
  • ST-LINK podrška;
  • multiplatforman i kompatibilan sa Windows®, Linux i OS X®.

Sa SW4STM32 možete uređivati, kompajlirati i otklanjati greške u STM32 programima. Da biste to učinili, zgodno je koristiti programske skelete kreirane u STM32CubeMX. Da biste ih uvezli, potrebno je izvršiti najjednostavnije operacije: odabrati meni Datoteka -> Import, dodijeliti tip uvoza “Postojeći projekti u radni prostor”, navesti direktorij projekta, odabrati sam projekt i kliknuti na Završi.

Kada radite sa projektima kreiranim u STM32CubeMX, trebali biste postaviti prilagođeni kod u posebne odjeljke:

/*KORISNIČKI KOD POČINJE…*/

/*KORISNIČKI KOD KRAJ…*/

Ovo se mora učiniti tako da prilikom ponovnog generisanja koda u STM32CubeMX, rukom pisani dio programa neće biti prepisan. Regeneracija je neophodna u dva slučaja:

  • prilikom rekonfiguracije korištenog MK-a;
  • prilikom migracije sa jednog MK na drugi.

Stoga, kada radi u kombinaciji sa STM32CubeMX + SW4STM32, korisnik može rekonfigurirati kontroler u bilo koje vrijeme i migrirati uz očuvanje korisničkog koda uz minimalno vrijeme.

Prilikom otklanjanja grešaka u programima u SW4STM32, dostupna je mogućnost širokog praćenja stanja memorije, registara i varijabli. Okruženje takođe ima podršku za tačke prekida (slika 17). Da biste započeli proces otklanjanja grešaka, potrebno je da kliknete na ikonu “Debug” (u obliku bube), odaberete tip projekta “Ac6 STM32 C/C++ Application”, definirate tip i sučelje za otklanjanje grešaka i kliknite na “OK” dugme.

SW4STM32 ima podršku za SVN/GIT sisteme kontrole verzija. Ovo je važno za velike projekte na kojima radi više programera. Sistem kontrole verzija vam omogućava da: registrujete sve promjene napravljene u projektu; uporediti verzije projekta; vratiti prethodne verzije; rješavanje sukoba kada više programera radi na jednom fajlu; održavati nekoliko verzija paralelno, i tako dalje.

U okviru ovog članka, nema smisla ulaziti u zamršenosti i razlike između SVN-a i GIT-a. Recimo samo da GIT, budući da je distribuirani sistem, omogućava programerima da rade lokalno, imajući kompletno spremište projekta na radnoj mašini. GIT također čuva metapodatke o promjenama, što olakšava spajanje verzija i prebacivanje između verzija. SVN zahtijeva mrežnu vezu između programera i čuva cijele datoteke. SW4STM32 pruža podršku za SVN i GIT.

Pogledajmo redosled akcija kada povezujemo projekat sa SVN (Slika 18).

  • u otvorenom projektu, kliknite desnim tasterom miša na njegovo ime u panelu direktorijuma i idite na Tim → Podeli projekat(e) (slika 18a);
  • izaberite tip SVN/GIT sistema i kliknite na “Next” (Slika 18b);
  • izaberite direktorijum za SVN i kliknite na “Next” (Slika 18c);
  • izaberite direktorijum za skladištenje projekta u SVN i kliknite na “Finish” (Slika 18d);
  • na kartici “General” (Slika 18e) izaberite SVN URL, oznaku spremišta, korisničko ime, lozinku, kliknite na “Dalje”;
  • unesite komentar za projekat, izaberite fajl koji će biti stavljen pod SVN kontrolu, kliknite na “OK” (Slika 18e).

U budućnosti, da biste sinhronizovali fajl ili ceo projekat, potrebno je da kliknete desnim tasterom miša na njegovo ime u panelu direktorijuma i izaberete Tim → Ureži. U prozoru koji se otvori napišite objašnjenje promjena i kliknite na “OK”.

Da biste onemogućili SVN, koristite komandu Tim → Prekini vezu.

Da biste uvezli projekat iz SVN-a, koristite komandu menija Uvoz → SVN → Projekat iz SVN-a. Zatim morate napraviti niz postavki uvoza u iskačućim dijaloškim okvirima.

SW4STM32 ima vrlo široke mogućnosti, ali okruženje ima i nedostatke koji su prilično tipični za slobodna okruženja:

  • nedostatak ugrađenog simulatora;
  • GCC kompajler je inferioran u odnosu na svoje komercijalne kolege u smislu veličine koda i performansi;
  • Podrška programera za SW4STM32 neće biti tako brza kao u slučaju plaćenih okruženja.

Međutim, vrijedno je napomenuti da ovi nedostaci možda nisu toliko kritični, posebno za jednostavne projekte.

Otklanjanje grešaka koda se može obaviti ne samo u SW4STM32, već i uz pomoć dodatnih alata. Pogledajmo neke od njih.

STMStudio - jednostavan način za otklanjanje grešaka u aplikacijama na STM32

STM Studio– vlasnički uslužni program koji proizvodi STMicroelectronics, koji pomaže u otklanjanju grešaka u programu i omogućava vam da pratite vrijednosti korisničkih varijabli prilikom izvršavanja koda u realnom vremenu. Ovaj program radi pod Windows OS-om i koristi ST-LINK debugger za komunikaciju s mikrokontrolerom.

STM Studio ima sljedeće karakteristike:

  • čitanje varijabli iz RAM-a „u hodu“, bez utjecaja na rad korisničkog programa;
  • korištenje izvršnih datoteka .elf, .out, .axf za uvoz varijabli;
  • prikaz varijabilnih vrijednosti u tabelarnom i grafičkom obliku;
  • grafički izlaz u obliku grafikona ili dijagrama;
  • mogućnost prikaza zavisnosti varijabli kada je jedna od varijabli iscrtana duž X-ose, a druga – duž Y-ose;
  • Evidentiranje podataka u datoteku za kasnije gledanje.

Prozor STM Studio se sastoji od nekoliko panela (slika 19).

Rad sa STM Studio-om počinje uvozom varijabli. Da biste to učinili, morate učitati istu izvršnu datoteku u program koji se nalazi u samom mikrokontroleru. Za to su pogodni sledeći formati, koji se generišu tokom kompilacije: .elf, .out, .axf. Zatim morate pokrenuti naredbu Fajl → Uvezi varijable. U dijaloškom okviru, prilikom odabira stavke „Proširi elemente tabele“, korisnik će moći ručno da izabere sve globalne varijable iz predložene tabele. Da biste započeli otklanjanje grešaka, morate izvršiti naredbu “Run”.

Kao što je već pomenuto, STM Studio vam omogućava da prikažete varijable u tri oblika: tekst, grafikon i grafikon (slika 20). Postavka tipa prikaza može se promijeniti u bilo kojem trenutku. Osim toga, svi podaci se dodatno evidentiraju u log fajl za dalju analizu. Zanimljiva karakteristika STM Studio-a je mogućnost prikazivanja zavisnosti nekih varijabli od drugih, kao i konstruisanja izraza iz varijabli.

Popularno sredstvo za prosljeđivanje informacija o otklanjanju grešaka je korištenje konzole i izlazne funkcije printf().

Implementacija printf() terminalnog izlaza preko USART-a

Korištenje standardne funkcije printf() jedna je od najpopularnijih metoda za izlaz informacija za otklanjanje grešaka. Koristeći ovu izlaznu funkciju, korisnik može prenijeti bilo koje podatke na konzolu ili terminal razvojnog okruženja. Većina integrisanih okruženja podržava ovu funkciju. Kada koristite STM32, postoje dva načina za implementaciju ove metode: tradicionalni, koristeći UART, i dodatni, preko SWO sučelja koristeći ST-LINK debugger. Implementacija svakog od njih je maksimalno pojednostavljena kada se koriste STM32CubeMX i SW4STM32.

Razmotrimo prvo prvu opciju implementacije - putem UART-a. Da biste to učinili, morat ćete izvršiti sljedeći niz radnji:

  • obezbediti hardversku vezu sa računarom;
  • konfigurisati UART u STM32CubeMX okruženju;
  • implementirajte samu funkciju printf() u SW4STM32 okruženje.

Povezivanje sa računarom se može izvršiti na tri načina: preko COM porta i RS-232 primopredajnog čipa; preko USB porta i UART-USB konvertorskog čipa (na primjer, FT232); koristeći ST-LINK USB interfejs za otklanjanje grešaka. Bez obzira na to koji je metod odabran, tada se mora konfigurirati hardverski UART.

Koristeći STM32CubeMX, UART konfiguracija se izvodi u nekoliko klikova (slika 21). Prvo, na kartici Čarobnjak za pinove, odgovarajući pinovi kontrolera se prebacuju u UART način rada. Zatim, na kartici „Konfiguracija“, konfigurišu se UART parametri: vrsta razmene, brzina, prisustvo stop bitova i tako dalje. Nakon toga, generira se C kod.

U okruženju SW4STM32, morate uključiti standardnu ​​biblioteku i definirati funkcije _io_putchar() i _write(), na primjer, ovako:

/*KORISNIČKI KOD POČETAK uključuje*/

#include

/*KRAJ KORISNIČKOG KODOVA Uključuje*/

/*KORISNIČKI KOD POČETAK 1*/

int __io_putchar(int ch)

c = ch & 0x00FF;

HAL_UART_Transmit(&huart2,&*c,1,10);

int _write(int datoteka, char *ptr, int len)

za (DataIdx = 0; DataIdx< len; DataIdx++)

Prednosti ovog pristupa prenošenju informacija o otklanjanju grešaka mogu se uzeti u obzir:

  • korištenje UART sučelja, koji je prisutan u svim STM32 mikrokontrolerima bez izuzetka;
  • jednostavnost podešavanja i poznavanje za programere. Možete koristiti stare razvojne projekte iz projekata s drugim kontrolerima;
  • nedostatak složenog hardvera (osim UART-USB mosta ili RS-232 primopredajnika);
  • nedostatak složenog softvera. Radi sa svim IDE ili terminalskim programima.

Međutim, ova metoda ima i nedostatke. Prvo, morat ćete žrtvovati UART kanal za otklanjanje grešaka. I drugo, takva implementacija utiče na rad kontrolera, budući da zauzima jezgro za obradu koda funkcije printf(). U slučaju STM32, postoji specijalizovanija, i što je najvažnije, jednostavnija metoda koja ne zauzima resurse mikrokontrolera - koristeći kombinaciju SWO i ST-LINK.

Implementacija printf() terminalnog izlaza preko SWO

Kada se koristi kombinacija SWO i ST-LINK, kreiranje terminala I/O je čak jednostavnije nego u metodi o kojoj je gore raspravljano sa hardverskim UART-om. U ovom slučaju komunikacija sa računarom se odvija preko SWO interfejsa i USB interfejsa koji se koristi u ST-LINK. Redoslijed radnji ostaje približno isti kao u prethodnom slučaju.

Prvo, koristeći STM32CubeMX, pinovi SWO interfejsa se konfigurišu u karticama „Čarobnjak za pinove“ i „Konfiguracija“ (Slika 22). Nakon toga, kod za razvojno okruženje se regeneriše.

Sljedeći korak je pisanje koda za __io_putchar(int ch) rukovalac, ovako:

/*KORISNIČKI KOD POČETAK 1*/

int __io_putchar(int ch)

ITM_SendChar(ch);

/*KORISNIČKI KOD KRAJ 1*/

Za otklanjanje grešaka zgodno je koristiti uslužni program STLink Utility (slika 23).

Prednosti metode:

  • ne zahtijeva dodatne resurse i ne zauzima komunikacione interfejse;
  • radi paralelno sa glavnim programom i ne utiče na brzinu njegovog izvršavanja, jer ne koristi kernel za proračune;
  • idealan izbor za setove za otklanjanje grešaka sa ST-LINK-om na ploči, jer predstavlja gotovo rešenje.

Među nedostacima ove metode implementacije može se primijetiti ovisnost o hardveru, jer je potreban ST-LINK.

Zaključak

STMicroelectronics proizvodi više od sedam stotina modela STM32 mikrokontrolera, koji se razlikuju po performansama/potrošnji/cijeni/nivou integracije. Svaki korisnik će moći odabrati optimalan model uzimajući u obzir zahtjeve određene aplikacije.

Važna prednost STM32 je prisustvo razvijenog sistema alata za otklanjanje grešaka. Više od stotinu ploča za otklanjanje grešaka (Nucleo, Discovery, Evaluation Boards) se nudi programerima. Još veća pomoć programerima će biti dostupnost kompletnog seta besplatnog aplikativnog softvera za kreiranje, kompajliranje i otklanjanje grešaka u programskom kodu:

ST MCU Finder je aplikacija za pametne telefone koja vam pomaže da odaberete najoptimalniji MCU za određenu aplikaciju;

STM32CubeMX je multi-platformski grafički uređivač za konfigurisanje STM32 mikrokontrolera i automatsko generisanje koda. STM32CubeMX također može pružiti pomoć u odabiru optimalnog mikrokontrolera, procjeni potrošnje energije i pojednostavljivanju migracije projekta između različitih MCU-ova.

SW4STM32 je multi-platformsko integrisano okruženje za razvoj softvera za STM32 mikrokontrolere.

STM32 Studio je uslužni program za praćenje i grafičko vizualiziranje vrijednosti varijabli tokom izvršavanja koda u realnom vremenu.

ST-LINK Utility vam omogućava, zajedno sa ST-Link programatorom, da unesete i pošaljete informacije o otklanjanju grešaka kroz SWO interfejs.

Ovaj set softvera vam omogućava da završite puni razvojni ciklus rezidentnog softvera bez trošenja jedne rublje.

Književnost

  1. Podaci. NUCLEO-XXXXKX. STM32 Nucleo-32 ploča. Rev 3. ST Microelectronics, 2016.
  2. Podaci. NUCLEO-XXXXRX. STM32 Nucleo-64 ploča. Rev 8. ST Microelectronics, 2016.
  3. Podaci. NUCLEO-XXXXZX. STM32 Nucleo-144 ploča. Rev 5. ST Microelectronics, 2017.
  4. UM1718. Uputstvo za upotrebu. STM32CubeMX za STM32 konfiguraciju i generisanje C koda za inicijalizaciju. Rev 18. ST Microelectronics, 2017.
  5. UM1884. Uputstvo za upotrebu. Opis STM32L4 HAL i drajvera niskog sloja. Rev 5. ST Microelectronics, 2016.
  6. UM1025. Uputstvo za upotrebu. Početak rada sa STM-STUDIO. Rev6. ST Microelectronics, 2013.
  7. UM0892.Korisnički priručnik STM32 ST-LINK opis pomoćnog softvera. Rev 22. ST Microelectronics, 2016.