Motivace
Proč začít programovat STM32? Ta otázka by se na první pohled mohla zdát zbytečná, existuje přece spousta dobrých důvodů, proč ARMy, proč STM32. Mně to až tak zřejmé nepřipadá, ona je totiž konkurence velmi bohatá. Pokud vám jde pouze o výpočetní výkon a nepotřebujete nějak výrazně úzkou spolupráci s hardwarem, čeká tu na vás s otevřenou náručí Raspberry Pi. Naopak pokud nepotřebujete výpočetní výkon, čekají na vás davy osmibitových mikrokontrolerů (AVR,PIC,STM8 atd.). Pokusíte-li se použít STM32 na úkol stvořený pro Raspberry, přidáváte si práci s programováním, protože nebudete mít k dispozici prostředky Linuxu.
Použijete-li STM32 na jednoduchý úkol pro osmibitový mikrokontrolér, zbytečně ztrácíte čas s učením složité platformy a s její náročnější konfigurací. Můžeme se na to podívat třeba následujícím způsobem. Co se výpočetního výkonu týče, vítězí Raspberry, za ním jsou ARMy a nakonec 8bity. Podíváme-li se na schopnosti periferií, tedy schopnost úzce spolupracovat s hardwarem, vítězí STM32, za nimi jsou 8bity a teprve nakonec je Raspberry. Dalším faktorem je spotřeba. Autonomním projektům napájeným ze solárka nebo z akumulátorů nebude odběr Raspberry (0,1–0,5 A) asi moc vyhovovat, STM32 i 8bity mají srovnatelné schopnosti běžet se spotřebou několika mikroampér.
Důležitý faktor bude hrát i složitost programování a náročnost učení, kterou ale neumím objektivně porovnávat, protože závisí na předešlých zkušenostech. Jinak řečeno programátorům z PC bude Raspberry vyhovovat víc. No a nakonec nesmíme zapomenout na cenu. Raspberry je drahé, STM32 i 8bity stojí stejné peníze a začínají někde na ceně za jedno nebo dvě piva. Já osobně využívám STM32 hlavně v aplikacích úzce spjatých s hardwarem. Tedy v projektech, kde jde o přesné časování, rychlé reakce a schopnost pracovat s obecnou elektronikou. Krom tohoto relativně pragmatického přístupu existuje ještě jeden zajímavý důvod proč s STM32 začínat a to je zvědavost. Programovat totiž můžete klidně pro zábavu.
STM32 je vstřícné k amatérům
Obchodní politika ST Microelectronics je velice vstřícná k amatérům. Největší zásluhu na tom mají vývojové kity Discovery a Nucleo. Nejlevnější stojí okolo 250 Kč. Za ty peníze je mnozí z vás rovnou zabudují do svého zařízení a nebudou se obtěžovat s výrobou vlastní desky plošných spojů. To by ale ani zdaleka nebylo všechno. To nejlepší je totiž fakt, že každý z těchto kitů na sobě nese plnohodnotný debugger. Tedy hardware schopný programovat a ladit jakýkoli jiný čip. Můžete si tedy klidně vyrobit vlastní desku a osadit ji libovolným čipem STM32, nebo si nakoupit za pár korun desky z Číny (jako na obrázcích níže) a ladit svůj program na nich s použitím libovolného vývojového kitu. Jen pro představu, nejlevnější debugger například pro platformu AVR stojí mezi 1500–2000 Kč.
Vývojové kity o nichž je řeč se dělí do tří typů. První a nejstarší z nich jsou vývojové desky Discovery. Jejich výbava je od té nejchudší (jako například STM32VLDiscovery nebo STM32L100 Discovery) až po tu nejbohatší (STM32F429 Discovery s TFT displejem nebo STM32L0538 Discovery s displejem E-Ink). Další kategorii tvoří desky Nucleo-64 a Nucleo-144 (např NUCLEO-F302 nebo NUCLEO-F767), které krom klasických kolíkových řad pro připojení čehokoli obsahují také „arduino“ konektory, jež se navzdory mnoha nevýhodám stávají celkem normou. Všechny tyto kity obsahují už dříve zmíněný plnohodnotný debugger/programátor nazývaný ST-LINK. U Nucleo kitů je dokonce možné ST-LINK fyzicky oddělit od desky. Poslední kategorii pak tvoří desky Nucleo-32 jako například NUCLEO-F303K8. Ty na sobě také obsahují ST-LINK, ale není jej možné využít k programování externích STM32. Kit je totiž designovaný jako miniaturní a počítá se s tím že jej jako celek zanecháte v cílové aplikaci.
K programování a debuggování slouží na kitech rozhraní SWD (Serial Wire Debugging). To je tvořeno 4mi linkami, GND, VCC, SWCLK a SWDIO. Na drtivé většině kitů je rozhraní obohaceno ještě o RST a SWO, o jehož použití pro ladění aplikace se dozvíte později. Vyjmutím dvou jumperů (CN2) odpojíte cílový čip na desce od ST-LINKu a SWD konektor (CN3) pak můžete připojit k vnějšímu STM32. Rozložení pinů SWD konektoru si můžete najít v datasheetu (z nějž pochází i obrázek níže). Musím vás ale upozornit na menší nedostatek kitu v roli stand-alone debuggeru. Discovery (a počítám že i Nucleo) kity jsou uzpůsobeny tak, aby je bylo možné napájet jak z USB, tak z vnějšího 5V zdroje a stejně tak aby bylo možné přivést čipům vnější napájení 3,3 V. Z toho důvodu je na desce několik diod, z nichž se jedna nachází za 3,3V stabilizátorem. Což má neblahý důsledek. Napětí označené jako 3V3 má ve skutečnosti hodnotu přibližně 3,0 V a může kolísat s odběrem (úbytek napětí na diodě je závislý na proudu). To spolu nese i jisté úskalí při programování externích aplikací. Programovat čip běžící na napětí do 3,3 V je bezproblémové. Problém nastane jen v situaci, kdy cílová aplikace běží na maximálním provozním napětí 3,6 V (což asi většina z vás nikdy potřebovat nebude). Stejně tak má nestabilní napětí vliv na přesnost AD převodníku, protože tvoří jeho referenci. Ve většině případů vás to nebude nijak pálit. A pokud ano, dá se dioda přemostit kouskem drátu a problém je vyřešen.
ST-LINK přirozeně existuje i v samostatných variantách a stojí okolo 650 Kč. Je přirozeně bohatší a schopný programovat například i čipy STM8. Existuje i čínský klon ST-LINKu, který jsem ale neměl důvod nikdy vyzkoušet (k čemu také, když vám stačí libovolný vývojový kit). Nezanedbatelným pozitivem je existence multiplatformních vývojových prostředí a překladače bez omezení velikosti překládaného kódu (ani jedno z toho před několika lety ještě neexistovalo) a celé řady podpůrných nástrojů, jako je třeba CubeMX. Rešerši na toto téma ale nechám na někom fundovanějším, protože jsem osobně měl možnost pracovat pouze v CoIDE a TrueSTUDIu (o něm více v závěru tutoriálu). Můžu ale potvrdit, že jsem viděl programovat STM32F0 na Linuxu i s funkčním debuggerem.
Rozdělení STM32 a dokumentace
Mikrokontroléry STM32 se dělí do rodin. Přehledný klikací seznam můžete najít na webu. V seznamu stačí kliknout na vybranou rodinu a dostanete se na přehledné členění s tabulkovým výpisem všech periferií. Ve stručném úvodu se dočtete, k čemu je složením periferií čip určen. Například čipy F0×0 (tedy F050 nebo F030) jsou v tzv. „Value line“ tedy jde o nejlevnější čipy v dané třídě. Nebo například čipy F373 spadají do kategorie „precision measurment“, protože mají ve výbavě 16bitové AD převodníky.
Další dělení probíhá podle kapacity paměti a typu pouzdra. Vybereme-li si tedy jednoho konkrétního člena rodiny F0, například čip F051, pořád existuje několik variant lišících se kapacitou paměti a počtem vývodů. K této informaci se opět dostanete jednoduchým kliknutím skrze dříve uvedený seznam na stránkách ST. Z tabulky kterou máte před sebou můžete vidět že první písmeno za názvem čipu STM32F051R určuje velikost pouzdra (64pin) a následující znak STM32F051R8 pak kapacitu paměti (64kB flash / 8kB RAM).
Nakonec, když si v této poslední tabulce vyberete konkrétní čip, dejme tomu STM32F051R8 a kliknete na něj, dostanete se k dokumentaci. Čímž se dostáváme ke klíčové informaci. Datasheety jsou totiž dva (respektive čtyři). První dokument, tzv. „datasheet“, který je hned v úvodu stránky, obsahuje přehled periferií čipu, organizaci vývodů a třeba seznam elektrických parametrů. Nejčastěji do něj budete nahlížet právě kvůli organizaci vývodů. Dalším dokumentem je reference manual. Je to ten nejdelší a nejdůležitější dokument, obsahující detailní popis všech periferií, jejich registrů a ovládání. Do něj budete nahlížet asi nejčastěji. Reference manual bývá sdružený pro vícero čipů v rámci jedné rodiny. Pro které z nich je platný, zjistíte hned v jeho nadpise. Dále pak existuje Errata sheet obsahující seznam chyb v čipu a způsobů, jak je ošetřit. Jen pro přehlednost ještě uvedu poslední dokument, tzv Programming manual, který se váže k jádru (tomto případě Cortex M0) a je v něm dokumentace ke všem instrukcím procesoru a jeho přidruženým modulům. Často se do něj asi nepodíváte (nicméně je tam třeba dokumentace k Systicku a NVIC).
Tím bychom měli za sebou otázku dokumentace k jednotlivým mikrokontrolerům. Tím to ale nekončí, uniknout by vám neměla ani dokumentace k jednotlivým vývojovým kitům. Jestliže používáte Discovery nebo Nucleo moduly, je opět na místě poukázat na ten nejdůležitější z nich – User Manual (tento pro STM32F051 Discovery). V něm najdete kompletní popis Discovery kitu. Tedy přehlednou tabulku s popisem využití všech vývodů mikrokontroléru. Dále pak informace o možnostech hardwarových úprav kitu (skrze připravené pájecí propojky) a také kompletní schémata.
Do dokumentace ke knihovnám LL nebo HAL [PDF] asi nebudete nahlížet tak často (obsahují stejné informace jako relativně kvalitní komentáře přímo v souborech knihoven), ale je dobré, abyste věděli, že existují. Vyplatí si pročíst si hlavně sekci o souborové struktuře, abyste byli schopni knihovny správně včlenit do projektu. Je trochu škoda, že ke knihovnám neexistuje žádný vysvětlující manuál. Ačkoli je název většiny funkcí samovysvětlující, občas narazíte na některou, u které si nebudete jisti, co k čertu vlastně dělá. A nezjistíte to ani po pročtení příslušné pasáže reference manuálu.
Pak vám nezbude nic jiného než si prohlédnout zdrojový kód funkce, detailně se seznámit s činností periferie a zkusit její činnost odhadnout. Na pomoc vám k tomu poslouží tři zdroje. Jednak ukázkové zdrojové kódy (examples) přiložené v balíčku s knihovnami. Potom „appnotes“ (aplikační poznámky) od ST. A docela mocnou pomůckou mohou být ukázkové zdrojové kódy (psané v CMSIS), které najdete v některých reference manuálech v příloze (Apendix). Což ale bohužel nemění nic na tom že tady v té oblasti dokumentace pokulhává. U jiných výrobců (např Atmel) to je ale mnohem, mnohem horší, takže si těch krásně komentovaných knihovních funkcí važte.
Zamyšlení si zaslouží i otázka kterého člena rodiny STM si zvolit pro bastlířské pokusy. Výkonné varianty F2, F3, F4, F7, L2 a L4 dokážou rozvinout svoje schopnosti v podstatě jen když mají k dispozici odpovídající hardware (SDRAM, Displeje a pod.). K tomu ale potřebujete buď vlastní desku nebo dobře vybavený vývojový kit, a to je něco, do čeho se vám kvůli domácím aplikacím asi nebude chtít investovat. Proto se pro bastlíře jeví nejvhodnější čipy F0 a F1, případně pro solární a bateriové aplikace čipy z low-power rodiny L0 a L1. Já se v návodech pokusím zaměřovat předně, ale nikoliv výhradně, právě na tyto čipy.
Relevantní odkazy
- dokumentace k true atollic studiu verze 8
- STM32 ST Microelectronics
- Průvodce vytvořením projektu v TrueSTUDIu emcu.it
- Průvodce implementace knihoven do projektu v TrueSTUDIu empa.com
- velice pěkný přehled přehled o STM32 – Coretx M3 Insider guide Hitex