Obsah:

Takže naložíte bootloader STM32duino do „modrej pilulky“ Tak čo teraz ?: 7 krokov
Takže naložíte bootloader STM32duino do „modrej pilulky“ Tak čo teraz ?: 7 krokov

Video: Takže naložíte bootloader STM32duino do „modrej pilulky“ Tak čo teraz ?: 7 krokov

Video: Takže naložíte bootloader STM32duino do „modrej pilulky“ Tak čo teraz ?: 7 krokov
Video: Использование плат Digispark Attiny85 Mini Arduino: Урок 108 2024, Júl
Anonim
Vložíte teda bootloader STM32duino do svojho
Vložíte teda bootloader STM32duino do svojho
Vložíte teda bootloader STM32duino do svojho
Vložíte teda bootloader STM32duino do svojho

Ak ste si už prečítali moje návody vysvetľujúce, ako načítať bootloader STM32duino alebo inú podobnú dokumentáciu, vyskúšajte načítať príklad kódu a ….môže sa stať, že sa nič nestane.

Problém je v tom, že mnoho, ak nie všetky príklady "generického" STM32 nebudú fungovať ihneď po vybalení. Potom bude potrebné vykonať drobné zmeny, aby ste mohli pracovať vo svojej doske „Modrá pilulka“STM32.

Vyberiem 4 príklady kódu, aby som vysvetlil, čo je potrebné zmeniť a prečo. Kódy sú: „BlinkWithoutDelay“, „Fading“, „Dimmer“a „AnalogInSerial“.

Všimnite si, že som NIC nekódoval. Vydávam iba drobné zmeny v kódoch vytvorených:

David A. Mellis a neskoro upravené Tomom Igoem, Martim Bolivarom a v niektorých prípadoch Scottom Fitzgeraldom

Tom Igoe a neskoro upravený Bryanom Newboldom

Preto radšej ponechávam mená autorov aj v kódoch, ktoré upravujem, pričom si nechávam kredit za vytvorenie.

Krok 1: Kolíky a špendlíky … Prečo kód nefunguje?

Kolíky a špendlíky … Prečo kód nefunguje?
Kolíky a špendlíky … Prečo kód nefunguje?

Pozrime sa na pin „Modrá pilulka“STM32. Poznámka: kolíky sú identifikované ako PA1 alebo PC2 …. Niečo také.

Ak sa pozriete napríklad na kódový kód „BlinkWithoutDelay“, pin je deklarovaný ako „33“…. Prečo?

Mám podozrenie, že je to preto, že pán Marti Bolivar preniesol tento kód pre dosku MAPLE.

Myslím, že to nebolo jeho úmyslom nechať kód kompatibilný s doskami "Blue Pill".

Mini piny Maple a Maple sú číselne deklarované, podobne ako Arduino, aj keď používajú čísla ako 33, 24 a niektoré podobné tomuto.

Povedal som, že kód nefunguje? Moja chyba. Zostavte kód bez chyby a nahrajte ho správne do „Blue Pill“, takže podľa môjho názoru skutočne funguje, ale neočakáva sa použitie výstupu GPIO. Možno ani nie je k dispozícii.

V kóde sú teda potrebné malé zmeny, aby fungoval podľa očakávania.

Krok 2: Pojďme „definovať“niektoré piny…

Poďme
Poďme

Je osvedčenou praxou kódu deklarovať zdroje ako ľahko identifikovateľné alebo znamenajúce premenné alebo konštanty. Umožní vám to jednoduchšie porozumenie kódu a riešenie problémov.

Použil som deklaráciu pinov Arduino takto:

const int ledPin = 13;

…"

Ak sa vám páčim, možno si kladiete otázku: „Ako môžem deklarovať špendlíky s názvami ako PC13 ???“

Odpoveď je: Použite príkaz „#define“C.

Podľa nakreslenia vývodov je teda PC13 pin, ktorý máme na doske LED v „BluePill“. Aby som to použil, vyhlásil by som to takto, hneď po definícii knižníc (#include …) a pred čímkoľvek iným:

#define LedPin PC13

…"

Všimnite si, že NIE JE „;“ukončenie riadka, priradenie NOR "=".

Porovnajte oba kódy. Jeden je pôvodný príklad načítaný z IDE. Druhý je ten, ktorý som upravil tak, aby pracoval s „BluePill“.

Dôrazne odporúčam deklarovať všetky piny, ktoré plánujete použiť v kóde. Dokonca aj tí, ktorí ich chcú použiť ako vstup ADC (viac o tom neskôr).

To vám uľahčí život.

Krok 3: PinMode () … Ako budete používať svoje piny …

Predtým, ako budeme pokračovať, porozumieme funkcii PinMode ().

Rovnako ako Arduino, aj piny STM32 majú viacero funkcií. Najjednoduchší spôsob výberu jedného alebo druhého je pomocou príkazu pinMode ().

Arduino má k dispozícii iba 3 režimy, INPUT, OUTPUT alebo INPUT_PULLUP.

STM32 má naopak veľa príchutí pinMode (). Oni sú:

VÝSTUP -Základný digitálny výstup: keď je kolík VYSOKÝ, napätie sa udržuje na +3,3 V (Vcc) a keď je NÍZKE, stiahne sa na zem

OUTPUT_OPEN_DRAIN -V režime otvoreného odtoku pin ukazuje „nízky“prijatím toku prúdu k zemi a „vysoký“poskytnutím zvýšenej impedancie

INPUT_ANALOG -Toto je špeciálny režim, keď bude pin použitý na analógové (nie digitálne) čítanie. Umožňuje vykonať konverziu ADC na napätí na pine

INPUT_PULLUP -Stav kolíka v tomto režime je hlásený rovnakým spôsobom ako pri INPUT, ale napätie kolíka je jemne „vytiahnuté“smerom k +3,3 V

INPUT_PULLDOWN -Stav kolíka v tomto režime je hlásený rovnakým spôsobom ako pri INPUT, ale napätie kolíka je jemne „stiahnuté“smerom k 0v

INPUT_FLOATING -synonymum pre VSTUP

PWM -Toto je špeciálny režim, keď bude kolík použitý na výstup PWM (špeciálny prípad digitálneho výstupu)

PWM_OPEN_DRAIN -Rovnako ako PWM, okrem toho, že namiesto striedavých cyklov LOW a HIGH sa napätie na kolíku skladá zo striedajúcich sa cyklov LOW a plávajúceho (odpojeného)

(poznámka: extrahované z

Práve otváram túto zátvorku, pretože keď začnete vytvárať svoj vlastný kód, dávajte pozor, aby ste podľa potreby použili správny pinMode ().

Krok 4: AnalogWrite () versus PwmWrite () … Analógový výstup v 2 príchutiach

AnalogWrite () Versus PwmWrite () … Analógový výstup v 2 príchutiach
AnalogWrite () Versus PwmWrite () … Analógový výstup v 2 príchutiach
AnalogWrite () Versus PwmWrite () … Analógový výstup v 2 príchutiach
AnalogWrite () Versus PwmWrite () … Analógový výstup v 2 príchutiach

Pred použitím GPIO pinov „Blue Pill“je potrebné deklarovať jeho správanie, t.j. ako bude fungovať. Presne to robí funkcia pinMode ().

Teraz sa zamerajme na to, ako správne nastaviť analógový výstup. Môže byť deklarovaný ako režim VÝSTUPU alebo PWM.

Rovnakým spôsobom je možné GPIO priradiť analógové hodnoty dvoma spôsobmi: analogWrite () alebo pwmWrite (), ALE, analogWrite () BUDE fungovať iba vtedy, ak pinMode () = VÝSTUP. Na druhej strane, pwmWrite () BUDE fungovať iba vtedy, ak pinMode () = PWM.

Vezmime si napríklad PA0: je to kandidát na analógový/pwm výstup.

analogWrite (): toto sa deklaruje takto:

….

#define ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <číslo>);

……"

kde číslo musí byť medzi 0 a 255, napríklad Arduino. V skutočnosti je spätne kompatibilný s Arduino.

pwmWrite (): deklarujte takto:

#define ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <číslo.>);

…."

Tam, kde musí byť číslo medzi 0 ~ 65535, rozlíšenie oveľa vyššie ako Arduino.

Na obrázkoch je možné porovnať 2 kódy. Môžete tiež vidieť pôvodný kód.

Krok 5: Sériová komunikácia STM32

Sériová komunikácia STM32
Sériová komunikácia STM32

Pozrime sa, ako je v STM32 usporiadané rozhrania USART. Áno, rozhrania v množnom čísle ….

„Modrá pilulka“má 3 zariadenia USART (RX/ TX 1 ~ 3) a ak používate bootloader, ktorý vám umožňuje používať USB, k žiadnemu z nich nie je pripojený.

V závislosti od toho, či používate alebo nepoužívate USB, musíte vo svojom kóde deklarovať sériový port jedným alebo druhým spôsobom.

Prípad 1: Používanie USB:

Týmto spôsobom sa náčrty sťahujú priamo cez USB. Nie je potrebné presúvať prepojku BOOT0 do 1 polohy a späť do 0.

V tomto prípade, kedykoľvek prehlásite „Sériové“bez indexu, znamená to komunikáciu cez USB.

Sériové číslo 1 teda znamená TX/ RX 1 (piny PA9 a PA10); Sériové číslo 2 znamená TX/ RX 2 (kolíky PA2 a PA3) a sériové číslo 3 znamená TX/ RX 3 (kolíky PA10 a PA11).

Toto je spôsob, akým pracujeme. Zmeny v príkladoch pre tento spôsob kódovania predstavím.

Ďalšia vec: „Sériové USB“nie je potrebné inicializovať. Inými slovami, „… Serial.begin (15200);“nie je nutné.

Je možné zavolať akúkoľvek sériovú funkciu (Serial.read (), Serial.write () atď.) Bez akejkoľvek inicializácie.

Ak je z nejakého dôvodu prítomný v kóde, kompilátor ho bude ignorovať.

Prípad 2: Použitie adaptéra TTL série na USB:

Bootloader týmto spôsobom nepodporuje natívnu komunikáciu USB STM32, takže na nahrávanie náčrtov potrebujete adaptér USB na sériový port pripojený k TX/ RX 1 (kolíky PA9 a PA10).

V tomto prípade kedykoľvek „Sériové“bez indexu znamená kód, znamená to TX/ RX1 (port použitý na nahranie kódu). Takže ďalej, Serial1 označuje TX/ RX 2 (piny PA2 a PA3) a Serial2 označuje TX/ RX 3 (piny PA10 a PA11). Nie je k dispozícii žiadny sériový port 3.

Krok 6: Odovzdanie hodnoty mikrokontroléru

Odovzdanie hodnoty mikrokontroléru
Odovzdanie hodnoty mikrokontroléru

Príklad stmievača je jednoduchý spôsob, ako ukázať, ako sa má hodnota odovzdať mikrokontroléru.

Predpokladá sa, že na ovládanie jasu LED prejde hodnota od 0 do 255.

V Blue Pill NEBUDE fungovať podľa očakávania, pretože:

  1. Aby ste mohli používať funkciu pwmWrite (), MUSÍ byť pinMode () deklarovaný ako režim PWM.
  2. Nikdy nedostanete celé trojciferné číslo. Funkcia Serial.read () zachytáva iba obsah vyrovnávacej pamäte, čo je „BYTE“. ak zadáte „100“a stlačíte „Enter“, z vyrovnávacej pamäte sa zachytí iba posledných „0“. A jeho hodnota bude "48" (desatinná hodnota ASCII pre "0"). Ak chcete vydať hodnotu „100“, je potrebné napísať „d“. Je teda správne povedať, že bude prevádzať desatinnú hodnotu symbolu ASCII na jas LED, nie? … No, akýsi …
  3. Problém, hodnoty mapy priamo z funkcie Serial.read () sú trikové akcie. Je takmer isté, že získate neočakávané hodnoty. Lepším prístupom je obsah vyrovnávacej pamäte úložiska v dočasnej premennej a TEDY to mapovať.

Ako som už vysvetlil v bode 2, kód, ktorý zavádzam zmeny, umožní zadať symbol ASCII a tým sa bude riadiť jas diódy LED na základe jeho desatinnej hodnoty ASCII … napríklad „medzera“je hodnota 32 (v skutočnosti je najnižším tlačiteľným znakom, ktorý môžete zadať) a „}“je možné najvyššie (hodnota 126). Ostatné znaky sa nedajú vytlačiť, takže terminál nerozumie alebo je ich možné kombináciou znakov (napríklad „~“je mŕtvy kláves na mojej klávesnici a nebude fungovať správne). To znamená, že tento zložený znak po zadaní do terminálu odošle samotný znak a niečo iné. Obvykle netlačiteľný. A je to posledný, ktorý kód zachytí. Majte tiež na pamäti, že váš terminál by v tomto prípade NEMAL odosielať ani „návrat vozíka“, ani „informačný kanál“. Na správnu funkciu kódu musíte dávať pozor.

Ak ste spadli, je to trochu mätúce, bude to ešte horšie … …

Krok 7: A ak by som chcel napísať tri číslice …. alebo ešte viac ??

A ak by som chcel napísať tri číslice … alebo ešte viac ??
A ak by som chcel napísať tri číslice … alebo ešte viac ??

Prijímať viac znakov zo sériovej komunikácie nie je jednoduchá úloha.

Sériový buffer je FIFO bajtová hromada znakov. Kedykoľvek volá funkcia Serial.read (), prvý odoslaný znak sa odstráni z hromady a uloží sa na iné miesto. Obvykle je to premenná char v kóde. Všimnite si toho, že v závislosti od hardvéru zvyčajne existuje časový limit, ako môže vyrovnávacia pamäť denníka uchovávať informácie.

Ak máte v úmysle zadať viac ako jednu číslicu cez sériové číslo, budete musieť „zostaviť“reťazec po znakoch, keď sa dostanú do vyrovnávacej pamäte UART.

To znamená, že cyklicky načítajte každý znak vyrovnávacej pamäte, uložte ho do dočasnej premennej, načítajte ho na prvú pozíciu poľa reťazcov, presuňte sa na ďalšiu pozíciu a začnite odznova, kým … závisí od aplikácie. Cyklus možno ukončiť dvoma spôsobmi:

  1. Použite nejaký znak „koncovej značky“, ako napríklad „návrat vozíka“alebo „informačný riadok“. Hneď ako sa nájde znak „end Mark“, slučka skončí.
  2. Alternatívne môže byť obmedzený počet znakov v reťazci reťazcov, teda aj počet interaktívnych cyklov. Keď dosiahne limit, povedzme, 4, získajte rutinné povrchové úpravy sami.

Pozrime sa na jednoduchý príklad, ako to urobiť:

  • Nastavte znak „koniec“, napríklad „\ n“(to znamená znak ASCII riadkového kanála).
  • opakovanie cyklu Serial.available () je pravda
  • uloženie Serial.read () má za následok dočasnú premennú char. Pamätajte si: akonáhle Serial.read () skutočne "prečíta" vyrovnávaciu pamäť, je čistá a načíta sa do nej ďalší znak.
  • zvýšte reťazcovú premennú o túto char
  • Ak je posledný znak „koniec“, ukončite slučku.

Rutina na získanie poľa sériových znakov zvyčajne vyzerá ako obrázok.

Vychádzal z rozsiahlej úpravy pôvodného kódu pána Davida A. Mellisa.

Vychutnajte si používanie a vyskúšajte si to. Nezabudnite: hodnoty MUSIA byť zadávané vo formáte troch číslic.

Toto je nateraz. Nebudem sa rozširovať o ďalšie podrobnosti o sériovej komunikácii. Na to, aby sme sa tu mohli zaoberať, je príliš zložité a zaslúži si svoje vlastné nezničiteľné položky.

Dúfam, že vám to pomôže použiť príklady v Blue Pill a prinesie vám poučenie o správnom kóde pre túto malú tabuľu.

Uvidíme sa v iných pokynoch.

Odporúča: