Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • OS
  • Kursevi programiranja za stm32 mikrokontrolere za početnike. ARM

Kursevi programiranja za stm32 mikrokontrolere za početnike. ARM

Oni koji su upoznati sa osmobitnim kontrolerima kao što su AVR i PIC vjerovatno su svjesni tako neophodne stvari kao što je ugrađena EEPROM memorija. Omogućava vam da spremite neke podatke u njega, a zatim ih pročitate nakon isključivanja / uključivanja kontrolera. Ukratko, dugotrajna memorija. Prelazeći na STM32 kontrolere, bio sam iznenađen kada sam otkrio da oni jednostavno nemaju takvu memoriju! No, kako se kasnije pokazalo, postoje čak dvije alternative takvom sjećanju. Prvi je korištenje rezervne domene. Ovo nije potpuno trajna memorija, tako da se informacije ne unište nakon isključivanja glavnog napajanja, baterija mora biti spojena na određeni izlaz kontrolera (kao oni koji su u matičnim pločama). O tome ću detaljnije govoriti u sljedećem članku. A sada ćemo razmotriti drugi način nepromjenjivog skladištenja korisničkih podataka - fleš memoriju kontrolera.

DAC u STM32

DAC (ili DAC na buržoaski) je ADC upravo suprotno - on transformiše neke digitalne podatke u njihov analogni reprezentacija (očitavanje napona). Još jednostavnije rečeno, DAC će nam dozvoliti relativno glatko mijenjajte napon na nozi kontrolera. Područja praktično primjene: generiranje zvuka i signali proizvoljno forme. Možete zašrafiti SD karticu na kontroler i napraviti wav player. Performanse kontroler je svakako dovoljan, jer sam ovo radio i na AVR-u, a inace nemaju ugradjen DAC i ja smo se zajebali vanjski. Rad sa DAC vrlo jednostavno, a u ovom članku ću pokušati ispričati sve o čemu znam DACe u STM32. Na slici ispod - generiranje sinusa pomoću DAC:

PWM generacija u STM32

U prethodnom članku o osnovnim tajmerima još jednom smo treptali LED diodama, ali ovog puta ćemo ići mnogo dalje i pokušati pušiti kako natjerati STM32 kontroler da generiše PWM. Da bismo to učinili, morat ćemo koristiti jedan od tajmera opće namjene, jer oni imaju sve što je za to potrebno. Ostatak funkcionalnosti ovih tajmera je svakako impresivan, ali u mojoj praksi to još nije dobro došlo. Iako je moguće da će mi u budućnosti biti korisne takve korisne značajke kao što su funkcija brojanja vanjskih impulsa i mogućnost obrade okreta enkodera u hardveru. Ali za sada, pozabavimo se PWM-om. Postoji takav sklop od kontrolera, tri otpornika i RGB LED koji ćemo kontrolirati. Kontrola je da glatko osvetlite i ugasite svaku boju. Naravno, možete uzeti tri različite LED diode ako nema RGB.

Osnovni tajmeri u STM32

Tajmeri su takvi periferni uređaji STM32 kontrolera koji nam omogućavaju da vrlo precizno brojimo vremenske intervale. Ovo je možda jedna od najvažnijih i najčešće korištenih funkcija, ali postoje i druge. Trebali biste početi s činjenicom da u STM32 kontrolerima postoje tajmeri različitog stupnja hladnoće. Najjednostavniji su Basic tajmeri . Oni su dobri jer ih je vrlo lako konfigurirati i upravljati s minimalnim brojem registara. Sve što mogu da urade je da broje vremenske intervale i generišu prekide kada tajmer dostigne zadatu vrednost. Sljedeća grupa ( tajmeri opšte namene ) je mnogo hladniji od prvog, mogu generirati PWM, mogu brojati impulse koji dolaze do određenih nogu, možete spojiti enkoder itd. A najbolji tajmer je tajmer za naprednu kontrolu , mislim da ga neću koristiti jako dugo, jer još uvijek ne trebam kontrolirati trofazni elektromotor. Za početak upoznavanja sa tajmerima trebalo bi biti nešto jednostavnije, odlučio sam preuzeti osnovni tajmeri. Zadatak koji sam sebi postavio: Neka tajmer generiše prekide svake sekunde.

Prekidi u STM32

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

Zaista me je iznenadilo. Prema ovim člancima, programiranje nije potrebno čak ni za čitanje dokumentacije za programabilni kontroler. Učili su me mudrosti "hardversko programiranje" potpuno drugačije.

U ovom članku, put od fraze "Da, želim pokušati!" do radosnog namigivanja LED-a, biće mnogo duže 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 zanimljivo i onima koji su se dovoljno igrali sa Arduinom i žele se dočepati svih hardverskih mogućnosti željeza.

Izbor mikrokontrolera

Mnogi bi mogli 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 kada 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 porede različite vrste mikrokontrolera i zadaci koji se rešavaju uz njihovu pomoć. Na Habréu je, na primjer, postavljeno i ovo pitanje.

Pretpostavićemo da smo otkrili tip mikrokontrolera. Ali na tržištu postoji ogroman raspon različitih modifikacija različitih proizvođača. Razlikuju se na mnogo načina, od veličine fleš memorije do broja analognih ulaza. Za svaki zadatak, izbor treba napraviti pojedinačno. Ovdje nema općih preporuka i ne može biti. Samo ću napomenuti da je vrijedno započeti studiju s proizvođačima MK-a sa najvećim mogućim asortimanom. Zatim, pri odabiru MK-a za određeni zadatak, postoji prilično velika šansa da će vam nešto iz predstavljenog asortimana odgovarati.

Odlučio sam se za STM32(iako mislim da je bolje početi učiti sa MK od Texas Instruments - dokumentacija je vrlo dobro napisana), jer su oni široko rasprostranjeni među ruskim programerima elektronike. Ako imate problema ili pitanja, lako možete pronaći rješenja na forumima. Još jedan plus je bogat izbor demo ploča kako proizvođača tako i organizacija trećih strana.

