Obsah:

Takže načtete zavaděč STM32duino do „modré pilulky“Tak co teď ?: 7 kroků
Takže načtete zavaděč STM32duino do „modré pilulky“Tak co teď ?: 7 kroků

Video: Takže načtete zavaděč STM32duino do „modré pilulky“Tak co teď ?: 7 kroků

Video: Takže načtete zavaděč STM32duino do „modré pilulky“Tak co teď ?: 7 kroků
Video: Jak si udělat instalační Windows 10 flešku (vytvoř si startovací USB systému) 2024, Prosinec
Anonim
Takže načtete bootloader STM32duino do svého
Takže načtete bootloader STM32duino do svého
Takže načtete bootloader STM32duino do svého
Takže načtete bootloader STM32duino do svého

Pokud jste si již přečetli moje instrukce vysvětlující, jak načíst bootloader STM32duino nebo jakoukoli jinou podobnou dokumentaci, zkuste načíst příklad kódu a….může se stát, že se vůbec nic nestane.

Problém je v tom, že mnoho, ne -li všechny příklady pro „generický“STM32 nebudou po vybalení fungovat. Než budete pracovat ve své desce „Modrá pilulka“STM32, budou nutné drobné změny.

Vyberu 4 příklady kódu, abych vysvětlil, co je třeba změnit a proč. Kódy jsou: „BlinkWithoutDelay“, „Fading“, „Dimmer“a „AnalogInSerial“.

Všimněte si, že jsem NIC nekódoval. Pouze vydávám drobné změny v kódech vytvořených:

David A. Mellis a pozdní úprava Tom Igoe, Marti Bolivar a některé případy Scott Fitzgerald

Tom Igoe a později upravil Bryan Newbold

Raději tedy ponechám jména autorů i v kódech, které upravuji, přičemž si ponechám kredit za vytvoření.

Krok 1: Piny a piny … Proč kód nefunguje?

Kolíky a kolíky … Proč kód nefunguje?
Kolíky a kolíky … Proč kód nefunguje?

Pojďme se podívat na pin „Blue Pill“STM32. Poznámka: piny jsou identifikovány jako PA1 nebo PC2…. Něco takového.

Když se podíváte například do kódu „BlinkWithoutDelay“, pin je deklarován jako „33“…. Proč?

Mám podezření, že je to proto, že pan Marti Bolivar přenesl tento kód pro desku MAPLE.

Myslím, že to nebylo jeho záměrem nechat kód kompatibilní s deskami "Blue Pill".

Pinové desky Maple a Maple mini jsou deklarovány číselně, jako Arduino, ačkoli používají čísla jako 33, 24 a některé podobné.

Řekl jsem, že kód nefunguje? Moje chyba. Zkompilujte kód bez chyby a nahrajte jej správně do „Blue Pill“, takže podle mého názoru skutečně funguje, ale neočekáváme použití výstupu GPIO. Možná ani není k dispozici.

V kódu jsou tedy nutné malé změny, aby fungoval podle očekávání.

Krok 2: Pojďme „definovat“některé piny…

Pojďme
Pojďme

Je dobrým zvykem kódu deklarovat prostředky jako snadno identifikovatelné nebo znamenající proměnné nebo konstanty. Umožní vám to snáze porozumět kódu a odstraňovat problémy.

Použil jsem deklaraci pinů Arduino takto:

const int ledPin = 13;

…"

Pokud mě máte rádi, možná si říkáte: „Jak mohu deklarovat piny s názvy jako PC13 ???“

Odpověď zní: Použijte příkaz „#define“C.

