Opis vezivanja stm32 i upute za programiranje. Spajanje COG LCD zaslona na ST7565R kontroler

Činilo bi se jednostavnom temom, ali u komentarima sam bio preplavljen pitanjima o tome kako spojiti mikrokontroler. Kako spojiti LED, gumb, napajanje na njega. Što učiniti s AGND ili AREF. Zašto je to potrebno? AVCC i takve stvari. Dakle, pošto ima pitanja, to znači da tema nije jasna i potrebno je dati što iscrpniji odgovor. Opisujem sve za AVR kontrolere, ali za neke PIC sve je vrlo, vrlo slično. Jer ovdje su principi isti.

Prehrana
Za rad mikrokontroleru je potrebna energija – električna energija. Da biste to učinili, naravno, morate pokrenuti feed o njemu. MK napon napajanja Atmel AVR varira od 1.8 prije 5 volta, ovisno o seriji i modelu. svi AVR može raditi od 5 volti (ako postoje čisto niskonaponske serije, pojasnite u komentarima, jer takve nisam vidio). Stoga ćemo pretpostaviti da je napon napajanja našeg regulatora uvijek oko 5 volti. Plus napona napajanja obično se označava kao Vcc. Nulti terminal (kao i Zemlja, Kućište i kako god ga zovu) je označen GND. Ako kao primjer uzmemo napajanje računala. Zatim je crna žica GND (usput, žica za uzemljenje je tradicionalno obojena u crno), a crvena je +5, što će biti naše Vcc. Ako ćete mikrokontroler napajati iz baterija, tada ćemo minus baterija uzeti kao GND, i plus za Vcc(glavno je da je napon napajanja iz baterija unutar navedenih granica za određeni MK, problem je u podatkovnoj tablici. Parametar je obično napisan na prvoj stranici u Opći opis karakteristike:

Radni naponi
–1,8 — 5,5 V (ATtiny2313V)
–2,7 — 5,5 V (ATtiny2313)
Ocjene brzine
–ATtiny2313V: 0 - 4 MHz pri 1,8 - 5,5 V, 0 - 10 MHz pri 2,7 - 5,5 V
–ATtiny2313: 0 – 10 MHz pri 2,7 – 5,5 V, 0 – 20 MHz pri 4,5 – 5,5 V

Imajte na umu da postoje posebne niskonaponske serije (na primjer 2313V niskonaponske) u kojima je donja granica opskrbnog napona mnogo niža. Također je vrijedno obratiti pozornost na sljedeću točku o frekvencijama. Ovo pokazuje ovisnost maksimalne frekvencije o naponu napajanja. Vidi se da su kod niskog napona granične frekvencije niže. Niskonaponske serije su dva puta sporije od svojih visokonaponskih analoga. No, svi su procesori podložni overklokiranju ;))))

Za rad sa serijskim regulatorima AVR Dovoljna je samo hrana. Na sve ulaze Vcc trebate primijeniti naših 5 (ili što god imate) volti i sve ulaze GND mora se posaditi na zemlju. Mikrokontroler može imati mnogo ulaza Vcc i mnogo ulaza GND(pogotovo ako je u kvadratu TQFP tijelo. Koja sa svih strana viri pitalovo). Mnogi pinovi nisu napravljeni radi lakšeg postavljanja, već u svrhu ravnomjernog napajanja kristala sa svih strana, tako da unutarnji strujni krugovi nisu preopterećeni. U suprotnom zamislite da ste priključili napajanje samo s jedne strane, a s druge strane čipa objesili LED diodu na svaku liniju porta i upalili ih odjednom. Unutarnja tankoslojna sabirnica napajanja, izbezumljena takvim trenutnim opterećenjem, isparila je, a procesor je IZNENADA krenuo i, naizgled bez vidljivog razloga, odbacio kopita. Tako SVI Vcc i GND IZLAZI MORAJU BITI SPOJENI. Spojite ih na odgovarajući način i uključite.

Postavljaju se određena pitanja AGND I AVCC- Ovo je analogno uzemljenje i napajanje za analogno-digitalni pretvarač. ADC je vrlo precizan mjerač napona, pa ga je preporučljivo napajati preko dodatnih filtara kako smetnje, koje nisu rijetke u klasičnom strujnom krugu, ne bi utjecale na kvalitetu mjerenja. U tu svrhu se u preciznim sklopovima uzemljenje dijeli na digitalno i analogno (moraju biti spojeni samo u jednoj točki), a na AVCC napon se dovodi kroz filtersku prigušnicu. Ako ne planirate koristiti ADC ili ne namjeravate napraviti točna mjerenja, tada je sasvim prihvatljivo AVCC primijenite istih 5 volti kao na Vcc, A AGND posaditi na isto tlo kao i svi ostali. Ali morate ih spojiti!!! EMNIP iz AVCC-a također napaja priključak A.

Upozorenje!!!

Čini se da čip Mega8 ima grešku na razini topologije čipa - Vcc i AVcc su međusobno povezani unutar čipa. Otpor između njih je oko (!!!) 5 Ohma.Za usporedbu, u ATmega16 i ATmega168 između Vcc i AVcc otpor je nekoliko desetaka MEGA ohma! U podatkovnoj tablici još uvijek nema naznaka u vezi s tim, ali u jednoj od tema iz 2004. na AVRFreaks-u rečeno je da su ljudi udarali glavama o digitalnoj buci ADC-a, a zatim su pisali Atmel podršci govoreći WTF??? A oni, kažu, postoji greška u čipu i Vcc i AVcc su povezani unutar kristala. U svjetlu ovih informacija, mislim da je postavljanje gasa na AVcc za Mega8 praktički beskorisno. Ali AVcc se u svakom slučaju mora napajati - tko zna koliko je moćna ova interna veza?

Najjednostavniji dijagram povezivanja za AVR mikrokontroler prikazan je u nastavku:

Kao što vidite, strujnom krugu je dodana prigušnica AVCC, kao i kondenzatori. Dobra je praksa staviti keramički kondenzator od sto nanofarada između Vcc I GND svaki mikro krug (a ako mikro krug ima mnogo ulaza napajanja i uzemljenja, onda između svakog napajanja i svakog uzemljenja) što je moguće bliže izlazima napajanja - izgladit će šum kratkih impulsa u sabirnici napajanja uzrokovan radom digitalni sklopovi. Kondenzator od 47 mKF u strujnom krugu ublažit će dublje udare napona. Kondenzator između AVcc I GND dodatno će smiriti prehranu ADC.

Ulaz AREF ovo je ulaz referentnog napona ADC. Općenito, možete primijeniti napon u odnosu na koji će se izračunati ADC, ali se obično koristi bilo koji unutarnji izvor referentni napon na 2,56 volti, ili napon na AVCC, dakle na AREF Preporuča se objesiti kondenzator, što će malo poboljšati kvalitetu referentnog napona ADC(a primjerenost izlaznih očitanja ovisi o kvaliteti potpore ADC).

Reset krug
Otpornik uključen RESETIRANJE. Općenito u AVR ima vlastiti unutarnji krug za resetiranje i signal RESETIRANJE iznutra je već povučen otpornikom od 100 kOhm na Vcc. ALI! Zatezanje je toliko loše da mikrokontroler hvata reset od svakog kihanja. Na primjer, od dodirivanja noge prstom RST, ili čak samo od dodirivanja prsta uz naknadu. Stoga se toplo preporučuje RST povucite do napajanja s otpornikom od 10k. Manje ne vrijedi, jer... tada postoji mogućnost da programator unutar kruga neće moći prevladati ovo zatezanje i neće biti moguće bljeskati MK unutar kruga. 10k je taman.

Postoji i ova shema resetiranja:

Ono što ga čini izvanrednim je to što se, kada se krug uključi, kondenzator isprazni i napon RST blizu nule - mikrokontroler se ne pokreće, jer mu kontinuirano resetiranje. Ali s vremenom, kroz otpornik, kondenzator će se napuniti i napon će biti RST dosegne log1 - MK će se pokrenuti. Pa, gumb vam omogućuje prisilno resetiranje ako je potrebno.

Kašnjenje će biti približno T=R*C za ovaj primjer - oko sekunde. Zašto ovo kašnjenje? Da, barem tako da se MK ne pokrene prije nego što se svi uređaji na ploči napajaju i dođu u stabilno stanje. U starim MK ( AT89S51, na primjer) bez takvog lanca koji omogućuje početno resetiranje, MK se možda uopće neće pokrenuti.

Uglavnom, u AVR Odgoda početka, ako je potrebno, može se izvršiti programski - smanjite ga na pola sekunde prije početka aktivnih radnji. Dakle, Conder se može baciti. A dugme... kako god hoćeš. Trebate li vanjski? RESETIRANJE? Onda ostavi to. Obično ga ostavim.

Izvor sata
Generator takta srce je mikrokontrolera. Za svaki impuls, neka vrsta operacije događa se unutar kontrolera - podaci se šalju kroz registre i sabirnice, pinovi porta se prebacuju, mjerači vremena se klikaju. Što je veća frekvencija takta, MK brže obavlja svoje radnje i troši više energije (prebacivanje logičkih vrata zahtijeva energiju, što se češće prebacuju, potrebno je više energije).

Impulse postavlja generator takta ugrađen u mikrokontroler. Međutim, može postojati i vanjski generator, sve je vrlo fleksibilno konfigurirano! Brzina kojom unutarnji generator otkucava ovisi o postavkama mikrokontrolera i kabelskog svežnja.


Generator može biti:

  • Unutarnji s unutarnjim glavnim RC krugom.
    U ovom slučaju vezivanje uopće nije potrebno! A pinovi XTAL1 i XTAL2 se uopće ne mogu spojiti ili se mogu koristiti kao obični ulazno/izlazni portovi (ako MK to dopušta). Obično možete odabrati jednu od 4 unutarnje vrijednosti frekvencije. Ovaj je način rada postavljen prema zadanim postavkama.
  • Unutarnji s vanjskim glavnim RC krugom.
    Ovdje ćete morati spojiti kondenzator i otpornik izvan mikrokontrolera. Omogućuje presvlačenje u pokretu taktna frekvencija, jednostavnim podešavanjem vrijednosti otpornika.
  • Unutarnji s vanjskim glavnim kvarcom.
    Vani su postavljeni kvarcni rezonator i par kondenzatora. Ako je kvarc niske frekvencije (do 1 MHz), tada kondenzatori nisu instalirani.
  • Vanjski.
    S nekog drugog uređaja pravokutni signal šalje se na ulaz MK, koji postavlja sat. Ovaj način je koristan, na primjer, ako nam je potrebno nekoliko mikrokontrolera da rade u strogoj sinkronizaciji iz jednog generatora.

Različite sheme imaju različite prednosti:
Kada unutarnji RC krugŠtedimo prostor na ploči, ne trebamo dodatne dijelove, ali ne možemo postići maksimalnu frekvenciju, a frekvencija malo ovisi o temperaturi i može varirati.

Vanjski kvarc ima izvrsnu točnost, ali košta dodatnih 15 rubalja i zahtijeva dodatne dijelove i, što je najuvredljivije, često pojede nekoliko I/O nogu. Također na vanjskom kvarcu možete postići maksimalne performanse od MK. Frekvencija MC određena je frekvencijom na koju je odabrani kvarc naoštren. Vanjski RC krug omogućuje MK oscilatoru da otkucava brže od internog, košta manje od kvarca, ali ima iste probleme sa stabilnošću frekvencije kao i interni RC krug.

Metode za taktiranje MK opisane su u podatkovnoj tablici u odjeljku Sat sustava i opcije sata i u potpunosti su određeni konfiguracijom Bitovi osigurača. U međuvremenu, toplo preporučujem NE DIRAJTE OSIGURAČ dok ne budete sigurni što radite i zašto. Jer Postavljanjem nečega krivo, možete vrlo brzo pretvoriti mikrokontroler u komad beskorisnog silicija, vratiti ga u život bit će vrlo teško (ali moguće!)

Spajanje LED dioda i gumba na mikrokontroler
Sam po sebi, bez interakcije s vanjskim svijetom, mikrokontroler nije zanimljiv - koga briga što kucka unutra? Ali ako to nekako možete prikazati ili utjecati na to...

Dakle, gumb i LED spojeni su na sljedeći način:


Za tipku, trebate spojiti odabranu I/O nogu preko tipke na masu. Sam izlaz mora biti konfiguriran kao ulaz s povlačenjem(DDRxy=0 PORTxy=1). Zatim, kada tipka nije pritisnuta, preko otpornika za povlačenje, ulaz će visoka razina napon, a od bita PINhu pri očitavanju će dati 1. Ako se pritisne tipka, ulaz će se spojiti na masu, a napon na njemu će pasti na nulu, što znači PINxyČitat će se 0. Na temelju nula u bitovima registra PINx znamo da su gumbi pritisnuti.

Isprekidana linija prikazuje dodatni otpornik za povlačenje. Unatoč činjenici da se pull-up može spojiti na priključak unutar AVR-a, on je prilično slab - 100 kOhm. To znači da se lako može prikovati za tlo smetnjama ili smetnjama, što će izazvati lažni alarm. A ovi unutarnji pull-up otpornici jako vole gorjeti od smetnji. Već imam desetak mikrokontrolera s isključenim PullUp otpornicima. Sve radi, ali nema zatezanja - izgorjelo je. Vani objesite otpornik i on radi kao da se ništa nije dogodilo. Stoga, za kritične krugove, toplo preporučujem dodavanje vanjskog pull-up-a od 10 kOhm - čak i ako je unutarnji pokriven, vanjski će poslužiti. Tijekom procesa učenja, možete zaboraviti na ovo.

Dioda koja emitira svjetlo povezuje se s portom na dva načina. Prema shemi Portland ili Port Power. U prvom slučaju, da biste zapalili diodu, trebate poslati visoku razinu na port log1 (približno jednak Vcc). U drugom slučaju, da biste zapalili diodu, morate poslati log0 na priključak - niska razina (blizu nule). Za AVRČini se da nema razlike, ali mnoge starije serije mikrokontrolera povukle su se mnogo bolje nego gore, tako da je sklop Port-Power češći. Koristim obje sheme na temelju pogodnosti PCB izgleda. Pa, na razini softvera nema velike razlike.
Mora biti konfiguriran pin priključka za rad s LED-om Izlaz(DDRxy=1) i tada će, ovisno o vrijednosti u PORTxy, pin imati ili visoku ili nisku razinu napona.

Dioda koja emitira svjetlo moraju biti spojeni preko otpornika. Činjenica je da je izravni otpor LED-a vrlo mali. A ako ne ograničite struju kroz njega, onda može jednostavno izgorjeti. Ili, što je vjerojatnije, spaliti pin mikrokontrolera, koji, usput, može izvući nešto poput 20-30 mA. A da bi normalna LED svijetlila (sada ne razmatramo sve vrste, ova čudovišta mogu pojesti ampere) potrebno vam je oko 3...15 mA.

Dakle, na brzinu, smatramo:

  • Napon na izlazu MK noge je oko 5 volti, pad napona na LED-u je obično oko 2,5 volta (ne može biti veći, inače će dioda potrošiti više struje nego što je potrebno i prigušiti se, ispuštajući prekrasan dim)
  • Dakle, napon koji granični otpornik mora preuzeti bit će 5-2,5 = 2,5 V.
  • Treba nam struja od 5 mA - nema smisla hraniti LED, treba nam indikacija, a ne osvjetljenje :)
  • R=U/I= 2,5/5E-3 = 500 Ohma. Najbliži u nizu je 510 Ohma. Uzmimo ga. U principu možete namjestiti od 220 Ohma do 680 Ohma što vam padne pod ruku - normalno će gorjeti.

Ako trebate spojiti više LED dioda, svaka ima svoj otpornik. Naravno, možete biti pohlepni i staviti jedan otpornik za sve. Ali ovdje će biti šteta - samo je jedan otpornik, ali ima mnogo dioda! Prema tome, što više dioda palimo, to će svaka primiti manje struje - struja s jednog otpornika podijelit će se na četiri. Ali ne možete staviti manji otpornik - jer kada se upali jedna dioda, ona će primiti dio struje za četiri i zalijepiti peraje zajedno (ili spaliti port).

Nekoliko nedoumica u dizajnu sklopova ili nekoliko riječi o štednji pinova

Ono što se ne može zalemiti mora se programirati. (C) narodna mudrost.

Često se događa da se čini da je memorija kontrolera više nego dovoljna za zadatak, a performanse su prekomjerne, ali nema dovoljno nogu. Dakle, morate instalirati redundantni i skuplji mikrokontroler samo zato što jednostavno ima više pinova. Pokazat ću vam nekoliko primjera kako to učiniti kompliciranijim programski kod uštedjeti na hardveru.

Kamen temeljac takvih ušteda obično je načelo dinamičkog odvajanja dodjele pinova tijekom vremena. To jest, na primjer, izlaz može raditi na bilo kojoj sabirnici, a kada sabirnica nije aktivna, onda preko istog izlaza možete provjeriti stanje tipke, ili prenijeti nešto preko druge sabirnice. Brzim (desetke ili čak tisuće puta u sekundi) prebacivanjem između dva različita zadatka, možete postići učinak "istovremenog rada".

Ovdje je glavna stvar slijediti dva pravila:

  • Dvije različite aplikacije ne smiju ometati jedna drugu, tj. Vremensko odvajanje mora biti konstruirano na takav način da susjedna funkcija ne iskrivljuje rezultat funkcije koja se ispituje.
  • Ni pod kojim okolnostima razine napona ne smiju biti u sukobu.

Dat ću vam primjer:

  • Imamo pin na koji je obješen izlaz iz određenog senzora i gumb. Izlaz senzora može biti 0, 1 u aktivnom načinu rada i Hi-Z kada signal Enable ne stigne do senzora.
  • Gumb daje čvrstu 0 liniji kroz kratki spoj.

Kako bi trebao funkcionirati:
Recimo da većinu vremena imamo ulaz mikrokontrolera konfiguriran za Hi-Z ulaz i uzimamo očitanja sa senzora na koji se također primjenjuje Enable signal. Kada trebamo prozvati gumb, oduzimamo Enable senzoru i njegovi izlazi prelaze u Hi-Z način rada i ne ometaju nas. Prebacujemo izlaz mikrokontrolera u Pull-Up mod i provjeravamo postoji li nula na ulazu - signal pritisnute tipke. Jeste li provjerili? Prebacujemo MK ulaz na Hi-Z ulaz i ponovno primjenjujemo Enable na senzor. I tako mnogo puta u sekundi.

Ovdje imamo dvije kontradikcije:

  • Logička kontradikcija
    0 na liniji može biti u dva slučaja od senzora ili od gumba. Ali u ovom slučaju, koristeći zdrav razum i potrebnu funkcionalnost, možemo zanemariti logičku kontradikciju.

    Samo ćemo znati da pritisak na gumb iskrivljuje očitanja senzora, što znači da kada senzor radi, nećemo pritisnuti gumb. A kako se očitanja senzora ne bi zamijenila za pritisak gumba, jednostavno ne prozivamo gumb u trenutku kada čekamo podatke od senzora. Naravno, to neće zaštititi od glupih radnji. Ali da pojednostavim primjer, sada ne uzimam u obzir besprijekornu zaštitu.

  • Električna kontradikcija
    Ako senzor postavi 1, a mi pritisnemo tipku, onda je očito da se GND i Vcc u istoj žici neće slagati i netko će umrijeti. U u ovom slučaju izlaz senzora će umrijeti, jer je slabiji - nema načina da se krhki tranzistor natječe s bakrenim gumbom.

    Takva se kontradikcija ne može riješiti organizacijskim metodama - nemoguće je okom odrediti napon na liniji i odlučiti treba li pritisnuti gumb ili ne. A gdje je sad program može se samo nagađati. Stoga ćemo to riješiti shematski.
    Dodajmo otpornik krugu gumba, otpornik je mali, izračunat na temelju maksimalne struje najslabijeg priključka linije.

    Ako, na primjer, izlaz senzora ne može dati više od 10 mA, tada trebamo otpornik takav da struja kroz njega od Vcc do GND ne prelazi ovu vrijednost. S napajanjem od 5 volti to će biti 510 ohma. Sada, čak i ako postoji log1, visoka razina na liniji sa strane senzora, tada pritisak na tipku neće čak uzrokovati izobličenje logičke razine jer otpornik je dizajniran uzimajući u obzir maksimalno opterećenje priključka

Primjer je ispao malo kaotičan, ali mislim da je bit jasna. Želim da vidite i razumijete ne samo kako se to radi, već i zašto se to radi :)

Pa, nekoliko primjera nekoliko funkcija na jednoj nozi:
Prvo, ISP priključak. Odavno sam zaboravio kako je to gurati mikrokontroler prvo u programatorski blok, zatim u pločicu, pa natrag, i tako mnogo puta dok ne debugujete program. Na pločici mi strši 6 pinova ISP konektora i kod debugiranja mi je programator uvijek uključen u pločicu, a program ponekad mijenjam nekoliko puta svakih 10 minuta. Pitao sam i provjerio. Ne radi? Ispravio sam ga, reflašnuo opet... I tako dok ne proradi. MK-ov resurs za flashanje izračunava se tisućama puta. Ali ISP priključak jede pinove. Čak 3 komada - MOSI, MIŠO, SCK.

U principu, možete također pričvrstiti gumbe na ove igle. U ovom slučaju, nitko nikome neće smetati, glavna stvar je da ne pritisnete ove gumbe tijekom firmware-a. Također možete objesiti LED diode (iako u ovom slučaju najjednostavniji možda neće uspjeti, ali dobro obavljeno!) Tada će prilikom bljeskanja firmvera treperiti vrlo veselo :)))

Također možete objesiti nešto drugo na liniji ispod ISP-a, glavna stvar je tako da prilikom flashanja firmware-a ovo NEŠTO odjednom ne počne biti čudno. Na primjer, kontrola manipulatora od 100 kilograma visi na liniji ISP-a i tijekom firmwarea je primio hrpu ludih podataka - tako da može poludjeti i nekome razbiti glavu. Treba razmišljati općenito. Ali s nečim što radi preko sučelja sabirnice, radit će sljedeća shema:

Prebacujemo izlaz s 0 na 1 i uključujemo gornju i donju diodu. Ako trebamo oba svijetliti, tada jednostavno prebacimo izlaz mikrokontrolera u mod Bok-Z i kao da ga nema, a diode će gorjeti s prolaznom strujom. Ili brzo prebacite diode jedna na drugu, u tom slučaju će obje gorjeti na oko. Nedostatak sklopa je očit - diode se ne mogu ugasiti. Ali ako bi, prema planu, barem jedan trebao gorjeti, zašto ne? UPD: Onda sam pomislio da je moguće odabrati LED diode i otpornike tako da njihov ukupni pad napona bude na razini napona napajanja, a ukupni otpornici u ovom slučaju će dovesti struju do tako male razine da kada je noga u Hi- Z, diode uopće neće svijetliti. Barem oku to uopće neće biti vidljivo. Osim u mrklom mraku.