Šta je potrebno za studiranje?

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

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

Svi primjeri će biti za ploču za otklanjanje grešaka STM32F4DISCOVERY. U ovoj fazi nam uopće neće biti važno što je ova ploča opremljena MK baziranim na Cortex-M4 jezgri. U bliskoj budućnosti nećemo koristiti njegove karakteristike i prednosti u odnosu na Cortex-M3. A kako će dalje biti - videćemo.

Ako imate bilo koju drugu ploču zasnovanu na STM32F2xx/STM32F4xx, možete raditi s njom. U prezentaciji materijala pokušat ću što detaljnije opisati. zašto mi to radimo na ovaj način, a ne drugačije. Nadam se da niko neće imati problema sa prenošenjem primera na drugi hardver.

Razvojno okruženje

Kao što je više puta spominjano, postoji dovoljan broj razvojnih okruženja za ARM mikrokontrolere, kako plaćenih, tako i ne toliko. I opet, želim 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 koristite u svojoj organizaciji) nešto drugo (Keil, Eclipse, CCS, CooCoc, itd.), onda vam ovo neće previše naštetiti. Posebnu pažnju obratiću na karakteristike vezane za razvojno okruženje.

Zašto plaćeno razvojno okruženje?

Možda neko neće biti potpuno zadovoljan činjenicom da predlažem korištenje plaćenog razvojnog okruženja, ali u IAR-u postoji mogućnost da dobijete privremenu licencu bez funkcionalnih ograničenja, ili neograničenu licencu s ograničenjem veličine koda (32KB za MK je lot).
Uz to, odmah ću napomenuti da za neke MK ne postoje besplatna razvojna okruženja. I nažalost, ovi MK-ovi su nezamjenjivi u nekim područjima.


Neću opisivati ​​proces instalacije.

Gdje početi?

Kreirajte projekat
Počnimo kreiranjem praznog projekta. IAR vam omogućava da kreirate projekte u ASM, C i C++. Koristićemo C.

Vidjet ćemo prazan projekat sa glavnim fajlom.

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

Kada se odabere ciljni programabilni procesor, učitava se njegov opis, što pruža obilje mogućnosti za otklanjanje grešaka (o tome će biti reč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 morate konfigurirati program za otklanjanje grešaka. Otklanjanje grešaka programa se odvija 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 integriran na STM32F4DISCOVERY ploči. Da biste radili sa programom za otklanjanje grešaka, morate izabrati njegov drajver u meniju Debugger->Setup->Driver. Takođe je potrebno naznačiti da se otklanjanje grešaka vrši direktno u hardveru. Da biste to učinili, postavite 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, ulivanje i otklanjanje grešaka).

"TK" za prvi projekat
da sumiramo: MK i debug board su odabrani, projekat je pripremljen. Vrijeme je da preuzmete zadatak.

Ne odstupajmo od klasike. Prvi projekat će biti trepćuća LED dioda. Na sreću, ima ih dosta na tabli.Šta to znači u smislu programiranja? Prvi korak je proučavanje dijagrama demo ploče i razumijevanje 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 kola sugerira da je za "upaljenje" LED-a potrebno 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 "TOR" za naš prvi program:
Program za MK treba da prenese stanje pina MK PD13 iz stanja "0" u stanje "1" i obrnuto sa određenom periodičnošću koja se razlikuje za ljudsko oko (važna napomena, ako treperite i LED diodu često to oko možda neće razlikovati).

Prije nego počnete programirati, ili malo teorije
Prije nego što nastavite sa implementacijom našeg TOR-a, potrebno je razumjeti kako se upravlja MC.

Počnimo s činjenicom da svaki MK uključuje jezgru, memoriju i periferne jedinice. Mislim da je sa pamćenjem sve jasno. Napomenuću samo da STM32 ima fleš memoriju u kojoj je pohranjen MK program (u opštem slučaju ovo nije tačna izjava, program se može pohraniti u vanjsku nepromjenjivu memoriju, ali za sada ćemo ovo izostaviti ) i druge podatke, uključujući korisničke podatke. Tu je i SRAM - random access memory.

Jezgra je dio mikrokontrolera koji izvršava jedan tok instrukcija. U našem MK, tip jezgre je Cortex-M4. MK jezgro se može uporediti sa procesorom u PC-u. Može samo izvršavati naredbe i prenositi podatke u druge blokove (ovo poređenje ne uzima u obzir procesore s integriranim grafičkim akceleratorima).
Istovremeno, proizvođač MK-a ne razvija kernel. Jezgro je kupljeno od ARM Limited. Glavna razlika između različitih MK-a je u periferiji.

Periferni blokovi - blokovi koji stupaju u interakciju sa "vanjskim svijetom" ili obavljaju specifične funkcije koje nisu dostupne MK jezgri. Moderni MK-ovi (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. Iz kernela je potrebno samo konfigurirati blok i dati mu podatke za prijenos. Nakon toga, kernel može nastaviti s izvršavanjem instrukcija. Na ramenima periferne jedinice leži kontrola odgovarajućeg izlaza MK za prenos podataka u skladu sa protokolom. Sama periferna jedinica prevodi izlaz MK-a 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 u narednim postovima). Sa stanovišta kernela, ovo je samo komad memorije sa specifičnom adresom, to jednostavno nije tako. Upisivanje podataka u poseban registar je ekvivalentno slanju 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 upisa podataka u poseban registar i naknadnog čitanja, možete dobiti potpuno drugačije podatke. Na primjer, prosljeđivanje podataka u UART blok za slanje i čitanje podataka koje je blok primio od vanjskog uređaja, vrši se pomoću istog registra.

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

Zapamtite C
Ako ste guru C jezika, slobodno preskočite ovaj odjeljak. 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 adresu u memoriji

