Páskovanie stm32 popis a programovacie pokyny. Pripojenie COG LCD displeja k ovládaču ST7565R

Zdalo by sa to ako jednoduchá téma, no v komentároch som bol zavalený otázkami, ako pripojiť mikrokontrolér. Ako k nemu pripojiť LED, tlačidlo, napájanie. Čo robiť AGND alebo AREF. Prečo je to potrebné? AVCC a podobné veci. Takže, keďže existujú otázky, znamená to, že téma nie je jasná a je potrebné dať čo najkomplexnejšiu odpoveď. Opisujem všetko pre ovládače AVR, ale pre niektoré PIC je všetko veľmi, veľmi podobné. Pretože princípy sú tu rovnaké.

Výživa
Na fungovanie potrebuje mikrokontrolér energiu – elektrinu. Aby ste to urobili, musíte ho samozrejme začať živiť. Napájacie napätie MK Atmel AVR sa líši od 1.8 predtým 5 voltov, v závislosti od série a modelu. Všetky AVR môže fungovať od 5 voltov (ak existujú čisto nízkonapäťové série, prosím o vysvetlenie v komentároch, pretože som také nevidel). Budeme teda predpokladať, že napájacie napätie nášho regulátora je vždy 5 voltov alebo tak. Plus napájacieho napätia sa zvyčajne označuje ako Vcc. Nulový terminál (rovnako ako Zem, Bývanie a ako to nazývajú) je určený GND. Ak si ako príklad vezmeme napájanie počítača. Potom je čierny vodič GND (mimochodom, uzemňovací vodič je tradične natretý čiernou farbou) a červený je +5, ktorý bude náš Vcc. Ak idete napájať mikrokontrolér z batérií, tak mínus batérií budeme brať ako GND, a plus pre Vcc(hlavne ze napajacie napatie z bateriek je v udanych hraniciach pre dany MK, problem je v datasheete. Parameter sa vacsinou pise na prvej strane v r. všeobecný popis Vlastnosti:

Prevádzkové napätia
–1,8 – 5,5V (ATtiny2313V)
–2,7 – 5,5 V (ATtiny2313)
Rýchlostné stupne
–ATtiny2313V: 0 – 4 MHz @ 1,8 – 5,5 V, 0 – 10 MHz @ 2,7 – 5,5 V
–ATtiny2313: 0 – 10 MHz @ 2,7 – 5,5 V, 0 – 20 MHz @ 4,5 – 5,5 V

Upozorňujeme, že existujú špeciálne nízkonapäťové série (napríklad 2313V nízkonapäťové), v ktorých je spodná hranica napájacieho napätia oveľa nižšia. Tiež stojí za to venovať pozornosť ďalšiemu bodu o frekvenciách. To ukazuje závislosť maximálnej frekvencie od napájacieho napätia. Je vidieť, že pri nízkom napätí sú medzné frekvencie nižšie. A nízkonapäťové série sú dvakrát pomalšie ako ich vysokonapäťové náprotivky. Všetky procesory však podliehajú pretaktovaniu ;)))))

Pre prevádzku so sériovými ovládačmi AVR Stačí len jedlo. Na všetky vchody Vcc musíte použiť našich 5 (alebo čokoľvek, čo máte) voltov a všetky vstupy GND musia byť zasadené na zemi. Mikrokontrolér môže mať veľa vstupov Vcc a veľa vchodov GND(najmä ak je na námestí TQFP telo. Ktorý má pitalovo zo všetkých strán). Veľa kolíkov nie je vyrobených pre ľahkú inštaláciu, ale za účelom rovnomerného napájania kryštálu zo všetkých strán, aby sa nepreťažovali vnútorné napájacie obvody. V opačnom prípade si predstavte, že ste napájací zdroj pripojili len na jednu stranu a na druhú stranu čipu ste na každú portovú linku zavesili LED a naraz ich rozsvietili. Vnútorná tenkovrstvová napájacia zbernica vyšinutá takouto prúdovou záťažou sa vyparila a procesor ZRAZU zabral a bez zjavnej príčiny si vyhodil z kopýtka. Takže VŠETKY Vcc a GND VÝSTUP MUSIA BYŤ PRIPOJENÉ. Pripojte ich zodpovedajúcim spôsobom a zapnite ich.

Vynárajú sa určité otázky AGND A AVCC- Toto je analógové uzemnenie a napájanie pre analógovo-digitálny prevodník. ADC je veľmi presný merač napätia, preto je vhodné ho napájať cez prídavné filtre, aby rušenie, ktoré nie je v klasickom napájacom obvode neobvyklé, neovplyvnilo kvalitu merania. Na tento účel je v presných obvodoch zem rozdelená na digitálnu a analógovú (musia byť pripojené iba v jednom bode) a na AVCC napätie je privádzané cez filtračnú tlmivku. Ak neplánujete používať ADC alebo nemáte v úmysle vykonávať presné merania, potom je to celkom prijateľné AVCC použite rovnakých 5 voltov ako na Vcc, A AGND zasadiť na rovnakú pôdu ako všetci ostatní. Ale musíte ich spojiť!!! EMNIP od AVCC tiež napája port A.

POZOR!!!

Zdá sa, že čip Mega8 má chybu na úrovni topológie čipu - Vcc a AVcc sú vo vnútri čipu prepojené. Medzi nimi je odpor asi (!!!) 5 Ohmov.Pre porovnanie, v ATmega16 a ATmega168 medzi Vcc a AVcc je odpor v desiatkach MEGA ohmov! V datasheete v tomto smere stále nie sú žiadne náznaky, ale v jednej z tém z roku 2004 na AVRFreaks sa hovorí, že ľudia si lámali hlavy digitálnym šumom ADC, potom napísali na podporu Atmelu, že WTF??? A tie, hovoria, je chyba v čipe a Vcc a AVcc sú spojené vo vnútri kryštálu. Vo svetle týchto informácií si myslím, že nastavenie plynu na AVcc pre Mega8 je prakticky zbytočné. Ale AVcc musí byť v každom prípade napájané - kto vie, aké silné je toto interné pripojenie?

Najjednoduchšia schéma zapojenia pre mikrokontrolér AVR je zobrazená nižšie:

Ako vidíte, do napájacieho obvodu bola pridaná tlmivka AVCC, ako aj kondenzátory. Je dobrou praxou umiestniť medzi seba sto nanofaradový keramický kondenzátor Vcc A GND každý mikroobvod (a ak má mikroobvod veľa napájacích vstupov a uzemnení, tak medzi každým napájacím zdrojom a každou zemou) čo najbližšie k napájacím výstupom - vyhladí krátky pulzný šum v napájacej zbernici spôsobený prevádzkou digitálnych obvodov. 47mKF kondenzátor v napájacom obvode vyhladí hlbšie napäťové rázy. Kondenzátor medzi AVcc A GND dodatočne upokojí výživu ADC.

Vchod AREF toto je referenčný vstup napätia ADC. Vo všeobecnosti môžete použiť napätie, vzhľadom na ktoré bude vypočítané ADC, ale zvyčajne sa používa buď interný zdroj referenčné napätie pri 2,56 V alebo napätie pri AVCC, teda na AREF Odporúča sa zavesiť kondenzátor, ktorý mierne zlepší kvalitu referenčného napätia ADC(a primeranosť výstupných údajov závisí od kvality podpory ADC).

Resetovať obvod
Rezistor zapnutý RESETOVAŤ. Všeobecne v AVR má vlastný vnútorný resetovací obvod a signál RESETOVAŤ zvnútra je už vytiahnutý 100 kOhm rezistorom do Vcc. ALE! Utiahnutie je také zlé, že mikrokontrolér zachytí reset pri každom kýchnutí. Napríklad z dotyku nohy prstom RST, alebo dokonca len z dotyku prsta za poplatok. Preto sa veľmi odporúča RST pritiahnite k napájaniu s odporom 10k. Nestojí to za menej, pretože... potom je tu možnosť, že obvodový programátor toto utiahnutie neprekoná a nebude možné prebliknúť MK vo vnútri obvodu. 10k je akurát.

Existuje aj táto schéma resetovania:

Pozoruhodné je, že keď je obvod zapnutý, kondenzátor je vybitý a napätie je RST blízko nuly - mikrokontrolér sa nespustí, pretože mu nepretržitý reset. Ale v priebehu času sa cez odpor kondenzátor nabije a napätie bude RST dosiahne log1 - spustí sa MK. Tlačidlo vám v prípade potreby umožňuje vynútiť reset.

Oneskorenie bude v tomto príklade približne T=R*C - asi sekunda. Prečo toto oneskorenie? Áno, aspoň aby ​​sa MK nespustil skôr, ako sa všetky zariadenia na doske zapnú a nedosiahnu ustálený stav. V starých MK ( AT89S51 napríklad) bez takéhoto reťazca poskytujúceho počiatočný reset by sa MK nemusel vôbec spustiť.

V podstate v AVR Oneskorenie štartu, ak je to potrebné, je možné vykonať programovo - pred spustením aktívnych akcií ho znížte na pol sekundy. Takže Conder môže byť vyhodený. A tlačidlo... čo len chcete. Potrebujete externý? RESETOVAŤ? Potom nechaj tak. Väčšinou to nechám.

Zdroj hodín
Generátor hodín je srdcom mikrokontroléra. Pri každom impulze prebieha vo vnútri regulátora nejaký druh operácie – dáta sa posielajú cez registre a zbernice, prepínajú sa piny portov, klikajú sa časovače. Čím rýchlejšia je frekvencia hodín, tým rýchlejšie MK vykonáva svoje akcie a spotrebuje viac energie (prepínanie logických brán vyžaduje energiu, čím častejšie sa spínajú, tým viac energie je potrebné).

Impulzy sú nastavené hodinovým generátorom zabudovaným v mikrokontroléri. Môže však existovať aj externý generátor, všetko je veľmi flexibilne nakonfigurované! Rýchlosť tikania interného generátora závisí od nastavení mikrokontroléra a zväzku.


Generátor môže byť:

  • Interné s interným hlavným RC obvodom.
    V tomto prípade nie je potrebné žiadne páskovanie! A piny XTAL1 a XTAL2 sa nedajú pripojiť vôbec, alebo sa dajú použiť ako bežné vstupno/výstupné porty (ak to MK umožňuje). Zvyčajne si môžete vybrať jednu zo 4 hodnôt vnútornej frekvencie. Tento režim je štandardne nastavený.
  • Interné s externým hlavným RC obvodom.
    Tu budete musieť pripojiť kondenzátor a odpor mimo mikrokontroléra. Umožňuje meniť na cestách frekvencia hodín jednoducho úpravou hodnoty odporu.
  • Vnútorné s vonkajším hlavným kremeňom.
    Vonku je umiestnený kremenný rezonátor a pár kondenzátorov. Ak je kremeň nízkofrekvenčný (do 1 MHz), kondenzátory nie sú nainštalované.
  • Vonkajšie.
    Z nejakého iného zariadenia sa na vstup MK posiela obdĺžnikový signál, ktorý nastavuje hodiny. Tento režim je užitočný napríklad vtedy, ak potrebujeme, aby z jedného generátora pracovalo niekoľko mikrokontrolérov v prísnej synchronizácii.

Rôzne schémy majú rôzne výhody:
Kedy vnútorný RC obvodŠetríme miesto na doske, nepotrebujeme ďalšie diely, ale nemôžeme dosiahnuť maximálnu frekvenciu a frekvencia trochu závisí od teploty a môže kolísať.

Externý kremeň má vynikajúcu presnosť, ale stojí ďalších 15 rubľov a vyžaduje ďalšie diely, a čo je najurážlivejšie, často zaberá niekoľko I/O nôh. Tiež na externom kremeň môžete dosiahnuť maximálny výkon z MK. Frekvencia MC je určená frekvenciou, na ktorú je vybraný kremeň zaostrený. Externý RC obvod umožňuje MK oscilátor tikať rýchlejšie ako interný, stojí menej ako quartz, ale má rovnaké problémy s frekvenčnou stabilitou ako interný RC obvod.

Metódy na taktovanie MK sú popísané v datasheete v časti Systémové hodiny a možnosti hodín a sú úplne určené konfiguráciou Poistkové bity. Medzitým vrelo odporúčam NEDOTÝKAJTE SA POISTKY kým s istotou nebudete vedieť, čo robíte a prečo. Pretože Nesprávnym nastavením môžete veľmi rýchlo zmeniť mikrokontrolér na kúsok zbytočného kremíka, oživiť ho bude veľmi ťažké (ale možné!)

Pripojenie LED diód a tlačidiel k mikrokontroléru
Sám o sebe, bez interakcie s vonkajším svetom, mikrokontrolér nie je zaujímavý – koho zaujíma, čo vo vnútri tiká? Ale ak to viete nejako zobraziť alebo ovplyvniť...

Takže tlačidlo a LED sú pripojené nasledovne:


Pre tlačidlo je potrebné pripojiť vybranú I/O nohu cez tlačidlo k zemi. Samotný výstup musí byť nakonfigurovaný ako vchod s ťahadlom(DDRxy=0 PORTxy=1). Potom, keď tlačidlo nie je stlačené, cez pull-up rezistor, vstup bude vysoký stupeň napätia a z bitov PINhu pri čítaní dá 1. Ak stlačíte tlačidlo, vstup sa uzemní a napätie na ňom klesne na nulu, čo znamená PINxy Načíta sa 0. Na základe núl v bitoch registra PINx vieme, že tlačidlá sú stlačené.

Bodkovaná čiara znázorňuje dodatočný pull-up rezistor. Napriek tomu, že na port vo vnútri AVR je možné pripojiť pull-up, je dosť slabý - 100 kOhm. To znamená, že môže byť ľahko prichytený k zemi rušením alebo rušením, čo spôsobí falošný poplach. A tieto interné pull-up odpory naozaj radi horia od rušenia. Už mám tucet mikrokontrolérov so zabitými PullUp odpormi. Všetko funguje, ale nie je žiadne uťahovanie - vyhorelo. Vonku zavesíte odpor a funguje to, ako keby sa nič nestalo. Preto pre kritické obvody dôrazne odporúčam pridať externý príťah 10 kOhm - aj keď je vnútorný zakrytý, vonkajší poslúži. Počas procesu učenia na to môžete zabudnúť.

Dióda vyžarujúca svetlo sa pripája k portu dvoma spôsobmi. Podľa schémy Port-land alebo Napájanie portu. V prvom prípade, aby ste zapálili diódu, potrebujete na výstupe log1 port vysokú úroveň (približne rovnajúcu sa Vcc). V druhom prípade, aby ste rozsvietili diódu, musíte na port vydať log0 - nízka úroveň (blízko nuly). Pre AVR Zdá sa, že nie je žiadny rozdiel, ale mnohé staršie série mikrokontrolérov sa sťahujú oveľa lepšie ako nahor, takže obvod Port-Power je bežnejší. Používam obe schémy na základe pohodlia rozloženia PCB. No, na úrovni softvéru nie je veľký rozdiel.
Pin portu na prácu s LED musí byť nakonfigurovaný VÝCHOD(DDRxy=1) a potom, v závislosti od hodnoty v PORTxy, bude mať kolík buď vysoké alebo nízke napätie.

Dióda vyžarujúca svetlo musí byť pripojený cez odpor. Faktom je, že priamy odpor LED je veľmi malý. A ak neobmedzíte prúd cez to, potom môže jednoducho vyhorieť. Alebo, čo je pravdepodobnejšie, spáliť kolík mikrokontroléra, ktorý, mimochodom, môže odoberať niečo ako 20-30 mA. A aby bežná LED svietila (teraz neuvažujeme o všetkých druhoch, tieto potvory dokážu zožrať ampéry) potrebujete asi 3...15 mA.

Takže zvažujeme:

  • Napätie na výstupe nohy MK je asi 5 voltov, úbytok napätia na LED je zvyčajne asi 2,5 voltu (nemôže byť vyšší, inak dióda spotrebuje viac prúdu ako je potrebné a bude sa dusiť, vyžaruje krásny dym)
  • Napätie, ktoré musí prijať obmedzovací odpor, bude teda 5-2,5 = 2,5V.
  • Potrebujeme prúd 5mA - nemá zmysel napájať LED, potrebujeme indikáciu, nie osvetlenie :)
  • R=U/I= 2,5/5E-3 = 500 Ohm. Najbližší v rade je 510 ohmov. Vezmime si to. V zásade môžete nastaviť od 220 Ohm do 680 Ohm, čo vám príde pod ruku - bude to horieť normálne.

Ak potrebujete pripojiť veľa LED diód, potom každá z nich má svoj vlastný odpor. Samozrejme, môžete byť chamtiví a dať jeden odpor pre každého. Ale tu to bude problém - je tu len jeden odpor, ale existuje veľa diód! Podľa toho, čím viac diód spustíme, tým menej prúdu každá dostane - prúd z jedného odporu sa rozdelí medzi štyri. Ale nemôžete dať menší odpor - pretože keď sa zapáli jedna dióda, dostane časť prúdu pre štyri a zlepí rebrá (alebo spáli port).

Niekoľko zaujímavostí pri návrhu obvodu alebo pár slov o šetrení kolíkov

Čo sa nedá prispájkovať, treba naprogramovať. (C) ľudová múdrosť.

Často sa stáva, že pamäť ovládača sa zdá byť pre danú úlohu viac než dostatočná a výkon je prekročený, ale nie je dostatok nôh. Takže musíte nainštalovať redundantný a drahší mikrokontrolér len preto, že má jednoducho viac pinov. Ukážem vám pár príkladov, ako to urobiť zložitejším programový kód ušetriť na hardvéri.

Základným kameňom takýchto úspor je zvyčajne princíp dynamického oddelenia priradenia pinov v čase. To znamená, že napríklad výstup môže fungovať na ľubovoľnej zbernici a keď zbernica nie je aktívna, potom cez ten istý výstup môžete skontrolovať stav tlačidla alebo niečo preniesť cez inú zbernicu. Rýchlym (desaťkrát alebo dokonca tisíckrát za sekundu) prepínaním medzi dvoma rôznymi priradeniami môžete dosiahnuť efekt „súčasnej prevádzky“.

Hlavná vec je dodržiavať dve pravidlá:

  • Dve rôzne aplikácie sa nesmú navzájom rušiť, t.j. Časové oddelenie musí byť konštruované tak, aby susedná funkcia neskresľovala výsledok testovanej funkcie.
  • Úrovne napätia by za žiadnych okolností nemali kolidovať.

Uvediem príklad:

  • Máme pin, na ktorom je zavesený výstup z určitého snímača a tlačidlo. Výstup zo snímača môže byť 0, 1 v aktívnom režime a Hi-Z, keď na snímač nedorazí signál Enable.
  • Tlačidlo dáva linke tvrdú 0 cez skrat.

Ako by to malo fungovať:
Povedzme, že väčšinu času máme vstup mikrokontroléra nakonfigurovaný na vstup Hi-Z a snímame údaje zo senzora, na ktorý je tiež aplikovaný signál Enable. Keď potrebujeme vyzvať tlačidlo, zoberieme Enable zo snímača a jeho výstupy prejdú do režimu Hi-Z a neprekážajú nám. Výstup mikrokontroléra prepneme do Pull-Up módu a skontrolujeme, či je na vstupe nula - signál stlačeného tlačidla. skontrolovali ste? Vstup MK prenesieme na vstup Hi-Z a na senzor opäť aplikujeme Enable. A toľkokrát za sekundu.

Máme tu dva rozpory:

  • Logický rozpor
    0 na linke môže byť v dvoch prípadoch zo snímača alebo z tlačidla. Ale v tomto prípade s použitím zdravého rozumu a požadovanej funkčnosti môžeme ignorovať logický rozpor.

    Budeme len vedieť, že stlačenie tlačidla skresľuje hodnoty snímača, čo znamená, že keď snímač funguje, tlačidlo nestlačíme. A aby nedošlo k zámene hodnôt snímača so stlačením tlačidla, jednoducho tlačidlo nezvolíme v momente, keď čakáme na údaje zo snímača. To samozrejme nechráni pred hlúpymi činmi. Ale na zjednodušenie príkladu teraz neberiem do úvahy spoľahlivú ochranu.

  • Elektrický rozpor
    Ak senzor nastaví 1 a stlačíme tlačidlo, potom je zrejmé, že GND a Vcc v rovnakom vodiči sa nezhodnú a niekto zomrie. IN v tomto prípade výstup snímača odumrie, keďže je slabší - krehký tranzistor nemôže konkurovať medenému tlačidlu.

    Takýto rozpor nie je možné vyriešiť organizačnými metódami - nie je možné určiť napätie na vedení očami a rozhodnúť sa, či stlačíte tlačidlo alebo nie. A dá sa len hádať, kde je program teraz. Preto to budeme riešiť schematicky.
    Pridajme k obvodu tlačidla odpor, odpor je malý, vypočítaný na základe maximálneho prúdu najslabšej svorky linky.

    Ak napríklad výstup snímača nemôže poskytnúť viac ako 10 mA, potom potrebujeme taký odpor, aby prúd cez neho z Vcc do GND neprekročil túto hodnotu. Pri 5 voltovom napájaní to bude 510 ohmov. Teraz, aj keď je log1, vysoká úroveň na riadku zo strany snímača, potom stlačenie tlačidla nespôsobí ani skreslenie logickej úrovne, pretože odpor je navrhnutý s ohľadom na maximálne zaťaženie portu

Príklad sa ukázal byť trochu chaotický, ale myslím, že podstata je jasná. Chcem, aby ste videli a pochopili nielen ako sa to robí, ale aj prečo sa to robí :)

Niekoľko príkladov niekoľkých funkcií na jednej nohe:
po prvé, ISP konektor. Dávno som zabudol, aké to bolo strčiť mikrokontrolér najprv do bloku programátora, potom do dosky, potom späť a tak ďalej, až kým neodladíte program. Na doske mi trčí 6 pinov ISP konektora a pri ladení je programátor vždy zasunutý do dosky a program mením niekedy aj niekoľkokrát každých 10 minút. spýtal som sa a skontroloval. Nefunguje? Opravil som to, znova preblikol... A tak ďalej, kým to nefunguje. Zdroj MK na blikanie sa počíta v tisícoch krát. Ale konektor ISP zaberá kolíky. Až 3 kusy - MOSI, MISO, SCK.

Na tieto špendlíky môžete v zásade pripevniť aj gombíky. V tomto prípade nebude nikto nikoho obťažovať, hlavnou vecou nie je stlačiť tieto tlačidlá počas firmvéru. Môžete tiež zavesiť LED diódy (aj keď v tomto prípade môže tá najjednoduchšia zlyhať, ale dobre urobené!), potom pri blikaní firmvéru budú veľmi veselo blikať :)))

Na linku pod ISP môžete zavesiť aj niečo iné, hlavné je aby sa pri flashovaní firmvéru toto NIEČO zrazu nezačalo čudovať. Napríklad riadenie 100-kilogramového manipulátora visí na ISP linke a počas firmvéru dostalo kopu šialených dát – takže sa môže zblázniť a rozbiť niekomu hlavu. Treba myslieť všeobecne. Ale s niečím, čo funguje cez rozhranie zbernice, bude fungovať nasledujúca schéma:

Prepneme výstup z 0 na 1 a zapneme hornú a spodnú diódu. Ak potrebujeme rozsvietiť obe, tak jednoducho prepneme výstup mikrokontroléra do režimu Ahoj-Z a je to ako keby tam nebolo a diódy budú horieť priechodným prúdom. Alebo rýchlo prepínať diódy medzi sebou, v tom prípade obe zhoria od oka. Nevýhoda obvodu je zrejmá - diódy sa nedajú zhasnúť. Ale ak by podľa plánu mal aspoň jeden zhorieť, tak prečo nie? UPD: Potom ma napadlo, že je možné vybrať LED a rezistory tak, aby ich celkový úbytok napätia bol na úrovni napájacieho napätia a celkové odpory v tomto prípade poženie prúd na takú minimálnu úroveň, že keď je noha v Hi- Z sa diódy nerozsvietia vôbec. Aspoň na pohľad to nebude vôbec viditeľné. Ibaže v úplnej tme.

Ďalšia možnosť nešetrí nohy, ale umožňuje vám zjednodušiť rozloženie dosky plošných spojov bez pretiahnutia napájacej alebo uzemňovacej zbernice k dvom diódam:

Aplikovaním podobnej taktiky na tlačidlá môžete buď zjednodušiť zapojenie, alebo rozmiestniť 6 tlačidiel pozdĺž troch nôh.
Aj tu je všetko jednoduché - jedna noha dáva zdvih, druhá ju kosí až na zem. Stlačením tlačidla dôjde k poklesu napätia na vyťahovacej nohe. Program to zaznamená a postupne vyzve každé tlačidlo. Potom sa úlohy nôh zmenia a ďalšie tlačidlo sa vyzve.

V šesťtlačidlovom režime je situácia podobná – jedna noha dáva zdvih, druhá zem a tretia sa tvári ako Hi-Z handra a neodráža sa. Ale je tu jeden vedľajší účinok. Napríklad sa pýtame na tlačidlo „B“. Za týmto účelom umiestnime horný riadok na vchod s ťahadlom(PORTxy=1, DDRxy=0), priemer dáva nízka výstupná úroveň(PORTxy=0, DDRxy=1), ten nižší sa procesu nezúčastňuje, pretože je in Ahoj-Z(PORTxy=0, DDRxy=0). Ak stlačíme tlačidlo „B“, tak sa v tom momente prehne horný riadok a program pochopí, že je stlačené tlačidlo „B“, ak však nestlačíme „B“, ale stlačíme „E“ a „B“ ” zároveň sa prehne aj horný riadok a program si bude myslieť, že bolo stlačené „B“, hoci tam neležalo. Nevýhody tejto schémy spočívajú v tom, že kliknutia môžu byť spracované nesprávne. Takže ak bude zariadenie používať operátori z radov robotníkov, ktorí používajú všetko bez rozdielu, potom je lepšie opustiť takúto schému.

A nakoniec, schéma ukazujúca, ako môžete skombinovať tlačidlo a LED:


Funguje to aj výlučne v dynamike. To znamená, že vždy zobrazujeme stav LED - to znamená, že na port vydáme buď 0 (dióda svieti) alebo Hi-Z (dióda nesvieti). A keď potrebujeme vyzvať tlačidlo, dočasne (na niekoľko mikrosekúnd) prepneme výstup do režimu pull-up vstupu (DDRxy=0 PORTxy=1) a počúvame tlačidlo. Režim, keď je na kolíku silná vysoká úroveň (DDRxy=1 PORTxy=1) nemožno za žiadnych okolností aktivovať, pretože Keď stlačíte tlačidlo, môžete port vypáliť.

Nevýhody - po stlačení tlačidla sa rozsvieti LED dióda bez ohľadu na to, ako sa na ňu pozeráte. To však nemusí byť chyba, ale vlastnosť :)

Toto sú koláče. Teraz si predstavte program, ktorý implementuje všetky tieto dynamické funkcie + množstvo vlastných algoritmov. Ukazuje sa buď nekonečná séria ankiet, alebo légia najrôznejších vlajok. V takýchto prípadoch je najjednoduchším odoslaním alebo kooperatívnym odoslaním presne to, čo nariadil lekár – každý prieskum spustíte v rámci cyklu svojej úlohy a nemusíte sa obávať. Ale všade používaš nejaké ATTiny2313 a sarkasticky sa pozeráš na tých, ktorí do tej istej úlohy strčia Mega8 alebo niečo tučnejšie :)

Nič neviem a bojím sa niečo spáliť, čo mám robiť???

Neboj sa a urob to. Koniec koncov, mikrokontrolér nie je taká drahá záležitosť, že by ste mali oplakávať jeho smrť. Vyhodil som ho do koša a z vrecka som vybral nový. V najhoršom prípade, ak je to naozaj strašidelné, môžete si kúpiť hotovú demo dosku, na ktorej je už všetko spájkované a zapojené tak, ako má. Stačí naprogramovať a vidieť výsledok.

A potom na príklade toho, ako prebiehala demo platba, skúste urobiť niečo vlastné. Samotná demo doska je mikrokontrolér + nejaké štartovacie periférie, čo stačí na množstvo jednoduchých experimentov a môže uľahčiť zapojenie a štúdium iných zariadení. Existujú rôzne demo dosky, napríklad značkové systémy ako STK500 alebo AVR Butterfly, alebo môj, ktorý bol navrhnutý na základe mojich skúseností a na ktorom bude celý ďalší kurz založený.

V poslednej dobe sa na Habrém objavilo veľa článkov o STM32 (). V komentároch sa opakovane spomína zložitosť STM32 v porovnaní s AVR. Táto téma sa týka najmä začiatočníkov, ktorí sa chcú začať učiť mikrokontroléry, a keď videli tento názor, vyberte si AVR na štúdium. Pozrime sa, či je táto šelma - STM32 - taká komplikovaná?

Aby sme to dosiahli, vyberieme si lacnú verziu dosky a napíšeme firmvér v desiatkach alebo dvoch bajtoch (áno, blikanie 2 kilobajtovej LED diódy je pre neschopných podobné „Hello world“ v stovkách kilobajtov x86). Naučíme sa tiež písať programy v akomkoľvek programovacom jazyku pre STM32.

Úvod

Aký typ mikrokontrolérov by som mal študovať? Táto otázka je podľa mňa podobná otázkam ako „Aký programovací jazyk sa mám naučiť?“, „Aký cudzí jazyk sa mám naučiť?“ IMHO si treba naštudovať tú, ktorá je v danej chvíli najpotrebnejšia, na danú úlohu. Keď viete jednu vec, naučiť sa druhú bude oveľa jednoduchšie a na tretiu nebudete ani myslieť.

Aká je teda obtiažnosť STM32? Najčastejším názorom je, že programovanie jeho periférií je náročné. Počet a typ periférií STM32 a AVR sú približne rovnaké. Jeho konfigurácia sa tiež veľmi nelíši. Aká je teda obtiažnosť? V mikrokontroléroch STM32 je potrebné najskôr zapnúť všetky periférie. To je celá obtiažnosť.

Porovnávam AVR s verejnými budovami: všetky dvere sú otvorené dokorán, všade sa monitory lesknú reklamou a svietia svetlá a STM32 so súkromným domom: ak chcete pozerať televíziu, najprv si ju zapnite, potom zmeňte kanály, ak chcete chcete cikať, otvorte dvere a zapnite svetlo, umyte si ruky - otvorte vodu atď. neveríš mi? Presvedčime sa spolu.

Prehľad dosky

Vybral som si najlacnejšiu dosku ponúkanú na aliexpress (obrázok vyššie). O niečo drahšie 2 doláre, 180 rubľov v decembri 2015. Na palube je minimálne vybavenie: dva kremenné rezonátory - vysokofrekvenčné 8 MHz a hodiny na 32,768 Hz, tlačidlo reset, dva prepojky na výber režimu zavádzania, pár LED - pre napájanie a na nohe PC13 a sadu konektorov: microUSB, debug, dva hrebienky pre všetky piny mikrokontroléra.

Je lacnejšie jednoducho kúpiť všetky diely, vyrobiť si dosku a prispájkovať ju. Ako šiť a ladiť? Ak máte ST-LINK, tak je to pre nich lepšie, nie, nevadí, možností je ešte niekoľko, napríklad cez USB-USART adaptér neexistuje - môžete priamo cez USB, hoci treba si pre tento pripad napisat ovladac sam, zatial to nikoho nenapadlo. ST-LINK je pomerne lacný a je súčasťou všetkých dosiek série DISCOVERY. Tak som použil tento.

Pripojíme napájanie, LED dióda veselo bliká, doska funguje. Stiahnite si a nainštalujte program programátora (olej-olej) „STM32 ST-LINK Utility“ (všetky programy a dokumenty preberáme z webovej stránky výrobcu). Pokúšame sa prečítať firmvér... Program je chránený pred čítaním. Zdá sa, že nie nadarmo všetci hovoria o ťažkostiach pri písaní programov pre STM32; dokonca aj Číňania chránili tento mimoriadne zložitý program pred hackermi. Alebo je tam skrytá záložka vírusu? Neprídeme na to, odstránime ochranu a získame nedotknutý mikrokontrolér STM32F103C8T6.

Prvý program

Zablikajme tiež LED diódou a urobme takpovediac reverzné inžinierstvo v mysli natívneho firmvéru. Ako? Aby som nevyvolal polemiku ohľadom výberu vývojového prostredia, urobím to v mojej rodnej komunite Visual Studio. Zdá sa mi, že pre Windows je lepší pre muža č.

Aký je program blikania pre Arduino? Konfigurujeme výstupnú nohu a prepíname ju v cykle z nuly na jednotku a späť.
Ako to bude vyzerať pre STM32? Oveľa ťažšie. Najprv zapnime svetlo v miestnosti na konfiguráciu kolíkov mikrokontroléra a potom „Nakonfigurujeme nohu na výstup a prepneme ju v cykle z nuly na jednotku a späť. Chápem, že je to ťažké, ale zvládneme to.

V dokumente „RM0008. Reference Manual" na našom mikrokontroléri, pozrime sa na pamäťovú mapu registrov, ktoré potrebujeme.

- Poďme jednoducho a logicky.
- Poďme spolu.

1. Zapnite taktovanie portu C (naša LED visí na kolíku 13 portu C). Pozrime sa na dokument. Register, ktorý potrebujeme, je RCC_ABP2ENR (prekladáme: resetovací a hodinový register je druhá nízkorýchlostná periférna zbernica). Adresa portu je 0x40021018, požadovaný bit IOPCEN (I/O port C - bit povolenia), štvrtý je 0x00000010.

Ustúpiť

Mikrokontroléry majú všetko ako procesory pre dospelých. Existuje vysokorýchlostná pneumatika AHB alias „North Bridge“ a nízkorýchlostná pneumatika APB alias „South Bridge“. Samotný procesor mikrokontroléra dokáže urobiť všetko pre urýchlenie práce: má predvýber príkazov a kanál na vykonávanie príkazov. Neexistuje žiadna vyrovnávacia pamäť, ale procesor nie je oveľa rýchlejší ako pamäť a čítanie a zápis do pamäte je možné dokončiť v jednom hodinovom cykle. Dá sa teda povedať, že celá pamäť mikrokontroléra je jedna veľká vyrovnávacia pamäť. Dobre, dobre, nie jeden a nie veľký. Dve malé kešky.
Všetky periférne zariadenia sú mapované do adresného priestoru. V porovnaní s x86 chýbajú in-out príkazy, no Intel ich nechal len kvôli kompatibilite, teraz sa už prakticky nepoužívajú.


2. Nakonfigurujte kolík pre výstup. Pozrime sa na dokument. Register, ktorý potrebujeme, je GPIOC_CRH (prekladáme: register C I/O portu je konfiguračný register pre staršiu polovicu nôh). Adresa portu je 0x40011004, za konfiguráciu každej vetvy sú zodpovedné 4 bity, hodnota pre prepnutie vetvy na výstup je 0001b, pre pin 13 je hodnota 0x00100000.

3. Ako prepnúť booleovskú hodnotu na pine. Pozrime sa na dokument. Register, ktorý potrebujeme, je GPIOC_ODR (prekladáme: register I/O portu C - register výstupu dát). Adresa portu je 0x4001100C, jej hodnota je priamo vyvedená na piny mikrokontroléra, pre pin 13 je hodnota 0x00002000. Všetko je pripravené na napísanie programu (nezabudnite poslať projekt na github):

Int Main (VOID) ( *((int *) 0x40021018) = 0x00000010; // RCC_apb2enr = RCC_APB2ENR_IOPCEN *((Int *) 0x40011004) = 0x001000004 (dlaždica MODEL) (vstupe: *Vol_TER_PIC1000; // GOLD *) 0x4001100C ) ^= 0x00002000; // GPIOC_ODR ^= BIT_13 int i; for (i=1000000; i>0; i--) ; ) ) extern int _eram; __attribute__ ((sekcia(".isr_vector"))) int g_pfnVectors = ( (int)&_eram, // počiatočná hodnota zásobníka (int)main // Reset Handler );
Dúfam, že s vektormi prerušenia je všetko jasné? Používame len dve z nich, takže nie je potrebné plytvať pamäťou figurínami. Všetky ostatné prerušenia sú povolené softvérom; ak nie sú povolené, znamená to, že nikdy nebudú fungovať. Výnimkou je tretí vektor HardFault, ak sa to stane - mikrokontrolér je chybný alebo nefunkčný, pre jednoduché projekty (nie vesmírne letectvo, nie medicína) ho nemožno spracovať.

Toto je vzdelávací projekt, samozrejme by ste mali formátovať všetky adresy ako symbolické konštanty samostatný h-súbor s veľké množstvo ako sa to robí v CMSIS. Môžete si ich vziať a prispôsobiť svojim potrebám. Na kompiláciu používam gcc, firmvér pomocou „STM32 ST-LINK Utility“. Firmvér zabral 56 bajtov (ahoj, assembler).

Ďalší ústup

Ďalším tvrdením o zložitosti STM32 je, že v ruštine je málo dokumentácie. Diskutabilné. Potrebné sú len dva dokumenty – Datasheet a Reference Manual pre požadovaný mikrokontrolér. Jazyk, v ktorom je napísaná, možno len ťažko nazvať angličtinou. Jazyk som študoval pomocou nepreložených hračiek, moja úroveň angličtiny zostala na rovnakej úrovni, ale bez problémov som čítala datasheety, neznáme pojmy sú jasné z kontextu.



Zdá sa, že sa toho stalo veľa, a to je na dnes všetko.

V druhej polovici budem hovoriť o programovaní STM32 v akomkoľvek programovacom jazyku.

Štítky: STM32, mikrokontroléry-sú jednoduché, arduino-nepotrebné

Jedného dňa som sa rozhodol upgradovať svoj rad vývojových dosiek. Momentálne necítim žiadnu osobitnú potrebu pracovať s novými ovládačmi, takže bolo rozhodnuté urobiť zásadne odlišné ladenie. V ňom som chcel implementovať nasledujúce funkcie:

Príležitosť životnosť batérie. Niekedy si naozaj chcete vziať nejaké zariadenie so sebou „na prechádzku“ alebo do práce, ale predchádzajúce dosky vyžadovali externé napájanie. Chcel by som, aby zdroj bol na samotnej doske.

Použite dostatočne výkonný čip. Keďže som dlho používal svoje ladenie na stm32f100, ako projekty postupovali, uvedomil som si, že chcem čipy využiť na maximum. Keďže mi možnosti posledného nestačili (málo nôh a nízka frekvencia 24 MHz), rozhodol som sa prejsť na o niečo väčší čip: STM32F103, na ktorom som už úspešne ladil, no nebol veľmi používaný. .

Použite batérie 18650, ktoré tak milujem pre ich pomer kapacita/cena.

Použite vstavaný mini-usb ovládač napájania na MCP73833. Chcel som skúsiť vyrobiť továrenskú dosku s dobrým odvodom tepla z čipu a zistiť, čo dokážem pretaktovať tento ovládač nabíjať bez externého radiátora.

Použite môj obľúbený TPS63000 na vytvorenie 3,3V linky. Nie je to veľmi efektívny regulátor výkonu, pokiaľ ide o prúd naprázdno, ale funguje ako konvertor boost/buck, ktorý umožňuje využiť všetku energiu batérie pri výstupe vysokého prúdu (jednotky ampérov).

Označte všetky signálne kolíky dosky.

No, maličkosti:

Quartz 5032 (ani jedna porucha počas celej operácie)

Smd0603+conders 0805 na najmenších stopách.

Oddelenie analógového a digitálneho uzemnenia v zariadení

Konektory s rozstupom 2,54 typu samica (PBS20), aby som do mojich plieškov vyrobených s korisťou mohol nainštalovať tie, ktoré mám v veľké množstvá Konektory sú rovnakého typu, ale samec (lacnejšie).

Úplne jednostranné spájkovanie (okrem batériových konektorov).

Testovanie DC-DC meniča.

Potom som začal testovať. Na tento účel som špeciálne kúpil odpor SQP5-4R7 na testovanie DC-DC regulátora na prúd ~1A. V dôsledku testov sa odpor zahrial na 110 * C (rozpoznané pyrometrom), čo viedlo k určitému poklesu odporu a zvýšeniu prúdu na 1A.

V dôsledku toho sa zistilo, že nedošlo k žiadnemu dodatočnému šumu a celý systém fungoval ako hodinky. Zároveň teplota DC-DC menič je v rozmedzí 35-40*C pri vonkajšej teplote +27*C. Samozrejme, chápem, že so zvyšujúcim sa zaťažením sa zvýšia aj pulzácie, ale myslím si, že keď z elektrického vedenia mikrokontroléra funguje dostatočné výkonové zaťaženie, nebude potrebná špeciálna presnosť analógovej časti.

Testovanie nabíjačky.

Úprimne povedané, toto je prvýkrát, čo som sa rozhodol vyrobiť komerčne vyrábanú dosku s MCP73833. Minule som sa pozrel na to, ako sa tento ovládač vo všeobecnosti nabíja a funguje + sa v praxi oboznámil s algoritmom jeho fungovania. V tomto prípade, keďže sa blížila promócia a ja som to naozaj chcel vyskúšať, som jednoducho rozobral predchádzajúci poplatok a opatrne preniesol všetky komponenty do nového. V dôsledku toho som pri nabíjaní batérie po predchádzajúcom teste zaznamenal, že pri nabíjacom prúde 375 mA teplota regulátora nabíjania nedosiahla ani 45 * C. To naznačuje, že môžete bezpečne prespájkovať odpor riadenia nabíjania, aby ste zvýšili nabíjací prúd. Zvýšim to na 500mA, ale ďalej už nepôjdem. Nie je to spôsobené teplom, ktoré sa bude uvoľňovať na čipe, ale tým, že nie všetkých mojich päť voltové bloky napájacie zdroje pre mobilné telefóny poskytujú viac ako 500 mA. V tých, na ktoré som sa pozrel, nie sú žiadne špeciálne ochrany, čo môže viesť k problémom v elektrickej sieti.

Nevýhody vyvinutej dosky.

Po vykonaní týchto testov a tiež pri predstave, ako by som s touto doskou v budúcnosti pracoval, sa ukázalo niekoľko faktorov, ktoré som v tomto projekte nezohľadnil:

Nemal som dostatok skúseností s trasovaním na inštaláciu vypínača na batériu v tejto doske plošných spojov. Samozrejme, môžem to urobiť veľmi dobre vytiahnutím 18650 z konektora alebo inštaláciou špeciálnej plastovej dosky. Ale toto je barlička, priatelia. Bolo by pekné dokončiť prepínač.

Na doske nie je BMS pre batériu, aj keď je potrebná. Čisto technicky TPS63000 pracuje v rozsahu vstupného napätia 1,8-6V. To je možné, ak je batéria hlboko vybitá a povedie to k jej poškodeniu. Tento problém sa dá vyriešiť nejakou úpravou samotnej batérie a inštaláciou lacného bms priamo na batériu so zatlačením/odstrihnutím jedného z kontaktov. Opäť nie kriticky, ale s barlami.

IN USB konektor Cez digitálne linky nie je nič pripojené. Tento ovládač má zabudované USB rozhranie, no nepripojil som ho ku konektoru. Je to spôsobené tým, že v súčasných projektoch to nie je potrebné a musí sa nainštalovať normálne potrubie usb rozhranie na doske (s ochrannými diódami a mikroobvodom na prispôsobenie úrovne, nikdy predtým som to nevidel).

Na doske nie je žiadna PowerGood LED. Keď čip funguje, nič o tom nehovorí. Bolo to urobené zámerne, aby sa predĺžila životnosť batérie, ale niekedy to nie je vhodné. V budúcnosti uvažujem o vytvorení LED na málo používanom kolíku a poskytnutí odkazu na kód na zapnutie LED, keď je ovládač v prevádzke

Nedostatočná kompaktnosť dosky. Aktuálne rozmery dosky sú 34x80 mm. Vždy chcete kompaktnejšie riešenie. Snáď to vyjde. Aj keď na druhej strane na zadnej strane plošného spoja nie je veľa miesta.

Niektorým sa zdá, že programovací konektor a resetovacie tlačidlo nie sú príliš pohodlné. Je ťažké ho dosiahnuť, keď je doska vo vnútri, ale opäť môžete použiť skrutkovač (barle).

Cena zariadenia je pomerne vysoká. Robil som prototypovú výrobu v paneli, takže cena je znížená, ale čert má ďaleko od čínskeho arduina/stmka za 200 rubľov.

Každý, kto chce niečo také pre seba.

V súčasnosti existujú 2 takéto dosky, takže si ich môže kúpiť ktokoľvek za 1 700 rubľov bez dopravy a batérie 18 650. Prečo batériu nepošlem? – je to záležitosť Ruskej pošty. Bol by som rád, keby poslali batérie, aj keď prvému, kto si objedná, skúsim poslať jednu plechovku 18650 s prístrojom zadarmo.

Kontaktovať ma môžete mailom: [chránený e-mailom]

Z môjho pohľadu o cene: teraz za tieto peniaze kúpite originálne Arduino alebo Discovery z Číny. Bez externej súpravy karosérie a batérií si však so sebou na celý deň nemôžete vziať ani jedno, ani druhé. A tu dostanete hotovú vec, do ktorej môžete vložiť svoju dosku a získate veľmi tuhú konštrukciu, ktorú môžete bezpečne nosiť so sebou bez obáv, že sa vám niekde odlepí spájka alebo dôjde ku skratu zariadenia.

Obrázok 1. Schéma zapojenia dosky STM32F103RC

Nejaké zjemnenie. Verzia 1.0.

Stalo sa tak, že pri príprave dosky na prvý predaj (nie moja spájkovaná vzorka vyššie) som sa rozhodol pridať k nej množstvo funkcií pre spotrebiteľa.

Na prvý pohľad vyniknú nasledovné veci:

Neexistuje žiadny „hrebeň“ PBS-30 na vloženie vytlačená obvodová doska. Na moje poľutovanie tu pôsobia 2 faktory (došli mi a zákazník požiadal, aby ich neinštaloval.

Programovací konektor je vyrobený s rôznymi uhlovými kolíkmi. Minule som chcel použiť aj takéto špendlíky, ale v obchode, ktorý mám k dispozícii, ich nemal. V dôsledku toho som sa náhodou dostal na jeden z moskovských rádiových trhov, kde som našiel najširší výber týchto konektorov a kúpil som si tie, ktoré som potreboval.

LED diódy sú trochu iné. Na moje poľutovanie beriem SMD LED z veľkej hromady a nie vždy viem, akú majú farbu. Tentokrát sú tu dve zelené a jedna biela LED dióda.

Ale diabol je často v detailoch, a tak to tu dopadá. Na tejto doske som skúšal rôzne odpory na ovládanie nabíjacieho prúdu. V dôsledku toho sa zistilo, že mikroobvod MCP73833 na tejto doske normálne drží prúd 800 mA a pri nabíjaní 2,5 V Li-Ion batériami sa zahrieva na 65-70 * C. Samozrejme, podľa údajového listu to funguje s prúdmi do 2A, ale úprimne si ešte neviem predstaviť, ako ich implementovať do puzdra msop-10. Možno v ďalšom prípade, v ktorom sa tento problém vyrieši lepšie, bude možné vytiahnuť 2A.

Ďalším malým detailom, ktorý si len málokto všimne, je inštalácia tlmivky Murata a nie jej čínskeho dvojča s neznámym názvom. Vyzerajú podobne, len tento je lepšie tienený.

Predbežné opatrenie.

Pri vykonávaní úplného diagnostického testu som vypálil jeden STM32F103RCT6. Ako som to urobil:

Vzal som obyčajný multimeter a strčil som ho do rezistora spätná väzba. V tomto prípade TPS63000 vidí pokles napätia v spätnej väzbe a začne rýchlo zvyšovať napätie na svojom výstupe. V dôsledku toho sa podľa testu vykonaného s utesneným ovládačom: napätie v impulze zvýšilo na 7V. V tomto prípade regulátor zaznamenal prepätie a zomrel.

Neskôr sa stala zábavná vec: na vstupe 3,6V začal regulátor spotrebovať 0,6A. Je to spôsobené tým, že TPS63000 má zabudovanú prúdovú ochranu 2 A. Práve tento prúd tiekol mŕtvym mikrokontrolérom. Zároveň bola zachovaná funkčnosť celého zvyšného okruhu.

Diagnostikovať tento problém je jednoduché: stačí pripojiť individuálny merací teplomer (prst) k ovládaču a ak sa začne zahrievať, znamená to, že je mŕtvy.

Balenie odoslanej dosky

Keď som túto tabuľu posielal kolegovi, rozhodol som sa ju lepšie zabaliť, aby R. Post všetko nerozbil. Nakoniec to dopadlo takto:





Ako pripojiť kapacitný dotykový senzor k mikrokontroléru. Tento nápad sa mi zdal celkom sľubný, niektorým zariadeniam by oveľa lepšie sedeli dotykové klávesy ako mechanické. V tomto článku budem hovoriť o mojej implementácii tejto užitočnej technológie založenej na vývojovej doske STM32 Discovery.

Takže, keď som práve začal ovládať STM32, rozhodol som sa pridať do zariadenia detekciu dotyku ako cvičenie. Keď som začal chápať teóriu a prax vo vyššie uvedenom článku, zopakoval som okruh súdruha "a. Fungovalo to perfektne, ale ja, milovník minimalizmu, som si to chcel zjednodušiť odstránením nepotrebných prvkov. Podľa mňa ,externý rezistor a napájacia cesta sa ukázali ako nadbytočné.Toto všetko už nájdeme vo väčšine mikrokontrolérov vrátane AVR a STM32.Mám na mysli pull-up odpory I/O portov.Prečo cez ne nenabíjať platňu a naše prsty ? V očakávaní úlovku som zostavil obvod na doštičku, ktorá na moje prekvapenie fungovala na prvýkrát. V skutočnosti je dokonca smiešne nazývať to obvod, pretože všetko, čo potrebujeme, je jednoducho pripojiť kontaktnú dosku k nohe ladiacej dosky.Všetku prácu vykoná mikrokontrolér.

Aký je program? Prvé dve funkcie:
Prvý privádza logickú „0“ na kolík snímača (nulový kolík registra C)

Void Sensor_Ground (void) ( GPIOC->CRL = 0x1; GPIOC->BRR |= 0x1; )

Druhý konfiguruje rovnaký výstup ako vstup s vytiahnutím na napájanie.

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

Teraz na začiatku cyklu dotazovania zavoláme Sensor_Ground() a chvíľu počkáme, kým sa vybije všetok zvyškový náboj na senzore do zeme. Potom vynulujeme premennú count, ktorá sa použije na výpočet doby nabíjania senzora a zavoláme Sensor_InPullUp().

Sensor_Ground(); Oneskorenie(0xFF); //jednoduchý počet prázdnych počítadiel = 0; Sensor_InPullUp();

Teraz sa snímač začne nabíjať cez vnútorný pull-up odpor s nominálnou hodnotou okolo desiatok KOhmov (30..50KOhm pre STM32). Časová konštanta takéhoto obvodu sa bude rovnať niekoľkým taktovacím cyklom, preto som vymenil kremenný rezonátor na ladiacej doske za rýchlejší, 20 MHz (mimochodom, hneď som si nevšimol, že na STM32 Discovery je kremeň sa mení bez spájkovania). Takže počítame cykly procesora, kým sa na vstupe neobjaví logický:

Kým(!(GPIOC->IDR & 0x1)) ( count++; )

Po opustení tejto slučky premenná počet uloží číslo úmerné kapacite senzorovej dosky. V mojom prípade s 20 MHz čipom je hodnota počtu 1, keď nie je žiadny tlak, 7-10 pri najľahšom dotyku, 15-20 pri normálnom dotyku. Zostáva len porovnať ju s prahovou hodnotou a nezabudnúť znova zavolať Sensor_Ground(), aby sa pri ďalšom cykle dotazovania už senzor vybil.
Výsledná citlivosť je dostatočná na to, aby s istotou rozpoznala dotyky na holých kovových podložkách. Pri zakrytí snímača listom papiera alebo plastu sa citlivosť zníži trikrát až štyrikrát, zreteľne sa rozpoznajú iba sebavedomé stlačenia. Na zvýšenie citlivosti v prípadoch, keď je potrebné senzor zakryť ochranným materiálom, môžete zvýšiť taktovaciu frekvenciu mikrokontroléra. S čipom série STM32F103, schopným pracovať na frekvenciách až 72 MHz, nebudú prekážkou ani milimetrové bariéry medzi prstom a snímačom.
V porovnaní s implementáciou „a môj prístup funguje oveľa rýchlejšie (asi tucet hodinových cyklov na dotaz jedného snímača), takže som program nekomplikoval nastavovaním prerušení časovača.

Na záver video demonštrujúce, ako senzor funguje.

Testovací program Main.c.

K mikrokontroléru

Ďakujeme užívateľovi za veľmi užitočný článok ARM mikrokontroléry STM32F. Rýchly štart s STM32-Discovery, užívateľovi za nápad a zrozumiteľný teoretický popis.

UPD. Po komentároch „a rozhodol som sa pozrieť na taktovanie a zistil som, že v predvolenom nastavení je STM32 Discovery nastavená na frekvenciu hodín
(HSE / 2) * 6 = 24 MHz, kde HSE je frekvencia externého kryštálu. V súlade s tým som zmenou quartz z 8 na 20 MHz prinútil úbohý STM pracovať na 60 MHz. Takže po prvé, niektoré závery zjavne nie sú úplne správne a po druhé, to, čo som robil, by mohlo viesť k poruchám čipu. v prípade takýchto porúch v mikrokontroléri existuje prerušenie HardFault, pomocou ktorého som skontroloval viac vysoké frekvencie. Čip teda začne zlyhávať až pri 70 MHz. Ale hoci radič spracováva tento konkrétny program na 60 MHz, pri používaní periférií alebo práci s Flash pamäťou sa môže správať nepredvídateľne. Záver: berte túto tému ako experiment, opakujte ju len na vlastné nebezpečenstvo a riziko.

V poslednej dobe sa na Habrém objavilo veľa článkov o STM32 (). V komentároch sa opakovane spomína zložitosť STM32 v porovnaní s AVR. Táto téma sa týka najmä začiatočníkov, ktorí sa chcú začať učiť mikrokontroléry, a keď videli tento názor, vyberte si AVR na štúdium. Pozrime sa, či je táto šelma - STM32 - taká komplikovaná?

Aby sme to dosiahli, vyberieme si lacnú verziu dosky a napíšeme firmvér v desiatkach alebo dvoch bajtoch (áno, blikanie 2 kilobajtovej LED diódy je pre neschopných podobné „Hello world“ v stovkách kilobajtov x86). Naučíme sa tiež písať programy v akomkoľvek programovacom jazyku pre STM32.

Úvod

Aký typ mikrokontrolérov by som mal študovať? Táto otázka je podľa mňa podobná otázkam ako „Aký programovací jazyk sa mám naučiť?“, „Aký cudzí jazyk sa mám naučiť?“ IMHO si treba naštudovať tú, ktorá je v danej chvíli najpotrebnejšia, na danú úlohu. Keď viete jednu vec, naučiť sa druhú bude oveľa jednoduchšie a na tretiu nebudete ani myslieť.

Aká je teda obtiažnosť STM32? Najčastejším názorom je, že programovanie jeho periférií je náročné. Počet a typ periférií STM32 a AVR sú približne rovnaké. Jeho konfigurácia sa tiež veľmi nelíši. Aká je teda obtiažnosť? V mikrokontroléroch STM32 je potrebné najskôr zapnúť všetky periférie. To je celá obtiažnosť.

Porovnávam AVR s verejnými budovami: všetky dvere sú otvorené dokorán, všade sa monitory lesknú reklamou a svietia svetlá a STM32 so súkromným domom: ak chcete pozerať televíziu, najprv si ju zapnite, potom zmeňte kanály, ak chcete chcete cikať, otvorte dvere a zapnite svetlo, umyte si ruky - otvorte vodu atď. neveríš mi? Presvedčime sa spolu.

Prehľad dosky

Vybral som si najlacnejšiu dosku ponúkanú na aliexpress (obrázok vyššie). O niečo drahšie 2 doláre, 180 rubľov v decembri 2015. Na palube je minimálne vybavenie: dva kremenné rezonátory - vysokofrekvenčné 8 MHz a hodiny na 32,768 Hz, tlačidlo reset, dva prepojky na výber režimu zavádzania, pár LED - pre napájanie a na nohe PC13 a sadu konektorov: microUSB, debug, dva hrebienky pre všetky piny mikrokontroléra.

Je lacnejšie jednoducho kúpiť všetky diely, vyrobiť si dosku a prispájkovať ju. Ako šiť a ladiť? Ak máte ST-LINK, tak je to pre nich lepšie, nie, nevadí, možností je ešte niekoľko, napríklad cez USB-USART adaptér neexistuje - môžete priamo cez USB, hoci treba si pre tento pripad napisat ovladac sam, zatial to nikoho nenapadlo. ST-LINK je pomerne lacný a je súčasťou všetkých dosiek série DISCOVERY. Tak som použil tento.

Pripojíme napájanie, LED dióda veselo bliká, doska funguje. Stiahnite si a nainštalujte program programátora (olej-olej) „STM32 ST-LINK Utility“ (všetky programy a dokumenty preberáme z webovej stránky výrobcu). Pokúšame sa prečítať firmvér... Program je chránený pred čítaním. Zdá sa, že nie nadarmo všetci hovoria o ťažkostiach pri písaní programov pre STM32; dokonca aj Číňania chránili tento mimoriadne zložitý program pred hackermi. Alebo je tam skrytá záložka vírusu? Neprídeme na to, odstránime ochranu a získame nedotknutý mikrokontrolér STM32F103C8T6.

Prvý program

Zablikajme tiež LED diódou a urobme takpovediac reverzné inžinierstvo v mysli natívneho firmvéru. Ako? Aby som nevyvolal polemiku ohľadom výberu vývojového prostredia, urobím to v mojej rodnej komunite Visual Studio. Zdá sa mi, že lepší Windows pre muža neexistuje.

Aký je program blikania pre Arduino? Konfigurujeme výstupnú nohu a prepíname ju v cykle z nuly na jednotku a späť.
Ako to bude vyzerať pre STM32? Oveľa ťažšie. Najprv zapnime svetlo v miestnosti na konfiguráciu kolíkov mikrokontroléra a potom „Nakonfigurujeme nohu na výstup a prepneme ju v cykle z nuly na jednotku a späť. Chápem, že je to ťažké, ale zvládneme to.

V dokumente „RM0008. Reference Manual" na našom mikrokontroléri, pozrime sa na pamäťovú mapu registrov, ktoré potrebujeme.

- Poďme jednoducho a logicky.
- Poďme spolu.

1. Zapnite taktovanie portu C (naša LED visí na kolíku 13 portu C). Pozrime sa na dokument. Register, ktorý potrebujeme, je RCC_ABP2ENR (prekladáme: resetovací a hodinový register je druhá nízkorýchlostná periférna zbernica). Adresa portu je 0x40021018, požadovaný bit IOPCEN (I/O port C - bit povolenia), štvrtý je 0x00000010.

Ustúpiť

Mikrokontroléry majú všetko ako procesory pre dospelých. Existuje vysokorýchlostná pneumatika AHB alias „North Bridge“ a nízkorýchlostná pneumatika APB alias „South Bridge“. Samotný procesor mikrokontroléra dokáže urobiť všetko pre urýchlenie práce: má predvýber príkazov a kanál na vykonávanie príkazov. Neexistuje žiadna vyrovnávacia pamäť, ale procesor nie je oveľa rýchlejší ako pamäť a čítanie a zápis do pamäte je možné dokončiť v jednom hodinovom cykle. Dá sa teda povedať, že celá pamäť mikrokontroléra je jedna veľká vyrovnávacia pamäť. Dobre, dobre, nie jeden a nie veľký. Dve malé kešky.
Všetky periférne zariadenia sú mapované do adresného priestoru. V porovnaní s x86 chýbajú in-out príkazy, no Intel ich nechal len kvôli kompatibilite, teraz sa už prakticky nepoužívajú.


2. Nakonfigurujte kolík pre výstup. Pozrime sa na dokument. Register, ktorý potrebujeme, je GPIOC_CRH (prekladáme: register C I/O portu je konfiguračný register pre staršiu polovicu nôh). Adresa portu je 0x40011004, za konfiguráciu každej vetvy sú zodpovedné 4 bity, hodnota pre prepnutie vetvy na výstup je 0001b, pre pin 13 je hodnota 0x00100000.

3. Ako prepnúť booleovskú hodnotu na pine. Pozrime sa na dokument. Register, ktorý potrebujeme, je GPIOC_ODR (prekladáme: register I/O portu C - register výstupu dát). Adresa portu je 0x4001100C, jej hodnota je priamo vyvedená na piny mikrokontroléra, pre pin 13 je hodnota 0x00002000. Všetko je pripravené na napísanie programu (nezabudnite poslať projekt na github):

Int Main (VOID) ( *((int *) 0x40021018) = 0x00000010; // RCC_apb2enr = RCC_APB2ENR_IOPCEN *((Int *) 0x40011004) = 0x001000004 (dlaždica MODEL) (vstupe: *Vol_TER_PIC1000; // GOLD *) 0x4001100C ) ^= 0x00002000; // GPIOC_ODR ^= BIT_13 int i; for (i=1000000; i>0; i--) ; ) ) extern int _eram; __attribute__ ((sekcia(".isr_vector"))) int g_pfnVectors = ( (int)&_eram, // počiatočná hodnota zásobníka (int)main // Reset Handler );
Dúfam, že s vektormi prerušenia je všetko jasné? Používame len dve z nich, takže nie je potrebné plytvať pamäťou figurínami. Všetky ostatné prerušenia sú povolené softvérom; ak nie sú povolené, znamená to, že nikdy nebudú fungovať. Výnimkou je tretí vektor HardFault, ak sa to stane - mikrokontrolér je chybný alebo nefunkčný, pre jednoduché projekty (nie vesmírne letectvo, nie medicína) ho nemožno spracovať.

Toto je vzdelávací projekt, samozrejme by ste mali formátovať všetky adresy ako symbolické konštanty v samostatnom h-súbore s veľkým počtom definícií, ako sa to robí v CMSIS. Môžete si ich vziať a prispôsobiť svojim potrebám. Na kompiláciu používam gcc, firmvér pomocou „STM32 ST-LINK Utility“. Firmvér zabral 56 bajtov (ahoj, assembler).

Ďalší ústup

Ďalším tvrdením o zložitosti STM32 je, že v ruštine je málo dokumentácie. Diskutabilné. Potrebné sú len dva dokumenty – Datasheet a Reference Manual pre požadovaný mikrokontrolér. Jazyk, v ktorom je napísaná, možno len ťažko nazvať angličtinou. Jazyk som študoval pomocou nepreložených hračiek, moja úroveň angličtiny zostala na rovnakej úrovni, ale bez problémov som čítala datasheety, neznáme pojmy sú jasné z kontextu.



Zdá sa, že sa toho stalo veľa, a to je na dnes všetko.

V druhej polovici budem hovoriť o programovaní STM32 v akomkoľvek programovacom jazyku.

Štítky: STM32, mikrokontroléry-sú jednoduché, arduino-nepotrebné