Sljedeća opcija ne štedi noge, ali vam omogućuje da pojednostavite izgled tiskane ploče bez povlačenja sabirnice za napajanje ili uzemljenje na dvije diode:

A primjenom slične taktike na gumbe, možete ili pojednostaviti ožičenje ili rasporediti 6 gumba duž tri noge.
I ovdje je sve jednostavno - jedna noga podiže, druga ga kosi na zemlju. Pritiskom na gumb dolazi do pada napona na poteznoj nozi. Program to osjeti i ispituje svaki gumb redom. Zatim se mijenjaju uloge nogu i bira se sljedeći gumb.

U načinu rada sa šest tipki situacija je slična - jedna noga diže, druga tlo, a treća se pretvara da je Hi-Z krpa i ne reflektira. Ali postoji jedna nuspojava. Na primjer, tražimo gumb "B". Da bismo to učinili, postavljamo gornju liniju na ulaz s povlačenjem(PORTxy=1, DDRxy=0), prosjek daje niska izlazna razina(PORTxy=0, DDRxy=1), donji ne sudjeluje u procesu jer je in Bok-Z(PORTxy=0, DDRxy=0). Ako pritisnemo tipku “B”, tada će gornja linija u tom trenutku popustiti i program će shvatiti da je pritisnuta tipka “B”, ali ako ne pritisnemo “B”, već pritisnemo “E” i “B” ” u isto vrijeme, tada će i gornja linija popustiti, a program će misliti da je pritisnuto “B”, iako nije ležalo tamo. Nedostaci ove sheme su da se klikovi mogu netočno obraditi. Dakle, ako će uređaj koristiti seljački operateri koji sve koriste neselektivno, onda je bolje odustati od takve sheme.

I na kraju, dijagram koji pokazuje kako možete kombinirati gumb i LED:


Također radi isključivo u dinamici. Odnosno, uvijek prikazujemo status LED-a - to jest, izlaz ili 0 (dioda je uključena) ili Hi-Z (dioda nije uključena) na port. A kada trebamo prozvati tipku, privremeno (na nekoliko mikrosekundi) prebacimo izlaz u način rada za povlačenje (DDRxy=0 PORTxy=1) i slušamo tipku. Način kada postoji jaka visoka razina na izlazu (DDRxy=1 PORTxy=1) ne može se omogućiti ni pod kojim okolnostima, jer Kada pritisnete gumb, možete spaliti port.

Protiv - kada pritisnete gumb, LED dioda svijetli kako god gledali u nju. Međutim, ovo možda nije greška, već značajka :)

Ovo su pite. Sada zamislite program koji implementira sve te dinamičke značajke + hrpu vlastitog algoritma. Ispada ili beskonačan niz anketa, ili legija svih vrsta zastava. U takvim slučajevima, najjednostavnije slanje ili kooperativno slanje je upravo ono što je liječnik naredio - svaku anketu provodite u ciklusu vašeg zadatka i ne brinite. Ali ti svugdje koristiš neki ATTiny2313 i sarkastično gledaš one koji u isti zadatak uguraju Mega8 ili nešto deblje :)

Ne znam ništa i bojim se da ne spalim nešto, što da radim???

Ne boj se i učini to. Uostalom, mikrokontroler nije tako skupa stvar da biste žalili zbog njegove smrti. Bacio sam ga u smeće i iz vrećice izvadio novi. U najgorem slučaju, ako je stvarno zastrašujuće, onda možete kupiti gotovu demo ploču na kojoj je sve već zalemljeno i ožičeno kako treba. Sve što trebate učiniti je programirati i vidjeti rezultat.

A onda, na primjeru kako je izvršeno demo plaćanje, pokušajte napraviti nešto svoje. Sama demo ploča je mikrokontroler + neke početne periferije, što je dovoljno za niz jednostavnih eksperimenata i može olakšati spajanje i proučavanje drugih uređaja. Postoje različite demo ploče, na primjer, brendirani sustavi poput STK500 ili AVR Butterfly, ili moj, koji je dizajniran na temelju mog iskustva i na kojem će se temeljiti cjelokupno daljnje školovanje.

Nedavno se na Habréu pojavilo mnogo članaka o STM32 (). U komentarima se opetovano spominje složenost STM32 u usporedbi s AVR-om. Ova tema posebno utječe na početnike koji žele početi učiti mikrokontrolere, a videći ovo mišljenje, biraju AVR za proučavanje. Da vidimo je li ova zvijer - STM32 - toliko komplicirana?

Da bismo to učinili, odabrat ćemo jeftinu verziju ploče i napisati firmware u desetak ili dva bajta (da, treptanje LED diode od 2 kilobajta je slično "Hello world" u stotinama kilobajta x86 za nesposobne). Također ćemo naučiti kako pisati programe u bilo kojem programskom jeziku za STM32.

Uvod

Koju vrstu mikrokontrolera trebam proučavati? Ovo pitanje je, po mom mišljenju, slično pitanjima poput "Koji programski jezik trebam naučiti?", "Koji strani jezik trebam naučiti?" IMHO, treba proučiti onaj koji je najpotrebniji u danom trenutku, za dani zadatak. Kad znate jednu stvar, drugu ćete naučiti puno lakše, a o trećoj nećete ni razmišljati.

Dakle, u čemu je poteškoća STM32? Najčešće mišljenje je da je programiranje perifernih uređaja teško. Broj i vrsta STM32 i AVR periferije približno su isti. Njegova konfiguracija također nije puno drugačija. Dakle, u čemu je poteškoća? U STM32 mikrokontrolerima sve periferije prvo moraju biti uključene. To je sva poteškoća.

Uspoređujem AVR s javnim zgradama: sva su vrata širom otvorena, posvuda monitori svjetlucaju od reklama i svjetla su upaljena, a STM32 s privatnom kućom: ako želite gledati TV, prvo je uključite, pa promijenite kanale, ako želite želite piškiti, otvorite vrata i upalite svjetla, operite ruke - otvorite vodu i tako dalje. Ne vjeruješ mi? Uvjerimo se zajedno.

Pregled ploče

Odabrao sam najjeftiniju ploču ponuđenu na aliexpressu (slika gore). Malo skuplji $2, 180 rubalja u prosincu 2015. Na brodu postoji minimalna oprema: dva kvarcna rezonatora - visoke frekvencije na 8 MHz i sat na 32,768 Hz, gumb za resetiranje, dva skakača za odabir načina pokretanja, par LED diode - za napajanje i na nogu PC13 i set konektora: microUSB, debug, dva češlja za sve pinove mikrokontrolera.

Jeftinije je samo kupiti sve dijelove, sami napraviti ploču i lemiti je. Kako šivati ​​i ispravljati greške? Ako imate ST-LINK, onda je bolje za njih, ne, nema veze, postoji još nekoliko opcija, na primjer, preko USB-USART adaptera, nema toga - možete izravno preko USB-a, iako morate sami napisati driver za ovaj slučaj, nitko se još nije potrudio. ST-LINK je prilično jeftin, a uključen je u sve ploče serije DISCOVERY. Pa sam upotrijebio ovaj.

Spajamo napajanje, LED veselo treperi, ploča radi. Preuzmite i instalirajte programer (ulje-ulje) "STM32 ST-LINK Utility" (sve programe i dokumente preuzimamo s web stranice proizvođača). Pokušavamo pročitati firmware... Program je zaštićen od čitanja. Očigledno, nije uzalud što svi govore o poteškoćama pisanja programa za STM32; čak su i Kinezi zaštitili ovaj izuzetno složeni program od hakiranja. Ili je tamo skrivena oznaka virusa? Nećemo shvatiti, uklanjamo zaštitu i dobivamo netaknuti STM32F103C8T6 mikrokontroler.

Prvi program

Zatrepnimo i LED i napravimo, da tako kažem, obrnuti inženjering u umu izvornog firmvera. Kako? Kako ne bih stvarao kontroverze oko izbora razvojnog okruženja, učinit ću to u svojoj matičnoj Visual Studio zajednici. Čini mi se da za Windows je bolji za muškarca br.

Kakav je treptajući program za Arduino? Konfiguriramo izlaznu nogu i prebacujemo je u ciklusu od nule do jedan i natrag.
Kako će to izgledati za STM32? Puno teže. Prvo, uključimo svjetlo u sobi za konfiguraciju pinova mikrokontrolera, a zatim "Konfiguriramo nogu za izlaz i prebacujemo je u ciklusu od nule do jedinice i natrag." Razumijem da je teško... Ali možemo se nositi s tim.

U dokumentu “RM0008. Reference Manual" na našem mikrokontroleru, pogledajmo memorijsku mapu za registre koji su nam potrebni.

- Idemo na jednostavan i logičan način.
- Idemo zajedno.

1. Uključite takt priključka C (naša LED dioda visi na pinu 13 priključka C). Pogledajmo dokument. Registar koji nam treba je RCC_ABP2ENR (prevodimo: registar za resetiranje i takt je druga periferna sabirnica niske brzine). Adresa porta je 0x40021018, potrebni IOPCEN bit (I/O port C - bit omogućavanja) četvrti je 0x00000010.

Povlačenje

Mikrokontroleri imaju sve kao procesori za odrasle. Postoji guma za velike brzine AHB zvana "Sjeverni most" i mala brzina APB zvana "Južni most". Sam procesor mikrokontrolera može učiniti sve da ubrza rad: ima preddohvaćanje naredbi i cjevovod za izvršavanje naredbi. Nema predmemorije, ali procesor nije puno brži od memorije, a čitanje i pisanje u memoriju može se dovršiti u jednom taktu. Dakle, možemo reći da je cjelokupna memorija mikrokontrolera jedna velika predmemorija. Dobro, dobro, ne jedan i ne veliki. Dva mala spremišta.
Sve periferije mapirane su u adresni prostor. U usporedbi s x86, nema in-out naredbi, ali Intel ih je ostavio samo radi kompatibilnosti, sada se praktički ne koriste.


2. Konfigurirajte pin za izlaz. Pogledajmo dokument. Registar koji nam treba je GPIOC_CRH (prevodimo: I/O port registar C je konfiguracijski registar za stariju polovicu nogu). Adresa priključka je 0x40011004, 4 bita su odgovorna za konfiguraciju svake noge, vrijednost za prebacivanje noge na izlaz je 0001b, za pin 13 vrijednost je 0x00100000.

3. Kako promijeniti Booleovu vrijednost na pinu. Pogledajmo dokument. Registar koji nam treba je GPIOC_ODR (prevodimo: I/O port registar C - izlazni registar podataka). Adresa porta je 0x4001100C, njegova vrijednost se izravno šalje na pinove mikrokontrolera, za pin 13 vrijednost je 0x00002000. Sve je spremno za pisanje programa (ne zaboravite objaviti projekt na githubu):

Int Main (VOID) ( *((int *) 0x40021018) = 0x00000010; // RCC_apb2enr = RCC_APB2ENR_IOPCEN *((Int *) 0x40011004) = 0x00100000; // GPIOC_CRH = MODER_UTER_OV (1) ( *((Volatile int *) 0x4001100C ) ^= 0x00002000; // GPIOC_ODR ^= BIT_13 int i; for (i=1000000; i>0; i--) ; ) ) extern int _eram; __attribute__ ((section(".isr_vector"))) int g_pfnVektori = ( (int)&_eram, // početna vrijednost stoga (int)main // Reset rukovatelja);
S prekidnim vektorima, nadam se da je sve jasno? Koristimo samo dva od njih, tako da nema potrebe gubiti memoriju s lutkama. Svi ostali prekidi omogućeni su softverom; ako nisu omogućeni, to znači da nikada neće raditi. Iznimka je treći HardFault vektor, ako se dogodi - mikrokontroler je neispravan ili neispravan, za jednostavne projekte (ne svemirsko zrakoplovstvo, ne medicina) ne može se obraditi.

Ovo je obrazovni projekt, naravno da biste trebali formatirati sve adrese kao simboličke konstante zasebna h-datoteka S veliki iznos definira, kao što je učinjeno u CMSIS-u. Možete ih uzeti i prilagoditi svojim potrebama. Za kompilaciju koristim gcc, firmware koristeći "STM32 ST-LINK Utility". Firmware je zauzeo 56 bajtova (zdravo, asembleru).

Još jedno povlačenje

Još jedna izjava o složenosti STM32 je da postoji malo dokumentacije na ruskom. Sporan. Potrebna su samo dva dokumenta - Datasheet i Reference Manual za željeni mikrokontroler. Jezik na kojem je napisan teško se može nazvati engleskim. Proučavao sam jezik koristeći neprevedene igračke, moja razina engleskog ostala je na istoj razini, ali sam čitao podatkovne tablice bez problema, nepoznati pojmovi su jasni iz konteksta.



Čini se da se puno toga dogodilo, to je sve za danas.

U drugoj polovici govorit ću o programiranju STM32 u bilo kojem programskom jeziku.

Tagovi: STM32, mikrokontroleri-su-jednostavni, arduino-nije-potreban

Jednog sam dana odlučio nadograditi svoju liniju razvojnih ploča. Trenutačno ne osjećam nikakvu posebnu potrebu za radom s novim kontrolerima, pa je odlučeno napraviti bitno drugačije otklanjanje pogrešaka. U njemu sam želio implementirati sljedeće značajke:

Prilika život baterije. Ponekad stvarno želite ponijeti neki uređaj sa sobom "u šetnju" ili na posao, ali prethodne ploče su zahtijevale vanjsko napajanje. Volio bih da napajanje bude na samoj ploči.

Koristite dovoljno snažan čip. Budući da sam dugo vremena koristio svoj debugging na stm32f100, kako su projekti napredovali, shvatio sam da želim iskoristiti čipove do maksimuma. Budući da mi mogućnosti potonjeg nisu bile dovoljne (nekoliko nogu i niska frekvencija od 24 MHz), odlučio sam se prebaciti na nešto veći čip: STM32F103, na kojem sam već uspješno otklanjao greške, ali koji nije bio u širokoj upotrebi .

Koristite 18650 baterije koje jako volim zbog omjera kapaciteta i cijene.

Koristite ugrađeni mini-usb kontroler napajanja na MCP73833. Htio sam pokušati napraviti tvorničku ploču s dobrim odvođenjem topline s čipa i vidjeti što mogu overclockati ovaj kontroler punjenje bez vanjskog radijatora.

Upotrijebi moj omiljeni TPS63000 za stvaranje linije od 3,3 V. Nije vrlo učinkovit regulator snage u smislu struje mirovanja, ali radi kao pretvarač pojačanja/slabosti, dopuštajući da se sva snaga baterije koristi dok daje veliku struju (jedinice ampera).

Označite sve signalne pinove na ploči.

Pa sitnice:

Quartz 5032 (nijedan kvar tijekom cijele operacije)

Smd0603+conders 0805 na najmanjim otiscima.

Razdvajanje analognih i digitalnih uzemljenja u uređaju

Konektori s razmakom od 2,54 tipa ženski (PBS20) tako da u svoje matične ploče napravljene s lootom mogu ugraditi one koje imam u velike količine Konektori su istog tipa, ali muški (jeftiniji).

Potpuno jednostrano lemljenje (osim konektora baterije).

Ispitivanje DC-DC pretvarača.

Nakon toga sam krenuo s testiranjem. U tu svrhu posebno sam kupio otpornik SQP5-4R7 za testiranje DC-DC regulatora na struju od ~1A. Kao rezultat ispitivanja, otpornik se zagrijao do 110 * C (prepoznato pirometrom), što je dovelo do malog pada otpora i povećanja struje na 1A.

Kao rezultat toga, utvrđeno je da nije bilo dodatne buke, a cijeli sustav je radio kao sat. U isto vrijeme temperatura DC-DC pretvarač je u rasponu od 35-40*C pri vanjskoj temperaturi od +27*C. Naravno, razumijem da će se s povećanjem opterećenja povećati i pulsacije, ali mislim da kada postoji dovoljno opterećenje snage koje radi iz napojne linije mikrokontrolera, tada neće biti potrebna posebna preciznost analognog dijela.

Testiranje punjača.

Iskreno, ovo je prvi put da sam odlučio napraviti komercijalno proizvedenu ploču s MCP73833. Zadnji put sam pogledao kako se ovaj kontroler općenito puni i radi + u praksi sam se upoznao s algoritmom njegovog rada. U ovom slučaju, budući da se bližila matura, a ja sam jako htjela probati, jednostavno sam rastavila prethodna naknada i pažljivo prenio sve komponente u novi. Kao rezultat toga, prilikom punjenja baterije nakon prethodnog testa, zabilježio sam da uz struju punjenja od 375 mA, temperatura regulatora punjenja nije dosegla čak ni 45 * C. Ovo sugerira da možete sigurno ponovno zalemiti otpornik za kontrolu punjenja kako biste povećali struju punjenja. Dići ću na 500mA, ali neću dalje. To nije zbog topline koja će se osloboditi na čipu, već zbog činjenice da nisu svih mojih pet voltni blokovi napajanja za mobilne telefone daju više od 500mA. U ovim koje sam gledao nema posebnih zaštita, a to može dovesti do problema u električnoj mreži.

Nedostaci razvijene ploče.

Nakon što sam izvršio ove testove, a također zamišljajući kako ću u budućnosti raditi s ovom pločom, postalo je jasno nekoliko čimbenika koje nisam uzeo u obzir u ovom projektu:

Nisam imao dovoljno iskustva u trasiranju za ugradnju prekidača za uključivanje/isključivanje na bateriju u ovu tiskanu pločicu. Naravno, to mogu učiniti vrlo dobro izvlačenjem 18650 iz konektora ili ugradnjom posebne plastične ploče. Ali ovo je štaka, prijatelji moji. Bilo bi lijepo završiti s preklopkom.

Nema BMS za bateriju na ploči, iako je potrebna. Čisto tehnički, TPS63000 radi u rasponu ulaznog napona od 1,8-6V. To je moguće ako je baterija duboko ispražnjena i dovest će do njenog oštećenja. Ovaj problem se može riješiti nekom modifikacijom same baterije i ugradnjom jeftinog bms-a direktno na bateriju uz guranje/rezanje jednog od kontakata. Opet, ne kritično, ali sa štakama.

U USB priključak Ništa nije povezano digitalnim linijama. Ovaj kontroler ima ugrađeno USB sučelje, ali ga nisam spojio na konektor. To je zbog činjenice da u sadašnjim projektima to nije potrebno i moraju se postaviti normalni cjevovod usb sučelje na ploči (sa zaštitnim diodama i mikro krugom koji odgovara razini, nikad prije nisam vidio).

Na ploči nema PowerGood LED diode. Kada čip radi, ne govori ništa o tome. To je učinjeno namjerno kako bi se produžio vijek trajanja baterije, ali ponekad nije zgodno. U budućnosti razmišljam o tome da napravim LED diodu na pinu koji se malo koristi i dam poveznicu na kod za uključivanje LED diode kada kontroler radi

Nedovoljna kompaktnost ploče. Trenutne dimenzije ploče su 34x80 mm. Uvijek želite kompaktnije rješenje. Možda će uspjeti. Iako, s druge strane, na stražnjoj strani tiskane pločice nema previše mjesta.

Neki ljudi smatraju da priključak za programiranje i gumb za resetiranje nisu baš prikladni. Teško ga je dosegnuti kada je daska unutra, ali opet možete koristiti odvijač (štake).

Cijena uređaja je prilično visoka. Radio sam proizvodnju prototipa u panelu, tako da je cijena smanjena, ali vrag je daleko od kineskog arduina/stmka za 200 rubalja.

Svatko tko želi takvo što za sebe.

Trenutno postoje 2 takve ploče, tako da ih svatko može kupiti za 1700 rubalja bez dostave i baterije 18650. Zašto ne pošaljem bateriju? – stvar je ruske pošte. Bilo bi mi drago da pošalju baterije, iako ću prvom naručitelju pokušati poslati jednu limenku 18650 uz uređaj besplatno.

Možete me kontaktirati na mail: [e-mail zaštićen]

S moje točke gledišta o cijeni: sada za ovaj novac možete kupiti originalni Arduino ili Discovery iz Kine. Ali ne možete ponijeti ni jedno ni drugo sa sobom cijeli dan bez vanjskog karoserije i baterija. I tu dobijete gotovu stvar u koju možete umetnuti svoju pločicu i dobiti vrlo krutu strukturu koju možete sigurno nositi sa sobom bez brige da će vam se lem negdje odvojiti ili da će uređaj doživjeti kratki spoj.

Slika 1. Dijagram strujnog kruga ploče STM32F103RC

Neka profinjenost. Verzija 1.0.

Slučajno se dogodilo da sam, dok sam pripremao ploču za prvu prodaju (ne moj zalemljeni primjerak gore), odlučio dodati niz značajki za kupca.

Na prvi pogled upadaju u oči sljedeće stvari:

Ne postoji PBS-30 "češalj" za umetanje isprintana matična ploča. Na moju žalost, ovdje su na djelu 2 faktora (ponestalo mi ih je i kupac je tražio da ih ne instaliram.

Konektor za programiranje izrađen je s različitim kutnim klinovima. Prošli put sam također htjela koristiti takve pribadače, ali ih u trgovini koja mi je bila dostupna nije bilo. Kao rezultat toga, slučajno sam doveden na jedno od moskovskih radijskih tržišta, gdje sam pronašao najveći izbor ovih konektora i kupio one koji su mi bili potrebni.

LED diode su malo drugačije. Na moju žalost, uzimam SMD LED diode iz velike hrpe i ne znam uvijek koje su boje. Ovaj put tu su dvije zelene i jedna bijela LED dioda.

Ali vrag je često u detaljima, pa tako ispada i ovdje. Na ovoj ploči isprobao sam različite otpornike za kontrolu struje punjenja. Kao rezultat toga, otkriveno je da mikro krug MCP73833 na ovoj ploči normalno drži struju od 800 mA i, kada se puni Li-Ion baterijama od 2,5 V, zagrijava se do 65-70 * C. Naravno, prema podatkovnoj tablici, radi sa strujama do 2A, ali iskreno još ne mogu zamisliti kako ih implementirati na kućište msop-10. Možda će se u sljedećem slučaju, u kojem je ovaj problem bolje riješen, moći izvući 2A.

Dodatni sitni detalj koji će malo tko uopće primijetiti je ugradnja induktora Murata, a ne njegovog kineskog brata blizanca nepoznatog imena. Izgledaju slično, samo što je ovaj bolje zaštićen.

Mjera opreza.

Tijekom izvođenja potpunog dijagnostičkog testa, spalio sam jedan STM32F103RCT6. Kako sam to napravio:

Uzeo sam obični multimetar i gurnuo ga u otpornik Povratne informacije. U ovom slučaju, TPS63000 vidi pad napona u povratnoj sprezi i počinje brzo povećavati napon na svom izlazu. Kao rezultat toga, prema testu provedenom sa zatvorenim regulatorom: napon u impulsu porastao je na 7V. U ovom slučaju, regulator je doživio prenapon i preminuo.

Kasnije se dogodila smiješna stvar: na ulazu od 3,6 V, kontroler je počeo trošiti 0,6 A. To je zbog činjenice da TPS63000 ima ugrađenu strujnu zaštitu od 2 A. Upravo je ta struja tekla kroz mrtvi mikrokontroler. Istovremeno je zadržana funkcionalnost cijelog preostalog kruga.

Lako je dijagnosticirati ovaj problem: samo spojite pojedinačni mjerni termometar (prst) na regulator, i ako se počne zagrijavati, to znači da je mrtav.

Pakiranje poslane ploče

Kada sam ovu ploču slao kolegici, odlučio sam je bolje zapakirati da R. Post ne polomi sve. Na kraju je ispalo ovako:





Kako spojiti kapacitivni senzor dodira na mikrokontroler. Ova mi se ideja činila prilično obećavajućom; za neke bi uređaje tipke osjetljive na dodir bile puno bolje prikladne od mehaničkih. U ovom ću članku govoriti o svojoj implementaciji ove korisne tehnologije temeljene na STM32 Discovery razvojnoj ploči.

Dakle, tek što sam počeo svladavati STM32, odlučio sam dodati detekciju dodira na uređaj kao vježbu. Počevši shvaćati teoriju i praksu u gore navedenom članku, ponovio sam krug druga "a. Radio je savršeno, ali sam ga ja, ljubitelj minimalizma, želio pojednostaviti tako što sam se riješio nepotrebnih elemenata. Po mom mišljenju , vanjski otpornik i put za napajanje pokazali su se suvišnim. Sve to već postoji u većini mikrokontrolera, uključujući AVR i STM32. Mislim na pull-up otpornike I/O portova. Zašto ne puniti ploču i naše prste kroz njih ?U iščekivanju kvake, sastavio sam strujni krug na matičnoj ploči, koji je, na moje iznenađenje, radio prvi put. Zapravo, čak je i smiješno to zvati krugom, jer sve što trebamo je jednostavno spojiti kontaktnu ploču na nogu ploče za otklanjanje pogrešaka. Mikrokontroler će obaviti sav posao.

Što je program? Prve dvije funkcije:
Prvi daje logičku "0" na pin senzora (nulti pin registra C)

Praznina senzora_zemlje (praznina) ( GPIOC->CRL = 0x1; GPIOC->BRR |= 0x1; )

Drugi konfigurira isti izlaz kao ulaz, s povlačenjem na napajanje.

Void Sensor_InPullUp (void) ( GPIOC->CRL = 0x8; GPIOC->BSRR |= 0x1; )

Sada ćemo na početku ciklusa prozivanja pozvati Sensor_Ground() i pričekati neko vrijeme da ispraznimo sav preostali naboj na senzoru u zemlju. Zatim ćemo resetirati varijablu brojača, koja će se koristiti za izračunavanje vremena punjenja senzora, i pozvati Sensor_InPullUp().

Masa_senzora(); Odgoda (0xFF); //prosti prazan brojač brojač = 0; Senzor_InPullUp();

Senzor se sada počinje puniti preko internog pull-up otpornika nominalne vrijednosti od desetak KOhma (30..50 KOhma za STM32). Vremenska konstanta takvog kruga bit će jednaka nekoliko ciklusa takta, pa sam promijenio kvarcni rezonator na ploči za otklanjanje pogrešaka na brži, 20 MHz (usput, nisam odmah primijetio da je na STM32 Discovery kvarc mijenja se bez lemljenja). Dakle, brojimo cikluse procesora dok se na ulazu ne pojavi logički:

Dok(!(GPIOC->IDR & 0x1)) ( broj++; )

Nakon izlaska iz ove petlje, varijabla brojača pohranit će broj proporcionalan kapacitetu ploče senzora. U mom slučaju s čipom od 20 MHz, vrijednost brojanja je 1 kada nema pritiska, 7-10 s najblažim dodirom, 15-20 s normalnim dodirom. Sve što preostaje je usporediti ga s vrijednošću praga i ne zaboravite ponovno pozvati Sensor_Ground(), tako da će do sljedećeg ciklusa ispitivanja senzor već biti ispražnjen.
Rezultirajuća osjetljivost dovoljna je za pouzdano otkrivanje dodira na golim metalnim jastučićima. Kada senzor prekrijete listom papira ili plastike, osjetljivost pada tri do četiri puta; jasno se detektiraju samo sigurni pritisci. Za povećanje osjetljivosti u slučajevima kada senzor treba prekriti zaštitnim materijalom, možete povećati taktnu frekvenciju mikrokontrolera. Uz čip serije STM32F103, koji može raditi na frekvencijama do 72 MHz, milimetarske barijere između prsta i senzora neće biti prepreka.
U usporedbi s implementacijom "a, moj pristup radi puno brže (oko desetak ciklusa takta po anketi jednog senzora), tako da nisam komplicirao program postavljanjem prekida timera.

Na kraju, video koji pokazuje kako senzor radi.

Main.c test program.

Na mikrokontroler

Hvala korisniku na vrlo korisnom članku ARM mikrokontroleri STM32F. Brzi početak sa STM32-Discovery, korisniku za ideju i razumljiv teorijski opis.

UPD. Nakon komentara "a odlučio sam pogledati taktiranje i otkrio da je STM32 Discovery prema zadanim postavkama postavljen na frekvenciju takta
(HSE / 2) * 6 = 24 MHz, gdje je HSE vanjska kristalna frekvencija. Sukladno tome, mijenjajući kvarc s 8 na 20 MHz, natjerao sam jadnog STM-a da radi na 60 MHz. Dakle, prvo, neki zaključci očito nisu sasvim točni, a drugo, ono što sam radio moglo bi dovesti do kvarova na čipu. u slučaju takvih kvarova u mikrokontroleru postoji prekid HardFault, koristeći ga, provjerio sam više visoke frekvencije. Dakle, čip počinje kvariti tek na 70 MHz. No iako kontroler obrađuje ovaj određeni program na 60 MHz, pri korištenju perifernih uređaja ili radu s Flash memorijom može se ponašati nepredvidivo. Zaključak: ovu temu tretirajte kao eksperiment, ponavljajte samo na vlastitu opasnost i rizik.

Nedavno se na Habréu pojavilo mnogo članaka o STM32 (). U komentarima se opetovano spominje složenost STM32 u usporedbi s AVR-om. Ova tema posebno utječe na početnike koji žele početi učiti mikrokontrolere, a videći ovo mišljenje, biraju AVR za proučavanje. Da vidimo je li ova zvijer - STM32 - toliko komplicirana?

Da bismo to učinili, odabrat ćemo jeftinu verziju ploče i napisati firmware u desetak ili dva bajta (da, treptanje LED diode od 2 kilobajta je slično "Hello world" u stotinama kilobajta x86 za nesposobne). Također ćemo naučiti kako pisati programe u bilo kojem programskom jeziku za STM32.

Uvod

Koju vrstu mikrokontrolera trebam proučavati? Ovo pitanje je, po mom mišljenju, slično pitanjima poput "Koji programski jezik trebam naučiti?", "Koji strani jezik trebam naučiti?" IMHO, treba proučiti onaj koji je najpotrebniji u danom trenutku, za dani zadatak. Kad znate jednu stvar, drugu ćete naučiti puno lakše, a o trećoj nećete ni razmišljati.

Dakle, u čemu je poteškoća STM32? Najčešće mišljenje je da je programiranje perifernih uređaja teško. Broj i vrsta STM32 i AVR periferije približno su isti. Njegova konfiguracija također nije puno drugačija. Dakle, u čemu je poteškoća? U STM32 mikrokontrolerima sve periferije prvo moraju biti uključene. To je sva poteškoća.

Uspoređujem AVR s javnim zgradama: sva su vrata širom otvorena, posvuda monitori svjetlucaju od reklama i svjetla su upaljena, a STM32 s privatnom kućom: ako želite gledati TV, prvo je uključite, pa promijenite kanale, ako želite želite piškiti, otvorite vrata i upalite svjetla, operite ruke - otvorite vodu i tako dalje. Ne vjeruješ mi? Uvjerimo se zajedno.

Pregled ploče

Odabrao sam najjeftiniju ploču ponuđenu na aliexpressu (slika gore). Malo skuplji $2, 180 rubalja u prosincu 2015. Na brodu postoji minimalna oprema: dva kvarcna rezonatora - visoke frekvencije na 8 MHz i sat na 32,768 Hz, gumb za resetiranje, dva skakača za odabir načina pokretanja, par LED diode - za napajanje i na nogu PC13 i set konektora: microUSB, debug, dva češlja za sve pinove mikrokontrolera.

Jeftinije je samo kupiti sve dijelove, sami napraviti ploču i lemiti je. Kako šivati ​​i ispravljati greške? Ako imate ST-LINK, onda je bolje za njih, ne, nema veze, postoji još nekoliko opcija, na primjer, preko USB-USART adaptera, nema toga - možete izravno preko USB-a, iako morate sami napisati driver za ovaj slučaj, nitko se još nije potrudio. ST-LINK je prilično jeftin, a uključen je u sve ploče serije DISCOVERY. Pa sam upotrijebio ovaj.

Spajamo napajanje, LED veselo treperi, ploča radi. Preuzmite i instalirajte programer (ulje-ulje) "STM32 ST-LINK Utility" (sve programe i dokumente preuzimamo s web stranice proizvođača). Pokušavamo pročitati firmware... Program je zaštićen od čitanja. Očigledno, nije uzalud što svi govore o poteškoćama pisanja programa za STM32; čak su i Kinezi zaštitili ovaj izuzetno složeni program od hakiranja. Ili je tamo skrivena oznaka virusa? Nećemo shvatiti, uklanjamo zaštitu i dobivamo netaknuti STM32F103C8T6 mikrokontroler.

Prvi program

Zatrepnimo i LED i napravimo, da tako kažem, obrnuti inženjering u umu izvornog firmvera. Kako? Kako ne bih stvarao kontroverze oko izbora razvojnog okruženja, učinit ću to u svojoj matičnoj Visual Studio zajednici. Čini mi se da nema boljeg Windowsa za čovjeka.

Kakav je treptajući program za Arduino? Konfiguriramo izlaznu nogu i prebacujemo je u ciklusu od nule do jedan i natrag.
Kako će to izgledati za STM32? Puno teže. Prvo, uključimo svjetlo u sobi za konfiguraciju pinova mikrokontrolera, a zatim "Konfiguriramo nogu za izlaz i prebacujemo je u ciklusu od nule do jedinice i natrag." Razumijem da je teško... Ali možemo se nositi s tim.

U dokumentu “RM0008. Reference Manual" na našem mikrokontroleru, pogledajmo memorijsku mapu za registre koji su nam potrebni.

- Idemo na jednostavan i logičan način.
- Idemo zajedno.

1. Uključite takt priključka C (naša LED dioda visi na pinu 13 priključka C). Pogledajmo dokument. Registar koji nam treba je RCC_ABP2ENR (prevodimo: registar za resetiranje i takt je druga periferna sabirnica niske brzine). Adresa porta je 0x40021018, potrebni IOPCEN bit (I/O port C - bit omogućavanja) četvrti je 0x00000010.

Povlačenje

Mikrokontroleri imaju sve kao procesori za odrasle. Postoji guma za velike brzine AHB zvana "Sjeverni most" i mala brzina APB zvana "Južni most". Sam procesor mikrokontrolera može učiniti sve da ubrza rad: ima preddohvaćanje naredbi i cjevovod za izvršavanje naredbi. Nema predmemorije, ali procesor nije puno brži od memorije, a čitanje i pisanje u memoriju može se dovršiti u jednom taktu. Dakle, možemo reći da je cjelokupna memorija mikrokontrolera jedna velika predmemorija. Dobro, dobro, ne jedan i ne veliki. Dva mala spremišta.
Sve periferije mapirane su u adresni prostor. U usporedbi s x86, nema in-out naredbi, ali Intel ih je ostavio samo radi kompatibilnosti, sada se praktički ne koriste.


2. Konfigurirajte pin za izlaz. Pogledajmo dokument. Registar koji nam treba je GPIOC_CRH (prevodimo: I/O port registar C je konfiguracijski registar za stariju polovicu nogu). Adresa priključka je 0x40011004, 4 bita su odgovorna za konfiguraciju svake noge, vrijednost za prebacivanje noge na izlaz je 0001b, za pin 13 vrijednost je 0x00100000.

3. Kako promijeniti Booleovu vrijednost na pinu. Pogledajmo dokument. Registar koji nam treba je GPIOC_ODR (prevodimo: I/O port registar C - izlazni registar podataka). Adresa porta je 0x4001100C, njegova vrijednost se izravno šalje na pinove mikrokontrolera, za pin 13 vrijednost je 0x00002000. Sve je spremno za pisanje programa (ne zaboravite objaviti projekt na githubu):

Int Main (VOID) ( *((int *) 0x40021018) = 0x00000010; // RCC_apb2enr = RCC_APB2ENR_IOPCEN *((Int *) 0x40011004) = 0x00100000; // GPIOC_CRH = MODER_UTER_OV (1) ( *((Volatile int *) 0x4001100C ) ^= 0x00002000; // GPIOC_ODR ^= BIT_13 int i; for (i=1000000; i>0; i--) ; ) ) extern int _eram; __attribute__ ((section(".isr_vector"))) int g_pfnVektori = ( (int)&_eram, // početna vrijednost stoga (int)main // Reset rukovatelja);
S prekidnim vektorima, nadam se da je sve jasno? Koristimo samo dva od njih, tako da nema potrebe gubiti memoriju s lutkama. Svi ostali prekidi omogućeni su softverom; ako nisu omogućeni, to znači da nikada neće raditi. Iznimka je treći HardFault vektor, ako se dogodi - mikrokontroler je neispravan ili neispravan, za jednostavne projekte (ne svemirsko zrakoplovstvo, ne medicina) ne može se obraditi.

Ovo je edukativni projekt, naravno treba formatirati sve adrese kao simboličke konstante u zasebnoj h-datoteci s velikim brojem definicija, kao što se to radi u CMSIS-u. Možete ih uzeti i prilagoditi svojim potrebama. Za kompilaciju koristim gcc, firmware koristeći "STM32 ST-LINK Utility". Firmware je zauzeo 56 bajtova (zdravo, asembleru).

Još jedno povlačenje

Još jedna izjava o složenosti STM32 je da postoji malo dokumentacije na ruskom. Sporan. Potrebna su samo dva dokumenta - Datasheet i Reference Manual za željeni mikrokontroler. Jezik na kojem je napisan teško se može nazvati engleskim. Proučavao sam jezik koristeći neprevedene igračke, moja razina engleskog ostala je na istoj razini, ali sam čitao podatkovne tablice bez problema, nepoznati pojmovi su jasni iz konteksta.



Čini se da se puno toga dogodilo, to je sve za danas.

U drugoj polovici govorit ću o programiranju STM32 u bilo kojem programskom jeziku.

Tagovi: STM32, mikrokontroleri-su-jednostavni, arduino-nije-potreban