Pretpostavimo da smo čitajući opis periferne jedinice shvatili da je za njen ispravan rad potrebno u nju upisati broj 0x3B. Adresa posebnog registra 0x60004012. Registar je 32-bitni.
Ako odmah ne znate kako to učiniti, pokušat ću opisati lanac razmišljanja kako bih dobio pravu naredbu.

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

(dugo nepotpisano*)(0x60004012)

Dakle, imamo pokazivač na element. Sada morate upisati potrebnu vrijednost ovom elementu. Ovo se radi dereferenciranjem pokazivača. Tako dobijamo ispravnu naredbu:

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

Postavljanje proizvoljnih bitova na 1

Pretpostavimo da želimo da postavimo bitove 7 i 1 na adresu 0x60004012 na "1" bez promjene vrijednosti svih ostalih bitova u registru. Da biste to učinili, morate koristiti binarnu operaciju |. Daću ti tačan odgovor:

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

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

Postavljanje proizvoljnih bitova na 0

Pretpostavimo da želimo da postavimo bitove 7 i 1 na adresu 0x60004012 na "0" bez promjene vrijednosti svih ostalih bitova u registru. Da biste to učinili, morate koristiti binarni operator &. Daću ti 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 od karakteristika MK programa koje je važno zapamtiti. Stvari su prilično očigledne, ali ipak.
Programu nema kraja
Za razliku od većine PC programa, MK program nikada ne bi trebao završiti, NIKADA! I šta će tačno MC morati da uradi nakon završetka vašeg programa? Pitanje je praktično retoričko. Stoga, ne zaboravite pripaziti da ne zaboravite vječnu petlju. Ako želite, možete staviti MK u stanje mirovanja.
Koristite cjelobrojne varijable
Iako koristimo Cortex-M4 mikrokontroler koji izvodi operacije s pomičnim zarezom u hardveru, savjetujem vam da ih prestanete koristiti. U MK-u 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. Naišao sam na biblioteke koje imaju "sporo curenje" memorije. Bilo je vrlo frustrirajuće kada je, nakon nekoliko sedmica stabilnog rada, MK visio s 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. Mnogo stranica, ali pročitajte ih sve ćao nema potrebe. Kao što je već spomenuto, većina dokumentacije je opis perifernih jedinica i njihovih registara. Takođe želim da vam skrenem pažnju na činjenicu da je ovaj Referentni priručnik napisan ne za jedan MK, već za nekoliko redova. Ovo sugerira da će kod biti prenosiv prilikom prebacivanja na druge MK-ove u ovim redovima (osim ako, naravno, ne pokušate koristiti periferne jedinice koje nisu u korištenom MK-u).

Prije svega, morate odlučiti s kojim blokovima ćete raditi. Za to je dovoljno proučiti sekcije Uvod i glavne karakteristike.

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

Ovaj put nam neće trebati nikakvi drugi periferni blokovi.

Periferna kontrola sata
Kako bi se smanjila potrošnja energije MC-a, gotovo sve periferne jedinice se isključuju nakon što se MC uključi. Jedinica se uključuje/isključuje primjenom/zaustavljanjem signala sata na svom ulazu. Za ispravan rad potrebno je konfigurirati sat kontroler MCU-a tako da potrebna periferna jedinica prima signal takta.
Bitan: Periferna jedinica se ne može pokrenuti odmah nakon što se uključi signal sata. Potrebno je sačekati nekoliko ciklusa dok se ne "pokrene". Ljudi koji koriste biblioteke za periferne uređaje često nisu ni svjesni ove funkcije.

Registri su odgovorni za omogućavanje takta perifernih jedinica Registar za omogućavanje perifernog sata RCC XXX.U poziciji XXX mogu se koristiti gume AHB1, AHB2, AHB3, APB1 i APB2. Nakon pažljivog proučavanja opisa odgovarajućih registara, možemo zaključiti da je taktiranje GPIOD periferne jedinice omogućeno postavljanjem "1" na 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 imaju želju, ovaj dio ću detaljnije obraditi u jednom od sljedećih članaka.

Određivanje adresa posebnih registara
Određivanje adresa posebnih registara mora početi čitanjem odjeljka memorijska mapa u Referentnom priručniku. Možete vidjeti da svaki blok ima svoj dio adresnog prostora. Na primjer, za RCC blok, ovo je odjeljak 0x4002 3800 - 0x4002 3BFF:

Da biste dobili adresu registra, potrebno je početnoj vrijednosti dodati adresni prostor RCC bloka adr. offsetželjeni registar. Odstupanje adrese naznačeno u opisu registra (pogledajte snimak ekrana iznad).

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

GPIO blok
Za opšti uvod u GPIO blok, toplo preporučujem da pročitate relevantni odeljak Referentnog priručnika u celosti. Dok ne možete obratiti puno pažnje Alternativni način rada. Ostavićemo to za kasnije.

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

Radni režim
Prije svega, potrebno je postaviti način rada 13. pina 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šavanja koja su nam potrebna, potrebno je upisati vrijednost 01b na 26-27 bita registra GPIOx_MODER. Adresa registra se može odrediti istim metodom 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 na push-pull ili open-drain
  • Registar izlazne brzine GPIO porta (GPIOx_OSPEEDR)- podesite brzinu izlaza
Ove parametre nećemo mijenjati, jer smo prilično zadovoljni zadanim vrijednostima.
Postavljanje vrijednosti na pin MK
Konačno, došli smo do trenutka kontrole izlaznog stanja MK-a. Postoje dva načina za postavljanje izlazne vrijednosti na određeni pin MK-a.

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

Upisivanje "0" ili "1" u bitove 0-16 rezultira odgovarajućom promjenom stanja pinova porta. Da biste postavili određenu vrijednost na izlazu jednog ili više pinova MK-a, a ne promijenili stanje ostalih, bit će potrebno koristiti operaciju modifikacije pojedinačnih bitova. Takva operacija se izvodi u najmanje 3 ciklusa. Ako je potrebno upisati 1 u neke bitove, a 0 u druge, tada će biti potrebna najmanje 4 ciklusa. Ova metoda se najbolje koristi za preokretanje stanja izlaza ako njegovo izvorno stanje nije poznato.

GPIO port bita set/reset registar (GPIOx_BSRR)

Za razliku od prethodne metode, pisanje 0 u bilo koji od bitova u ovom registru neće učiniti ništa (i zaista, svi bitovi su samo za pisanje!). Upisivanje 1 u bitove 0-15 će postaviti "1" na odgovarajući izlaz MK-a. Upisivanje 1 u bitove 16-31 će postaviti "0" na odgovarajući izlaz MK. Ova metoda je poželjnija od prethodne ako je potrebno postaviti određenu vrijednost na "MK" pin, a ne mijenjati je.

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 kompajlirati ( Projekt->Kompiliraj) i ispunite ( Projekt->Preuzmi->Preuzmi aktivnu aplikaciju). Ili počnite otklanjati greške ( Project->Dpwnload i Debug) i pokrenite izvršavanje (F5).
LED je uključen!
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 od 1000000 u kašnjenju odabrana je eksperimentalno tako da je period treptanja LED diode bio vidljiv oku, ali ne predug.
Optimizacija algoritma
Nedostatak odabranog pristupa treptanjem LED-a je što MK jezgra većinu vremena provodi u praznim ciklusima, iako bi mogla učiniti nešto korisno (u našem primjeru nema drugih zadataka, ali će se pojaviti u budućnosti).

Da bi se ovo izbeglo, obično se koristi brojač ciklusa, a stanje MK pina se menja 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 period treptanja LED-a (ili period izvršenja 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 u hardveru. Sve izgleda otprilike isto kao i otklanjanje grešaka u PC aplikaciji. Postoji način izvršavanja korak po korak, ulazak u funkciju, pregled vrijednosti varijabli (U načinu za otklanjanje grešaka Pogled->Gledati->Gledati 1/4).

Ali osim toga, postoji mogućnost pregleda vrijednosti registara kernela, posebnih registara perifernih jedinica (View-> Register) itd.
Toplo preporučujem da se upoznate sa karakteristikama 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 MK programiranju moraju uraditi ručnim kopanjem po dokumentaciji, samostalno određivanjem potrebnih registara i bitnih polja. U budućnosti ovo ne možete koristiti, ali morate biti u mogućnosti.
Evo samo nekoliko razloga za ovu tvrdnju:
  • Ponekad postoje greške u bibliotekama proizvođača! Jednom sam zamalo propustio rok projekta zbog ovoga. Čip sam lemio nekoliko puta, misleći da sam oštetio kristal tokom lemljenja (to se dešavalo ranije). A problem je bio što je adresa posebnog registra pogrešno upisana u biblioteku. Obično se to dešava sa MK ili MK linijama koje su upravo puštene 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 netu, ali to nije uključeno u standardni set proizvođača.
  • Drajveri perifernih jedinica nekih proizvođača su toliko neoptimizirani da je potrebno do 20 ciklusa da se promijeni stanje pina pomoću biblioteke. 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 čitaju imaju želju, pokušaću da nastavim seriju članaka. Možda neko ima ideje o temama koje bi se mogle pokriti - volio bih ih čuti.

STM32 sat sistem.

Danas ćemo pričati o sistemu taktiranja mikrokontrolera STM 32. Ako još uvijek ne znate šta je sat, frekvencija i niste uopće dotakli sistem takta prije,. Iako se na ovom linku govori o sistemu taktiranja mikrokontrolera AVR, koncepti definisani u lekciji referencom su takođe primenljivi na sistem taktiranja mikrokontrolera STM 32.

Pa počnimo!

Razmotrit ćemo sistem taktiranja na primjeru mikrokontrolera STM 32F 303VCT 6, koji je instaliran u STM 32 F 3 DISCOVERY ploči za otklanjanje grešaka.

Pogledajmo opštu strukturu sistema taktiranja:

Kao što vidimo, sistem taktiranja STM 32 je za red veličine komplikovaniji od sistema taktiranja mikrokontrolera. AVR, uprkos činjenici da Slika prikazuje samo njen glavni dio.

Hajde da to shvatimo!

Dijagram treba gledati s lijeva na desno. Prvo, moramo odabrati glavni izvor takta kontrolera. Mi ćemo birati između HSI i HSE.

HSE-Vanjski visokofrekventni generator. Izvor takta za njega je eksterni taktni signal (Ulazna frekvencija), koji, kao što vidimo iz dijagrama, može biti od 4 do 32 MHz. To može biti kvarcni rezonator, generator takta i tako dalje.

HSI - Interni visokofrekventni generator. U mikrokontrolerima STM 32 F 3 je RC kolo sa frekvencijom od 8 MHz. Preciznost je mnogo niža od eksternog HSE generatora.

Svaki od ovih izvora takta može biti povezan PLL. Međutim, prije nego što se unese u PLL, signal iz HSI će biti smanjen za faktor 2. HSE signal se zauzvrat može primijeniti na PLL bez promjena, ili se može smanjiti za određeni broj puta, na zahtjev korisnika.

PLL sat - Phase Locked Loop System (PLL). Omogućava vam da pomnožite ulazni HSI ili HSE signal sa potrebnim brojem puta.

Sa PLL-om, signal se može dovesti do sistemske magistrale, čija je maksimalna frekvencija 72MHz. Ili, HSE ili HSI signal se može primijeniti direktno na sistemsku sabirnicu, tj. bez PLL konverzije.

Sistemski sat, SYSCLK, prati sve glavne magistrale mikrokontrolera, kroz odgovarajuće razdjelnike, kao što vidimo na dijagramu iznad. Imajte na umu da je maksimalna brzina takta nekih sabirnica ispod SYSCLK. Stoga, prije primjene taktnog signala SYSCLK na sabirnicu, trebate ga podijeliti odgovarajućim razdjelnikom. Ako se to ne učini, mikrokontroler će se zamrznuti.

Za podešavanje takta možete pribjeći ručnom uređivanju registara ili koristiti funkcije biblioteke. Koristićemo biblioteku.

Postavite našu ploču za otklanjanje grešaka STM 32 F 3 DISCOVERY za rad sa frekvencijom takta od 72 MHz.

Kreirajmo i postavimo projekat u Keil uVision. .

Dodajmo sljedeći kod:

#include "stm32f30x_gpio.h" #include "stm32f30x_rcc.h" void InitRCC() ( RCC_HSEConfig(RCC_HSE_ON); //Omogući HSE while(RCC_GetFlagStatus(RCC_FLAG_HSERDY); //=Zakasni HSE REFLAG_HSERDY) ->ACR |= FLASH_ACR_PRFTBE; FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); FLASH->ACR |= (uint32_t)((uint8_t)0x02); RCC_PREDCIV1Config/PREDIVPRED(1)PREDIV1Config1); = 1 RCC_PLLConfig(RCC_PLLSource_PREDIV1,RCC_PLLMul_9);//Postavite PREDIV1 kao izvor za PLL,i postavite PLLMUL=9 RCC_PLLCmd(ENABLE);//Omogućite PLL dok(RCC_GetFlagStatus(RCC_GetFlagStatus(RCC_GetFlagStatus)(RCC_GetFlagStatus(RCC_GetFlagStatus)(RCC_GetFlagStatus)(RCC_GetFlagStatus)(RCC_GetFlagStatus) za PLLCC_FLAG_PLL)/RSKLLAG) RCC_SYSCLKSource_PLLCLK);//Postavi PLL kao SYSCLK Soucre RCC_HSICmd(DISABLE);//Onemogući HSI ) int main(void) ( RCC_ClocksTypeDef RCC_Clocks; InitRCC(); RCC_GetClocksClocksFreqs (); RCC_GetClocksFreqs ();

#include "stm32f30x_gpio.h"

#include "stm32f30x_rcc.h"

void InitRCC()

RCC_HSEConfig(RCC_HSE_ON) ; //Omogući HSE

while (RCC_GetFlagStatus (RCC_FLAG_HSERDY) == RESET) ; //Čekajući HSE

//Podešavanje kašnjenja flasha

FLASH -> ACR |= FLASH_ACR_PRFTBE ;

FLASH -> ACR &= (uint32_t ) ((uint32_t ) ~ FLASH_ACR_LATENCY ) ;

FLASH -> ACR |= (uint32_t) ((uint8_t) 0x02) ;

RCC_PREDIV1Config (RCC_PREDIV1_Div1) ; //PREDIV 1 Razdjelnik = 1

RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9) ; //Postavi PREDIV1 kao izvor za PLL i postavi PLLMUL=9

RCC_PLLCmd(ENABLE) ; //Omogući PLL

while (RCC_GetFlagStatus (RCC_FLAG_PLLRDY) == RESET) ; //Čeka se PLL

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK) ; //Postavi PLL kao SYSCLK Soucre

RCC_HSICmd(DISABLE) ; //Onemogući HSI

int main(void)

RCC_ClocksTypeDef RCC_Clocks ;

initRCC();

RCC_GetClocksFreq(&RCC_Clocks) ;

NOP () ;

dok (1)

U glavnoj funkciji, struktura je deklarirana RCC _ ClocksTypeDef. Ova struktura sadrži polja koja odražavaju trenutnu frekvenciju takta određenih dijelova kontrolera.

Tada se funkcija InitRCC poziva u glavnoj funkciji, koja postavlja sat kontrolera. Razmotrimo to detaljnije.

tim RCC _ HSEConfig (RCC _ HSE _ ON ), Omogućavamo HSE. Potrebno je vrijeme da se omogući, tako da morate pričekati dok se zastavica ne postavi RCC _ ZASTAVA _ HSERDY . Radimo to u petlji dok (RCC _ GetFlagStatus (RCC _ ZASTAVA _ HSERDY ) == RESETOVATI ) .

Zatim podešavamo kašnjenje blica. Ovo se mora uraditi kada sistemska magistrala radi na frekvencijama iznad 36 MHz!

Nakon postavljanja odgode, odaberite PLL predskalera. tim RCC _ PREDIV 1 Config (RCC _ PREDIV 1_ Div 1) postavljamo predskaler na 1. Sa naredbom RCC _ PLLConfig (RCC _ PLLSource _ PREDIV 1, RCC _ PLLMul _9 ) odaberite HSE kao izvor frekvencije za PLL i odaberite množenje od 9. Ostaje samo uključiti PLL naredbom RCC _ PLLCmd (OMOGUĆI ), i sačekajte da se zastavica postavi RCC _ ZASTAVA _ PLLRDY,u while petlji. Na taj način obezbjeđujemo potrebno vremensko kašnjenje za uključivanje PLL-a. Nakon toga naredbom biramo PLL kao izvor sistemske frekvencije SYSCLK RCC _ SYSCLKConfig (RCC _ SYSCLKSource _ PLLCLK ). Preskalere sabirnice nećemo dirati, tako da će sabirnice AHB, APB 1, APB 2 raditi na frekvencijama od 72,36 i 72 MHz, respektivno.

Ostaje samo isključiti interni RC lanac komandom RCC _ HSICmd (ONEMOGUĆI ).

Nakon izvršavanja funkcije InitRCC, u glavnom ciklusu firmvera, popunite strukturu RCC _ ClocksTypeDef, što će nam omogućiti da znamo da li smo ispravno konfigurisali sistem sata. Radimo to kao tim RCC_GetClocksFreq(&RCC_Clocks).

Možete vidjeti vrijednosti sata kontrolera u načinu za otklanjanje grešaka postavljanjem tačke prekida na komandi __ NOP () što znači prazna komanda. Ova naredba se često dodaje radi lakšeg otklanjanja grešaka.

Povezivanje ploče za otklanjanje grešaka STM32 F3 DISCOVERY, sastavite firmver, flešujte ploču i konačno uđite u režim za otklanjanje grešaka pritiskom na dugme Start / Stop debug session (Ctrl + F 5). Postavljanjem tačke prekida na funkciji __ NOP, i dodajući strukturu RCC _Clocks u Watch , pokrećemo izvršavanje firmvera pritiskom na F 5. Kao rezultat, vidimo:

Frekvencije su ispravno podešene, a mikrokontroler sada radi na 72 MHz.

Dakle, kao što ste naučili iz današnjeg tutorijala, sistem sata STM 32 je dovoljno moćan i fleksibilan da zadovolji potrebe vaših projekata. Odvojite vrijeme da ga postavite - postići ćete odlične rezultate!

Hvala vam na pažnji! Vaša pitanja kao i obično u komentarima!

Svako kopiranje, reprodukcija, citiranje materijala ili njegovih dijelova dozvoljeno je samo uz pismenu saglasnost administracije MKPROG .RU. Nezakonito kopiranje, citiranje, umnožavanje je kažnjivo po zakonu!

Ovaj članak, koji predstavlja još jedan "brzi početak" u savladavanju ARM kontrolera, može vam pomoći da napravite prve korake u savladavanju 32-bitnih ARM kontrolera baziranih na Cortex-M3 jezgri - STM32F1xxx serije. Možda će ovaj članak (koji se pojavljuje na ovu temu kao gljive nakon kiše) nekome biti koristan.

Uvod

Zašto ARM?
1. Ima mnogo toga za izabrati (više od 240 ARM kontrolera danas proizvode različiti proizvođači)
2. Niska cijena (na primjer, za 1 USD možete dobiti 37xI/O, 16K Flash, 4K RAM, 2xUART, 10x12bitADC, 6x16bitPWM).

I počnimo naš rad sa ST Microelectronics kontrolerima. Kontrolere bazirane na ARM Cortex-M3 jezgri karakteriše širok spektar perifernih uređaja, visoke performanse, niska cijena
P.S. Na samom početku se čini da su ARM-ovi nekakva strašna (u lemljenju, ožičenju, programiranju) stvorenja, ali to je samo na prvi pogled :) i uvjerit ćete se sami.

Dakle, proučavat ćemo ARM-ove koristeći STM32F1 kontrolere kao primjer. Istovremeno, ova serija ima nekoliko linija:

  • Linija vrijednosti STM32F100 - 24 MHz CPU, kontrola motora, CEC.
  • Pristupna linija STM32F101 - 36 MHz CPU, do 1 MB Flash
  • USB pristupna linija STM32F102 - 48 MHz CPU sa USB FS
  • Performansna linija STM32F103 - 72 MHz, do 1 MB Flash, kontrola motora, USB, CAN
  • Linija povezivanja STM32F105/107 - 72 MHz CPU, Ethernet MAC, CAN, USB 2.0 OTG

Postoji i sljedeća klasifikacija:

STM32 kontroleri mogu biti prisiljeni da se pokrenu iz 3 memorijska područja (u zavisnosti od stanja pinova BOOT0 i BOOT1 kada se kontroler pokrene ili nakon što se resetuje). Možete napisati program u memoriju kontrolera na sljedeće načine:

1 način:
Koristeći bootloader (već je upisan u sistemsku memoriju) i USART1(USART2 preslikan): Koristi interni takt od 8 MHz. Da biste pokrenuli ugrađeni bootloader, spojen na kontroler od strane proizvođača, dovoljno je samo baciti signal iz RS232-3.3V pretvarača (na primjer, baziran na FT232RL) na noge kontrolera TX1, RX1 i postaviti BOOT0 = 1 i BOOT1 = 0 prije toga, pritisnite RESET i možemo ušiti program u kontroler. I ušiven je u program Flash Loader Demonstartor iz STM-a (za Windows).

PS. Ako koristite LINUX i nemate ploču za otklanjanje grešaka tipa otkrivanja, možete učitati firmver na kontroler preko svog omiljenog rs-232 (zapravo preko rs-232-3.3V pretvarača). Da biste to učinili, trebate koristiti python skriptu (Ivan A-R) (za LINUX ili MACOSX).
Da biste započeli, morate imati instaliran Python 2.6 i PySerial biblioteku za rad sa serijskim portom.
Sada, da biste pokrenuli skriptu stmloader.py (naravno sa terminala), morate je malo podesiti za svoj računar: otvorite je u uređivaču teksta.
Ukucavamo u komandnoj liniji
~$dmesg | grep tty
da vidite sve serijske portove računara.
i nakon kucanja...
~$ setserial -g /dev/ttyS
saznajemo put do naše 232. luke. Ako sistem opsuje na setserial, instalirajte ga
~$ sudo apt-get install setserial
saznajemo put do našeg fizičkog porta (na primjer, moj je /dev/ttyS0). Sada morate napisati ovu putanju do datoteke skripte stm32loader.py umjesto zadanog "/dev/tty.usbserial-...". Ukucavamo terminal
~$ python stm32loader.py -h
...da pozovemo pomoć i učitamo firmver na naš kontroler.

2 način:
Preko USB-a OTG koji koristi DFU način rada zahtijeva eksterni kristal na 8 MHz, 14,7456 MHz ili 25 MHz (nemaju svi kontroleri sa USB OTG-om ovaj bootloader, trebali biste pažljivo pogledati oznake vašeg kontrolera)

3 način:
JTAG/SWD. Pa, za one koji imaju demo ploču tipa Discovery ili JTAG/SWD programator koji je sam napravio, možete učitati kod i već na ovaj način otkloniti greške u svom mikrokontroleru. Za JTAG, mikrokontroler ima 6 šapa (TRST, TDI, TMS, TCK, TDO, RST) + 2 za napajanje. SWD koristi 4 signala (SWDIO, SWCLK SWO, RESET) i 2 za napajanje.

PS. U okruženju EAGLE, skicirao sam nekoliko nacrta za 48, 64 i 100 stopa kontrolera (fascikla eagle), a stm32loader sadrži skriptu stm32loader.py

Ja sam još jedan diplomac nekog moskovskog univerziteta (neću precizirati koji, ali osrednji). Prije šest mjeseci rečeno nam je da je vrijeme za pisanje diplome. Tada sam tek počeo da savladavam mikrokontrolere i nije mi bilo tako lako, ali sa škripom koju frižider proizvodi kada ga, sam, pokušaš lagano pomerati a da ne oštetiš dragoceni laminat (u mom slučaju linoleum) .

Moja obuka je počela kada sam se prije dvije godine zainteresovao za temu mikrokontrolera i inženjer koji je pitao za njih dao mi je ploču 300x200mm i rekao da sadrži kontroler STM32F217ZGT6 i da ova ploča ima sve što je potrebno za obuku. „Općenito, ako savladate, sve ostalo će izgledati kao smeće“ (on, međutim, nije rekao da da biste treperili LED, morate konfigurisati SPI, za koji tada nisam ni čuo). Nakon tri ne baš intenzivna mjeseca eteričnih pokušaja, uviđanja slabosti programiranja i ogromnog broja pročitanih članaka, ipak sam morao da izdvojim novac za STM32VLDISCOVERY i način kopiranja programa i eksperimentiranja s njima, stvari su konačno krenule, ali ipak polako .

Godinu i po dana sam uspevao da radim kao programer, tražio sam radna mesta gde rade sa STM32 (pošto mislim da su to sada najperspektivniji mikrokontroleri u svojoj klasi), stekao sam iskustvo i kada je u pitanju diplomu, sjetio sam se svojih bolnih kurje oko. Ideja sa temom je došla odmah: "Plača za otklanjanje grešaka na STM32 i (puni) kurs obuke (za najmanje) za nju."

Zato sam htela da napišem kompletan i kompletan kurs, kako drugi ne bi patili i sami shvatili. Dakle, došavši u institut i shvativši da je potreban podsticaj za brzo savladavanje i razumijevanje (tačnije, tako dobar štipanje), počeo sam se tući petom u prsa (kopati sebi grob), da ću ne samo da napišem kurs za obuku (na našem univerzitetu sam morao da pozovem njegovog metodološkog vodiča), već ću obezbediti i radni izgled. Tema je prihvaćena, zadatak je napisan (iskopao grob, naručio nadgrobni spomenik), do malog je bilo, da se sve napiše i razvije (da legne u grob, ukopa se i postavi spomenik).

Život je pokazao da nikako nisam imao šest mjeseci, ali svo vrijeme predviđeno za diplomu je bilo skoro gotovo, vrlo brzo odbrana, ali začudo, sve je ne samo spremno, već i gotovo 100% testirano (na živim ljudima uključujući i ).

Izlaz je sljedeći:

1. Sam kurs (naučno-metodološki vodič)

Ukratko, možemo reći da je po mom mišljenju i prema recenzijama testera, punopravan, ali malo grub i nedovršen. Pošto sam odlučio da neću pisati udžbenik o C programiranju, u kursu nema objašnjenja operatora, zbog čega su rekli da je na nekim mestima kurs oštar. Što se tiče nerazvijenosti, bit ću iskren, nisam uspio sve otkloniti prije isporuke da bih o tome pisao ne samo ovdje, već i u metodološkom priručniku za isporuku. I ja mislim da može i bolje, ali o tome kasnije.

2. Ploča za otklanjanje grešaka na STM32F103RET6 kontroleru

Ovdje je sve malo bolje nego u prvom pasusu, ploča je dizajnirana, naručena (zbog okolnosti morao sam hitno naručiti) u Rezonitu, komponente su naručene, zalemljene sa ručkama (da budem iskrena, nijedan video neće prenijeti osjećaj prvog LQFP64 lemljenja) i testiran (većina je odmah proradila). Ali ovo je raspored i, naravno, nije bilo bez preklopa: ožičenja, adaptera i drugih raznih "štaka", ali, nažalost, neću imati vremena da naručim drugu reviziju, a vjerovatno i ne bih, da branim diploma, siguran sam da je to dovoljno. U nastavku ću govoriti detaljnije o ovoj ploči za otklanjanje grešaka.

Kada sam se prvi put zaposlio kao dizajner elektronike, naišao sam na zanimljivo mišljenje koje je, kako se pokazalo, prilično uobičajeno. Ovo mišljenje je zvučalo otprilike ovako: "Evo ja sam programer i programiram mikrokontrolere, ne poznajem kola i ne želim da znam, usput, ne znam ni da lemim." Nakon razgovora sa grupom programera van kompanije, shvatio sam da osoba iz mog posla nije daleko od usamljenosti po svom mišljenju, i iako je ne podržavam, vrijedi razumjeti i poštovati mišljenja drugih, tim više savršeno se uklapaju u tadašnji koncept ploče za otklanjanje grešaka „sve na brodu“. U tom smislu, ploča se pokazala prilično "debela", zvala se STM32SB (SB-StudyBoard) V1.0b. Hajde da pogledamo šta je uključeno u nastavku.

1. Mikrokontroler
Na osnovu činjenice da sam radio sa mikrokontrolerom STM32F103RET6, izabran je za projekat.

2. Krug napajanja i hardverski USB kontroler
Ovaj mikrokontroler ima ugrađen USB za koji je odlučeno da se dovede na poseban konektor.

3. Zvučnik
Odlučeno je da se uvede PWM modulacija za savladavanje i učenje pisanja melodija.

4. Digitalni indikator i otpornik za prebacivanje
Za simultani razvoj dinamičke indikacije i registra pomaka, odlučeno je da se kombinuju.

5. LED diode
LED diode, šta bi moglo biti bolje? Samo trobojne LED diode, na kojima možete savladati glatku promjenu boja.

6. LCD ekran
Standardni LCD ekran sa 2 reda po 16 karaktera za savladavanje paralelnog interfejsa.

7. Tastatura
Matrix tastatura, morate znati i umjeti.

8. Proširivač I/O porta
Nema mnogo I/O portova, ali ovdje možete savladati i I2C.

9. Elektronski termometar
1-Wire temperaturni senzor, korisna stvar i dragocjeno iskustvo s njim može dobro doći.

10. Elektronski potenciometar
Na ovoj maloj stvari možete savladati punopravni SPI i pokušati izmjeriti promjene napona kroz ADC.

11. Relej
Iako je na nivou treptanja LED diode, ipak je lijepo čuti poznati klik, zar ne?

12. Ključni tranzistori
Također na nivou treptanja LED diode, ali odjednom neko ne razumije princip.

13. Dupliranje slobodnih pinova na vanjskim pinovima
Pa, ovo je prirodan dizajn za bilo koju ploču za otklanjanje grešaka, odjednom sve što je u njoj nije bilo korisno nikome, ali ipak morate povezati nešto svoje.

14. WIFI-UART pretvarač (esp8266)
U kolu pretvarač sudjeluje kao konektor, ovdje je također naznačeno. Koristi se već prilično senzacionalan esp8266 modul.

15. USB u UART konverter
USB je uvijek cool, ovdje se koristi CP2102 čip.

16. JTAG i SWD
Pa kuda bez ovih stvari.

Ovako široka paleta vanjskih uređaja omogućit će vam da savladate većinu trikova i pokušate raditi s većinom sučelja bez zamaranja kupovinom elemenata i bez napuštanja stola, što je u skladu s konceptom ne samo „sve na brodu“. “, ali i “za najmanje” (one koji ne mogu lemiti).

Naravno, bilo je nekih preklapanja, ali, kako kaže jedan prijatelj inženjer, "vještina inženjera mjeri se brojem izrezanih traka na prvoj iteraciji ploče."

Evo liste mojih "jambova", koje nisam primetio, zaboravio ili nisam ni znao kada sam razvijao ovu ploču:

1. Shvatio sam da su pinovi SWD locirani u čudnom redoslijedu, a to barem ne ometa rad ploče. Čuo sam, po mom mišljenju, ispravno mišljenje da ih treba postaviti onako kako se nalaze na STM32VLDISCOVERY kako bi se izbjegli nesporazumi sa novim korisnikom.

2. Ne isplati se povezivati ​​jednobojne LED diode, kao na ovoj ploči, zbog činjenice da da biste ih treperili, morate remapovati JTAG, ali sam dobio neočekivani efekat označavanja procesa učitavanja firmvera.

3. Dizajnirao sam svoj logo za ovu ploču, koji sam htio prevesti u PCB i postaviti na ploču, ali sam zaboravio.

4. Da uštedim prostor u drugoj reviziji ploče, postavio bih neke neiskorištene SMD komponente na donju stranu ploče.

5. Shvatio sam da bi za praktičnije ožičenje krugova s ​​kvarcnim rezonatorima bilo zgodno zamijeniti ih SMD-om.

6. Zaboravio sam da se potpišem gdje su JTAG i SWD, također ne pokazuju kako ih povezati, a ako nije sve tako teško za JTAG i njegov BH-20 konektor, onda je situacija sa SWD nešto opasnija.

7. Prilikom razvijanja otiska LCD-a, dogodio se incident i rupe su bile premale za M3 vijke.

8. CP2102 pretvarač ima RX i TX pinove obrnute. Pošto sam navikao da dokumentacija daje primjer povezivanja u odnosu na mikrokontroler, a ne na vanjski uređaj, morao sam isjeći 2 staze.

9. Na ovoj ploči razmak između priključaka nije standardiziran u inčima, pa stoga postoji problem za spajanje na ploču za prototipove bez lemljenja tako što se zalijepi u nju.

10. Pojavio se prekrivač sa otpornicima za ograničavanje struje u krugu indikacije releja, ispostavilo se da je vrijednost previsoka da bi se relej prebacio.

11. Pa, kao i obično, "dobra misao dolazi poslije." Dakle, nakon što sam dobio ploču, shvatio sam da je vrijedno napraviti njenu veličinu prikladnom za barem neki slučaj - očigledno će morati da se doradi u drugoj reviziji.

12. U početku je postavljen mali digitalni indikator, pošto je zauzimao malu površinu i bio je dostupan u prodavnicama, ali se ispostavilo da je u stvari dostupan svuda kada se naruči od 520 komada, pa sam morao da oblikujem adapter za standardni digitalni indikator.

Na kraju ću vam pokazati 3D model ove ploče:

I da uporedimo njenu fotografiju, kako je ispalo "uživo", pogled odozgo:

I pogled sa strane, tako da možete vidjeti više "štaka":

Izvinite, ali ne bih želeo da iznosim ceo projekat pre polaganja diplome, ali nakon ovog rada, imao sam pitanje da li se isplati razvijati ovaj projekat? Pala mi je ideja da napišem seriju članaka o obuci, gdje bi bio predstavljen jedan tako punopravni kurs na ovoj debug ploči, gdje je sve napisano jednostavnim riječima i objašnjeno na prste. Volio bih da čujem od vas u komentarima koliko bi to bilo korisno i potrebno u ovom trenutku.

Hvala vam na pažnji!

Top Related Articles