Tak si vemte skoro libovolné STM32. Třeba takové STM32F103 v populárním vývojovém kitu "BluePill" má vyvedených 10 ADCček a periferií má dost podobně jako ten RP2040.
Programovat se to dá nejlépe v čistém Cčku s pomocí ST HALu (pak člověk dokáže využít nejvíc potenciálu toho procesoru), ale pro začátečníky je dopsaná i podpora do "Arduino IDE"...
S tím jak to funguje v Arduino IDE bohužel neporadím, já to programuju v Keil uVision v Cčku s pomocí STDPeriphLib (dřívější verze HAL knihoven od ST).
Má to rozhodně hodně velkou "vstupní bariéru" (naučit se co kde najít, jak se používají perfierie, jak nakonfigurovat clock/PLL, atd), ale na druhou stranu to je strašlivě silné. Programátor v sobě má debuger, který se v reálném čase může koukat do libovolného paměťového místa procesoru, takže krokovat program a koukat při tom na jednotlivé proměnné jde out of the box. Oproti standardnímu "arduino debugování" stylu "přidám printf, zkompiluju a spustím" to je naprosto jiný kafe...
Chápu, že máte důvod k nepoužití programátoru - minimálně je to další krabička a dráty. Viděl jsem to stejně a bránil se STM32. Pak jsem koupil na ebay STLink v2 za nějakých 60-80 Kč, destičku s STM32F407 a zjistil jsem, že do desky mi stejně vede USB na napájení a komunikaci, převodník TTL RS232 kvůli ladícím výpisům a ten programátor s nějakým čtyřmi fousy mi už nijak nezavazí. Ale to je můj případ.
STM32 má docela dobrou podporu a spoustu příkladů jak na netu, tak vpřímo ve svém IDE co je zdarma - STM32CubeIDE. Mě toto prostředí na 100% nevyhovuje, ale dá se s tím jako hobby pracovat mnohem lépe, než s Arduino IDE, které je dobré opravdu tak pro hraní. STLink navíc umožňuje ladění přímo v IDE. No a až uvidíte možnosti konfigurace převodníků, po ATMega328 už ani nevzdechnete. :-) IRQ, DMA, řetězení převodů z různých vstpů.. Viz např. https://deepbluembedded.com/stm32-adc-tutorial-complete-guide-with-examples/ Prostě STM32 je o level výš, než ATMega. A většina pinů řady STM32F je 5V tolerantní. Tak neváhejte, krásný nový svět čeká! :-) (Dokud jde nakupovat v číně..)
UART funguje dobře, bez programátoru se to programuje blbě. Jednak musíš furt mačkat čudlík a možná přehazovat jumpery, protože na rozdíl od atmegového Arduina to nemůže přepnout čip do resetu pomocí DTR linky hardwarového sériáku, jednak až tam uděláš chybu (a to uděláš, protože třeba inicializace hodin je, jak píše bkralik, ne úplně triviální), tak to potřebuješ debugovat přes SWD.
Programátor bitbanguju přes GPIO…
To, ze pouzitie je jednoduche, podla mna plati aj o bare metal AVRku. Akurat clovek musi vyvinut trocha viac vlastnej iniciativy. Ale to podla mna nie je na skodu, ak sa chce clovek aj nieco naucit a nie sa len hrat. V skutocnosti si myslim, ze Arduino podporuje lenivost, pretoze clovek v konecnom dosledku dostane vsetko hotove pod nos, staci do toho pustit stavu a nahrat nejaky soft.
> Akurat clovek musi vyvinut trocha viac vlastnej iniciativy.
Tohle může taky skončit odrazením začátečníka. Když jsi lama a nedokážeš v rozumné době rozchodit ani nějaké demo, tak je to dost demotivující.
> pretoze clovek v konecnom dosledku dostane vsetko hotove pod nos, staci do toho pustit stavu a nahrat nejaky soft
Pak záleží, jestli člověk má cíl používat dobře MCU, nebo to jenom používá jako prostředek k dosažení něčeho jiného, že.
ja som roky rokuce fical na AVR8 (bare metal, ziadne arduino) a teraz pomaly swapujem na STM32. nejake veci mam este rozrobene pre atmel, ale nove projekty uz budem riesit na STM32, pokial by sa nenaslo nieco vylozene uchylne.
ja na to vzdy idem takym hardcore sposobom, takze mam vsetko vybuildovane z 0. ako pre AVR tak pre STM32. pre AVR mam dokonca aj DIY ghetto style programator.
to STM je pohodlnejsie a ked si clovek zriesi/zozenie nejaky bootloader schopny flashovania (na AVR otazka tak 4-5 hodin casu), programator uz nepotrebuje. vie to potom natlacit hoc aj po seriaku.
> to STM je pohodlnejsie a ked si clovek zriesi/zozenie nejaky bootloader schopny flashovania (na AVR otazka tak 4-5 hodin casu), programator uz nepotrebuje. vie to potom natlacit hoc aj po seriaku.
Problém je, že „atmegová arduina“ mají sériák jako samostatný čip, který umí MCU resetnout. Zatímco „armové desky“ (a možná to Arduino s AtMega32U4) mají sériák jako softwarově implementované USB CDC. Pokud si ve svém firmware omylem rozbiješ USB (a nemáš nastavený watchdog), tak už se do bootloaderu nedostaneš a musí někdo fyzicky zatahat za reset. Stejně tak pokud si ve svém firmware <b>neaktivuješ</b> (v tom co generuje CubeMX je defaultně vypnuté!!!) SWD, tak se tam už nepřipojíš debugerem. Doufej že tvoje deska má vyvedené BOOT piny a jejich přehozením to dostaneš do vestavěného bootloaderu.
Co máte furt s tim sériákem? Když se na něj vykašleš, nemusíš ve firmwaru mít zakompilovaný USB. Ušetří se RAM, Flash, zjednoduší program. Navíc přes USB se nedá rozumně debugovat. Pokud máte nějaký osobní problém s OpenOCD, tak STM32 programátory se dají přeflashovat na Black magic probe. Ta pak poskytuje přímo GDB přes virtuální sériovku.
A ta halda vykřičníků je celkem zbytečná. SWD se dá vypnout jenom dvěma způsoby. První je nastavit ochranu paměti na nejvyšší úroveň, pak je zakázaný debug nevratně. To, o čem se tu ale bavíme, je vratná a dokonce snadno opravitelná záležitost. CubeMX totiž způsobí vypnutí SWD pomocí AFIO. Jenže to je softwarová záležitost. Jakmile proběhne boot procesoru, SWD je zapnuté, dokud nedojde na to softwarové vypnutí. Řešení? Přenastavit si programování, aby se programovalo během resetu. Pak to jde naprogramovat normálně znova. Druhá možnost je probudit to do bootloaderu pomocí BOOT pinu. Třetí možnost je probudit to do bootloaderu a naprogramovat přes sériovku. Překvapivě - když je v datasheetu napsaný, že bootloader umožňuje programování po sériovce, tak to jde. Jak nečekané.
Diletantství ardujínistů je, zdá se, neomezené. Počet vykřičníků v jedné řadě nikoli.
Prvy a zasadny problem je v tom, ze my o voze a vy o koze. Ja som arduino vo svojom prispevku nespomenul ani raz (a v zivote som ho ani nedrzal v ruke). Neodkazujem sa nanho a je mi ukradnute, pretoze by mi zavadzalo. Pouzivam AVR vo forme bare metal navrdo a s Vimom, gcc a avr-libc. Tam si to clovek nadratuje, ako chce. Uplne to iste plati o STMku.
> "Pokud si ve svém firmware omylem rozbiješ USB (a nemáš nastavený watchdog)"
v takomto pripade je clovek v prvom rade blbec.
Do disablovaneho SWD se da dostat kratce po resetu, bezne jsem to tak praktikoval na vice ruznych STM32 a celkem casto (dosly piny, tak se pouzivaly i ty SWDIO/SWCLK).
A na nedostupnost bootloaderu jde celkem snadno udelat hack kdy se nejaky pin kde jinak nemuze byt pull-up zkontroluje na svoji napetovou uroven, takhle to resim ja, z bootloaderu se do aplikace v takovem pripade nepreskoci.
Minimalisticky seriovy bootloader se vleze do prvniho sektoru, vektory jde pak presmerovat do aplikace.
Ta podpora je dost špatná. Například bez LTO to v image nechává spoustu bordelu (stringy - plné cesty k souborům…), s LTO to odstraní interrupt vector table. (je na to už dva roky bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83967#c14) Dále pro to není Arduino Makefile, takže se to musí kompilovat z toho jejich IDE (nebo pomocí arduino-cli, které je úplně nekonečně pomalé), přičemž já to IDE moc nerad a chtěl bych používat svůj textový editor. A i v tom IDE trvá build několik sekund, což mi přijde dost. A samozřejmě tím nejdou využít různé funkce procesoru, se kterými API Arduina nepočítalo, ale to je očekávané.
ST HAL pro změnu v podstatě vyžaduje ten jejich non-free generátor kódu, to někomu může vadit.
HAL se bez generátoru projektu (STM32CubeMX) používat dá, ale opravdu to vyžaduje celkem boj - chce to prostudovat strukturu example projektů a zjistit, co za všeljaké startup a linker soubory si vypůjčit, jaké soubory z HALu kde #includovat, co kde #definovat, a jak povolit a inicializovat jednotlivé drivery (To už jde *relativně* snadno podle dokumentace v kódu, nebo přibaleného manuálu v *.chm (Ten je strojově vyexportovaný z komentářů v kódu, ale mě se v tom orientuje líp).
To je tedy jen pro zajímavost - nikdy bych to ani nezvažoval jako něco relevantního, když je řeč o Arduinu.
Jakkoli nejsem úplně nadšenec do Arduino IDE, mají můj respekt za to, že nestojí v cestě souběžné úpravě kódu v jiném editoru.
Když píšeš kód třeba ve vimu, a Arduino IDE je už jednou dobře nastavené na komunikaci s deskou, tak pro rekompilaci a nahrání do ESP32 stačí Alt+Tab, Ctrl+U (a počkat docela dlouho, asi 20 vteřin).
Já proto používám pořád ještě STDPeriphLib, který už nemá ofiko support (a není pro nové Hčkové řady, ke stáhnutí pro starší furt je), ale na druhou stranu to je jenom balík Cčkových souborů a člověk co potřebuje, tak si prostě na#includuje.
Jinak co se týká programátoru - každý "devkit" (v řeči ST Discovery Kit) v sobě má zabudovaný programátor s vyvedeným konektorem. Takže stačí zainvestovat dvě (STM32F0 disco) až čtyři kila (STM32F4 disco) a člověk dostane devkit i s programátorem, který si není problém připojit k čemukoliv jiného...
Tak HAL taky můžete jen na#includovat, a jen uděláte pár #define aby se povolily správné drivery, a běží to. Akorát je toho víc, a je to těžkopádnjší, ale v nic tomu vyloženě nebrání a hlavně to není nikde rozumně zdokumentované.
Disca jsou hlavně starší evalboardy - dnes je lepší použít Nuclea, jejichž integrovaný STlink má i sériový převodník.
Já o zastaralosti nic neříkal, jen že jsou vývojově starší, a že je lepší sáhnout po ekvivalentním Nucleu.
Integrovaný UART, u kterého člověk nemusí bojovat s převodníkem a hledat RX a TX piny na konektoru, je podle mě hodně silná výhoda.
Samozřejmě se nebavíme o tom, co využít, když jdete navrhovat elektroniku, pak každý inženýr přijde na to, co je zrovna nejlepší pro jeho use-case, ale jsme ve vláknu, kde se řeší spíš alternativy k Arduinu.
Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.
Internet Info Root.cz (www.root.cz)
Informace nejen ze světa Linuxu. ISSN 1212-8309
Copyright © 1998 – 2021 Internet Info, s.r.o. Všechna práva vyhrazena.