Podle výkresu pinoutu je tedy PC13 pin, který máme na palubě LED v „BluePill“. Abych to použil, deklaroval bych to takto, hned po definici knihoven (#include …) a před čímkoli jiným:

#define LedPin PC13

…"

Všimněte si, že neexistuje ŽÁDNÝ „;“ukončení řádku, přiřazení NOR "=".

Porovnejte oba kódy. Jedním z nich je původní příklad načtený z IDE. Druhý je ten, který jsem trochu upravil pro práci s „BluePill“.

Důrazně doporučuji deklarovat všechny piny, které hodláte použít v kódu. Dokonce i ty, které mají v úmyslu použít jako vstup ADC (více o tom později).

To vám usnadní život.

Krok 3: PinMode ()… Jak budete používat své piny…

Než budeme pokračovat, pojďme porozumět funkci PinMode ().

Stejně jako Arduino mají piny STM32 více funkcí. Nejjednodušší způsob, jak vybrat jeden nebo druhý, je pomocí příkazu pinMode ().

Arduino má k dispozici pouze 3 režimy, INPUT, OUTPUT nebo INPUT_PULLUP.

STM32 má naopak mnoho příchutí pinMode (). Oni jsou:

VÝSTUP -Základní digitální výstup: když je kolík VYSOKÝ, napětí je udržováno na +3,3 V (Vcc) a když je NÍZKÉ, je staženo dolů na zem

OUTPUT_OPEN_DRAIN -V režimu otevřeného odtoku pin ukazuje „nízký“přijetím toku proudu k zemi a „vysoký“poskytnutím zvýšené impedance

INPUT_ANALOG -Toto je speciální režim, kdy bude pin použit pro analogová (ne digitální) čtení. Umožňuje převod ADC na napětí na pinu

INPUT_PULLUP -Stav kolíku v tomto režimu je hlášen stejným způsobem jako u INPUT, ale napětí kolíku je jemně „vytaženo“směrem k +3,3 V

INPUT_PULLDOWN -Stav kolíku v tomto režimu je hlášen stejným způsobem jako u INPUT, ale napětí kolíku je jemně „staženo“směrem k 0v

INPUT_FLOATING -Synonymum pro INPUT

PWM -Toto je speciální režim, kdy bude kolík použit pro výstup PWM (zvláštní případ digitálního výstupu)

PWM_OPEN_DRAIN -jako PWM, kromě toho, že místo střídajících se cyklů LOW a HIGH se napětí na pinu skládá ze střídajících se cyklů LOW a Floating (odpojeno)

(poznámka: extrahováno z

Právě otevírám tuto závorku, protože když začnete vytvářet vlastní kód, dávejte pozor, abyste pro svou potřebu použili správný pinMode ().

Krok 4: AnalogWrite () versus PwmWrite () … Analogový výstup ve 2 příchutích

AnalogWrite () versus PwmWrite () … Analogový výstup ve 2 příchutích
AnalogWrite () versus PwmWrite () … Analogový výstup ve 2 příchutích
AnalogWrite () versus PwmWrite () … Analogový výstup ve 2 příchutích
AnalogWrite () versus PwmWrite () … Analogový výstup ve 2 příchutích

Před použitím GPIO pinů „Blue Pill“je nutné deklarovat jeho chování, tj. Jak bude fungovat. Přesně to dělá funkce pinMode ().

Pojďme se tedy nyní zaměřit na to, jak správně nastavit analogový výstup. Lze jej deklarovat buď jako režim VÝSTUP nebo PWM.

Stejným způsobem lze analogové hodnoty přiřadit GPIO dvěma způsoby: analogWrite () nebo pwmWrite (), ALE, analogWrite () BUDE fungovat pouze tehdy, pokud pinMode () = VÝSTUP. Na druhou stranu, pwmWrite () BUDE fungovat pouze tehdy, pokud pinMode () = PWM.

Vezměme například PA0: je to kandidát na analogový/pwm výstup.

analogWrite (): toto deklaruje takto:

….

#define ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <číslo>);

……"

kde číslo musí být mezi 0 a 255, jako Arduino. Ve skutečnosti je zpětně kompatibilní s Arduino.

pwmWrite (): deklarujte takto:

#define ledPin PA0

pinMode (ledPin, PWM);

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

…."

Kde číslo musí být mezi 0 ~ 65535, rozlišení mnohem vyšší než Arduino.

Na obrázcích je možné porovnat 2 kódy. Můžete také vidět původní kód.

Krok 5: Sériová komunikace STM32

Sériová komunikace STM32
Sériová komunikace STM32

Podívejme se, jak je v STM32 uspořádáno rozhraní USART. Ano, rozhraní v množném čísle ….

„Blue Pill“má 3 USART (RX/ TX 1 ~ 3), a pokud používáte bootloader, který vám umožňuje používat USB, není připojen k žádnému z nich.

V závislosti na tom, zda používáte nebo nepoužíváte USB, musíte ve svém kódu deklarovat sériový port jedním nebo druhým způsobem.

Případ 1: Použití USB:

Tímto způsobem se skici stahují přímo přes USB. Není třeba přesouvat propojku BOOT0 do 1 polohy a zpět do 0.

V tomto případě, kdykoli deklarujete „Sériové“bez indexu, znamená to komunikaci přes USB.

Serial1 tedy znamená TX/ RX 1 (piny PA9 a PA10); Serial2, znamená TX/ RX 2 (piny PA2 a PA3) a Serial 3 znamená TX/ RX 3 (piny PA10 a PA11).

S tímto způsobem pracujeme. Změny v příkladech pro tento způsob kódování představím.

Další věc: „Sériové USB“není třeba inicializovat. Jinými slovy „… Serial.begin (15200);“není nutné.

Je možné volat jakoukoli sériovou funkci (Serial.read (), Serial.write () atd.) Bez jakékoli inicializace.

Pokud je z nějakého důvodu přítomen v kódu, kompilátor jej bude ignorovat.

Případ 2: Použití adaptéru TTL seria na USB:

Bootloader tímto způsobem nepodporuje nativní komunikaci USB STM32, takže k nahrávání skic potřebujete adaptér USB na sériový připojený k TX/ RX 1 (pin PA9 a PA10).

V tomto případě kdykoli „Sériové“bez indexu znamená kód, znamená to TX/ RX1 (port sloužící k nahrání kódu). Serial1 tedy odkazuje na TX/ RX 2 (piny PA2 a PA3) a Serial2 odkazuje na TX/ RX 3 (piny PA10 a PA11). Není k dispozici žádný Serial3.

Krok 6: Předání hodnoty mikrokontroléru

Předání hodnoty mikrokontroléru
Předání hodnoty mikrokontroléru

Příklad stmívače je jednoduchý způsob, jak ukázat, jak předat hodnotu mikrokontroléru.

Předpokládá se, že pro řízení jasu LED předá hodnotu od 0 do 255.

V modré pilulce NEBUDE fungovat podle očekávání, protože:

  1. Chcete -li použít funkci pwmWrite (), MUSÍ být pinMode () deklarován jako režim PWM.
  2. Nikdy nezískáte celé 3 číslice. Funkce Serial.read () zachycuje pouze obsah vyrovnávací paměti, což je „BYTE“. pokud zadáte „100“a stisknete „Enter“, bude z vyrovnávací paměti zachyceno pouze poslední „0“. A jeho hodnota bude "48" (desetinná hodnota ASCII pro "0"). Pokud hodláte vydat hodnotu „100“, je nutné zadat „d“. Je tedy správné říci, že převede desítkovou hodnotu symbolu ASCII na jas LED, že ano …… No, jakýsi…
  3. Problém, mapovat hodnoty přímo z funkce Serial.read () je triková akce. Je téměř jisté, že získáte neočekávané hodnoty. Lepším přístupem je obsah vyrovnávací paměti úložiště v dočasné proměnné a TAK jej mapovat.

Jak jsem vysvětlil dříve v položce 2, kód, který zavedu změny, umožní zadat symbol ASCII a tím se bude řídit jas LED na základě jeho desítkové hodnoty ASCII … například „mezera“je hodnota 32 (ve skutečnosti je to nejnižší tisknutelný znak, který můžete zadat) a „}“je možné nejvyšší (hodnota 126). Jiné znaky nelze vytisknout, takže terminál nerozumí nebo je možné, že jsou složeny ze znaků (například „~“je mrtvý klíč na mé klávesnici a nebude správně fungovat). To znamená, že tento složený znak při zadání do terminálu odešle samotný znak a něco dalšího. Obvykle netisknutelný. A je to poslední, který bude kód zachycovat. Mějte také na paměti, že váš terminál by v tomto případě NEMĚL odesílat ani „Carriage Return“ani „Line Feed“. Aby kód fungoval správně, musíte tomu věnovat pozornost.

Pokud jste spadli, je to trochu matoucí, bude to ještě horší…..

Krok 7: A pokud bych chtěl zadat tři číslice…. nebo ještě víc ??

A pokud bych chtěl zadat tři číslice…. nebo ještě víc ??
A pokud bych chtěl zadat tři číslice…. nebo ještě víc ??

Získat více znaků ze sériové komunikace není jednoduchý úkol.

Sériová vyrovnávací paměť je FIFO bajtová hromada znaků. Kdykoli volá funkce Serial.read (), první odeslaný znak je odebrán z hromady a uložen na jiném místě. Obvykle char proměnná v kódu. Všimněte si toho, že v závislosti na hardwaru obvykle existuje časový limit, jak může vyrovnávací paměť protokolu uchovávat informace.

Pokud hodláte zadat více než jednu číslici přes sériové číslo, budete muset „poskládat“řetězec po znaku, jak se dostanou do vyrovnávací paměti UART.

To znamená cyklovat načtení každého znaku vyrovnávací paměti, uložit do dočasné proměnné, načíst na první pozici pole řetězců, přesunout na další pozici a začít znovu, dokud … no, záleží na aplikaci. Cyklus lze ukončit dvěma způsoby:

  1. Pomocí nějakého znaku „koncová značka“, například „návrat na začátek řádku“nebo „posun řádku“. Jakmile je nalezen znak „end Mark“, smyčka končí.
  2. Alternativně může být omezen počet znaků v řetězci řetězců, stejně tak počet interaktivních cyklů. Když dosáhne limitu, řekněme, 4, získá rutinní úpravy sám.

Pojďme se podívat na jednoduchý příklad, jak to udělat:

  • Nastavte znak „konec“, například „\ n“(to znamená znak ASCII řádku).
  • smyčka mezitím Serial.available () je pravdivá
  • ukládání Serial.read () má za následek dočasnou proměnnou char. Pamatujte: jakmile Serial.read () skutečně „načte“vyrovnávací paměť, je čistá a načte se do ní další znak.
  • zvyšte proměnnou řetězce o tuto char
  • Pokud je poslední znak „konec“, ukončete smyčku.

Rutina pro získání pole sériových znaků obvykle vypadá jako obrázek.

Byl založen na rozsáhlé adaptaci původního kódu pana Davida A. Mellise.

Můžete jej používat a vyzkoušet. Pamatujte: hodnoty MUSÍ být zadávány ve 3místném formátu.

To je prozatím. Nebudu se rozšiřovat o další podrobnosti o sériové komunikaci. Je to příliš složité na to, abychom to tu mohli pokrýt, a zaslouží si to vlastní Nezničitelné.

Doufám, že vám to pomůže použít příklady v Blue Pill a poskytne vám osvícení, jak správný kód pro tuto malou desku.

Uvidíme se v dalších instruktážních.

Doporučuje: