Jak a proč číst datové listy, pokud jsou mikrokontroléry vaším koníčkem

Jak a proč číst datové listy, pokud jsou mikrokontroléry vaším koníčkem

Mikroelektronika je v posledních letech díky kouzelnému Arduinu módním koníčkem. Ale tady je problém: s dostatečným zájmem můžete rychle překonat DigitalWrite(), ale co dělat dál, není úplně jasné. Vývojáři Arduina vynaložili velké úsilí na snížení bariéry vstupu do jejich ekosystému, ale mimo něj stále existuje temný les drsných obvodů, který je pro amatéra nepřístupný.

Například datové listy. Zdá se, že mají všechno, vezměte to a použijte to. Jejich autoři si ale zjevně nekladou za úkol mikrokontroléry popularizovat; Někdy zdá seže při popisu jednoduchých věcí záměrně zneužívají nesrozumitelné výrazy a zkratky, aby nezasvěcené co nejvíce zmátli. Ale ne všechno je tak špatné, na přání se rakev otevře.

V tomto článku se podělím o zkušenosti humanitního specialisty komunikujícího s datasheety pro hobby účely. Text je určen pro amatéry, kteří vyrostli z kalhot Arduino, předpokládá určité pochopení principů fungování mikrokontrolérů.

Začnu tradičně

Bliká LED na Arduinu

A hned kód:

void setup() {
DDRB |= (1<<5);
}

void loop() {
PINB = (1<<5);
for (volatile uint32_t k=0; k<100000; k++);
}

„Co je tohle? – zeptá se sofistikovaný čtenář. – Proč něco píšete do vstupního registru PINB? Je to jen pro čtení!" Opravdu, Dokumentace k Arduinu, stejně jako většina vzdělávacích článků na internetu uvádí, že tento registr je pouze pro čtení. Sám jsem si to myslel, dokud jsem si to nepřečetl datový list na Atmega328p při přípravě tohoto článku. A tam:

Jak a proč číst datové listy, pokud jsou mikrokontroléry vaším koníčkem

Jedná se o relativně novou funkcionalitu, na Atmega8 nebyla, ne každý o ní ví nebo není zmiňována z důvodu zpětné kompatibility. Ale docela se hodí pro demonstraci myšlenky, že datasheety se vyplatí číst, aby bylo možné využít všechny možnosti čipu, včetně těch málo známých. A to není jediný důvod.

Proč jinak číst datové listy?

Obvykle inženýři Arduino, kteří si dostatečně pohráli s LED a AnalogWrites, začnou k desce připojovat nejrůznější moduly a čipy, pro které již existují napsané knihovny. Dříve nebo později se objeví knihovna, která nefunguje, jak má. Pak to amatér začne sbírat, aby to opravil, a pak...

A stane se tam něco naprosto nepochopitelného, ​​takže musíte jít na Google, přečíst si četné tutoriály, vytáhnout části něčího vhodného kódu a nakonec dosáhnout svého. To dává silný pocit úspěchu, ale ve skutečnosti je tento proces jako znovuobjevení kola reverzním inženýrstvím motocyklu. Navíc pochopení toho, jak tato motorka funguje, se nezvyšuje. Já vím, protože jsem to sám dělal docela dlouho.

Kdybych místo této vzrušující činnosti strávil pár dní studiem dokumentace Atmega328, ušetřil bych obrovské množství času. Přeci jen se jedná o celkem jednoduchý mikrokontrolér.

Musíte si tedy alespoň přečíst datové listy, abyste si představili, jak mikrokontrolér obecně funguje a co umí. A dál:

  • kontrolovat a optimalizovat knihovny jiných lidí. Často je píší stejní amatéři, kteří znovu vynalezli kolo; nebo je naopak autoři záměrně dělají přehnaně neomylným. Ať je třikrát větší a pomalejší, ale určitě to půjde;

  • umět používat čipy v projektu, pro který nikdo nenapsal knihovnu;

  • abyste si usnadnili migraci z jedné linky MK na druhou;

  • konečně optimalizovat váš starý kód, který se nevešel do Arduina;

  • naučit se ovládat jakýkoli čip přímo prostřednictvím jeho registrů, aniž by se museli obtěžovat studiem struktury jeho knihoven, pokud existují.

Proč psát přímo do registrů, když je tam HAL a LL?

Slovníček
HAL, vrstva vysoké abstrakce – knihovna pro řízení mikrokontroléru s vysokou úrovní abstrakce. Pokud potřebujete použít rozhraní SPI1, jednoduše nakonfigurujete a povolíte SPI1, aniž byste přemýšleli o tom, které registry jsou za co zodpovědné.
LL, Low Level API – knihovna obsahující makra nebo struktury s adresami registrů, které vám umožňují přistupovat k nim podle názvu. DDRx, PORTx, PINx na Atmega jsou LL.

V komentářích na Habré se pravidelně objevují spory na téma „HAL, LL nebo registry“. Bez nároku na přístup k astrálním znalostem se jednoduše podělím o své amatérské zkušenosti a myšlenky.

Poté, co jsem víceméně přišel na Atmegu a přečetl jsem si články o podivuhodnosti STM32, koupil jsem si půl tuctu různých desek – Discovery a Blue Pills a dokonce jen chipsy pro své domácí produkty. Všichni dva roky sbírali prach v krabici. Někdy jsem si říkal: „To je ono, od víkendu zvládám STM,“ spustil CubeMX, vygeneroval nastavení pro SPI, podíval se na výslednou stěnu textu, bohatě ochucenou autorskými právy STM, a rozhodl se, že tohle je nějak moc hodně.

Jak a proč číst datové listy, pokud jsou mikrokontroléry vaším koníčkem

Samozřejmě můžete přijít na to, co napsal CubeMX zde. Ale zároveň je jasné, že pamatovat si všechny formulace a pak je psát ručně je nereálné. A abych to odladil, pokud náhodou zapomenu zaškrtnout políčko v kostce, je to úplně v pořádku.

Uplynuly dva roky, stále si olizuji rty Vyhledávač ST MCU pro všechny druhy chutné, ale mimo mé chápání, chipsy, a náhodou narazil úžasný článek, i když o STM8. A najednou Uvědomil jsem si, že jsem celou tu dobu klepal na otevřené dveře: registry STM jsou uspořádány stejně jako u jiných MK a Cube s nimi není nutné pracovat. Bylo to vůbec možné?...

HAL a konkrétně STM32CubeMX je nástroj pro profesionální inženýry, kteří úzce spolupracují s čipy STM32. Hlavním rysem je vysoká úroveň abstrakce, schopnost rychle migrovat z jednoho MCU na druhý a dokonce z jednoho jádra na druhé, a přitom zůstat v rámci řady STM32. Hobbyři se s takovými problémy setkávají zřídka - náš výběr mikrokontrolérů je zpravidla omezen na sortiment AliExpress a často migrujeme mezi radikálně odlišnými čipy - přecházíme z Atmega na STM, od STM k ESP nebo cokoli nového, naši čínští přátelé hodit na nás. Zde HAL nepomůže a jeho studium zabere spoustu času.

LL zůstává - ale od něj k registrům je půl kroku. Osobně považuji psaní svých maker s adresami registrů za užitečné: pečlivěji studuji datasheet, přemýšlím o tom, co budu v budoucnu potřebovat a co rozhodně ne, lépe strukturuji své programy a obecně mi překonávání pomáhá zapamatovat si .

Kromě toho existuje nuance s populárním STM32F103 - existují pro něj dvě nekompatibilní verze LL, jedna oficiální od STM, druhá od Leaf Labs, použitá v projektu STM32duino. Pokud napíšete open-source knihovnu (a já jsem měl přesně takový úkol), musíte buď vytvořit dvě verze, nebo vstoupit přímo do registrů.

Konečně, odstranění LL podle mého názoru zjednodušuje migraci, zvláště pokud s ní plánujete od samého začátku projektu. Přehnaný příklad: napíšeme Arduino blink v Atmel Studio bez LL:

#include <stdint.h>

#define _REG(addr) (*(volatile uint8_t*)(addr))

#define DDR_B 0x24
#define OUT_B 0x25

int main(void)
{
    volatile uint32_t k;

    _REG(DDR_B) |= (1<<5);

    while(1)
    {
        _REG(OUT_B) |= (1<<5);
        for (k=0; k<50000; k++);
        _REG(OUT_B) &= ~(1<<5);
        for (k=0; k<50000; k++);
    } 
}

Aby tento kód blikal LED na čínské desce s STM8 (od ST Visual Desktop), stačí v něm změnit dvě adresy:

#define DDR_B 0x5007
#define OUT_B 0x5005

Ano, používám funkci připojení LED na konkrétní desce, bude blikat velmi pomalu, ale stane se!

Jaké typy datových listů existují?

V článcích a na fórech, jak v ruštině, tak v angličtině, „datasheety“ znamenají jakoukoli technickou dokumentaci k čipům a totéž dělám v tomto textu. Formálně jsou pouze jedním typem takové dokumentace:

list – Výkonnostní, taktické a technické vlastnosti. Povinné pro jakoukoli elektronickou součástku. Základní informace je užitečné mít po ruce, ale není toho moc, co by se v nich dalo promyšleně číst. Jednodušší čipy se však často omezují na datový list, aby nevytvářely zbytečné dokumenty; v tomto případě Referenční příručka je zde zahrnuto.

Referenční příručka – samotný návod, zdravá kniha o 1000+ stranách. Podrobně je popsána práce všeho, co je v čipu napěchováno. Hlavní dokument pro zvládnutí mikrokontroléru. Na rozdíl od list, instrukce jsou napsány pro širokou škálu MK, obsahují mnoho informací o periferiích, které nejsou k dispozici ve vašem konkrétním modelu.

Programovací manuál nebo Návod k sadě instrukcí – instrukce pro jedinečné příkazy mikrokontroléru. Navrženo pro ty, kteří programují v jazyce symbolických instrukcí. Autoři kompilátorů jej aktivně používají k optimalizaci kódu, takže jej v obecném případě nebudeme potřebovat. Ale podívat se sem je užitečné pro obecné pochopení, pro některé specifické příkazy, jako je ukončení přerušení, stejně jako pro aktivní používání debuggeru.

Aplikační poznámka – užitečné tipy pro řešení konkrétních problémů, často s příklady kódu.

List Errata – popis případů nestandardního chování čipu s možnostmi řešení, pokud existují.

Co je v datasheetech

Přímo do list můžeme potřebovat následující sekce:

Souhrn zařízení – první strana technického listu stručně popisuje zařízení. Velmi užitečné v situacích, kdy jste někde našli čip (viděli ho v obchodě, připájeli ho, narazili na zmínku) a chcete pochopit, co to je.

Obecný popis – podrobnější popis schopností čipů z linky.

Pinouty – schémata pinů pro všechny možné balíčky čipů (který pin je na které noze).

Popis kolíku – popis účelu a možností každého pinu.

paměť Mapa – je nepravděpodobné, že bychom potřebovali mapu adres v paměti, ale někdy obsahuje také tabulku adres registrových bloků.

Registrovat mapu – tabulka adres registrových bloků je zpravidla umístěna v datovém listu a v Ref Manual - pouze směny (offsety adres).

Elektrické vlastnosti – v této sekci nás zajímá především absolutní maximální hodnocení, uvádějící maximální zatížení na čip. Na rozdíl od nezničitelného Atmega328p vám většina MK neumožňuje připojit vážné zátěže na kolíky, což se pro arduinisty stává nepříjemným překvapením.

Informace o balíčku – výkresy dostupných pouzder, užitečné při navrhování vašich desek.

Referenční příručka strukturálně se skládá z částí věnovaných konkrétním periferiím uvedeným v jejich názvu. Každou kapitolu lze rozdělit do tří částí:

O programu, Úvod, Funkce – přehled možností periferií;

funkční popis, Průvodce použitím nebo jednoduše hlavní blok sekce - podrobný textový popis principů periferního zařízení a způsobu jeho použití;

Rejstříky – popis řídicích registrů. V jednoduchých případech, jako je GPIO nebo SPI, to může být docela dost, abyste mohli začít používat periferie, ale často si stejně musíte přečíst předchozí díly.

Jak číst datové listy

Datasheety vás ze zvyku děsí svým objemem a množstvím nesrozumitelných slov. Ve skutečnosti není všechno tak děsivé, pokud znáte několik životních hacků.

Sada dobrá čtečka PDF. Datové listy jsou psány ve slavné tradici papírových návodů, skvěle se vytisknou, vloží s plastovými záložkami a sešívají. Hypertext v nich je pozorován ve stopových množstvích. Naštěstí je alespoň struktura dokumentu navržena se záložkami, takže vhodná čtečka se snadnou navigací je velmi nutná.

Datasheet není Stroustrupova učebnice; obsahuje není třeba číst vše. Pokud jste použili předchozí radu, stačí najít požadovanou sekci v liště záložek.

Speciálně datové listy Referenční manuály, dokáže popsat schopnosti ne konkrétního čipu, ale celou řadu. To znamená, že polovina nebo dokonce dvě třetiny informací nesouvisí s vaším čipem. Před studiem registrů TIM7 se přihlaste Obecný popis, máš to?

Chcete-li vědět Angličtina dost pro základní úroveň. Datové listy se skládají z poloviny z pojmů, které průměrnému rodilému mluvčímu nezná, a z poloviny z jednoduchých spojovacích struktur. Existují také vynikající čínské datové listy v čínské angličtině, kde polovina jsou také termíny a druhá polovina je náhodná sada slov.

Pokud se setkáte neznámé slovo, nepokoušejte se to přeložit pomocí anglicko-ruského slovníku. Pokud jste zmateni hystereze, pak vás překlad „hystereze“ neohřeje. Použijte Google, Stack Overflow, Wikipedii, fóra, kde bude požadovaný koncept vysvětlit jednoduchými slovy s příklady.

Nejlepší způsob, jak porozumět tomu, co čtete, je zkontrolovat v akci. Mějte proto po ruce ladicí desku, se kterou se seznamujete, nebo ještě lépe dvě, pro případ, že byste stále něčemu nerozuměli a viděli kouzelný kouř.

Je dobrým zvykem mít svůj datový list vždy po ruce čtení něčího tutoriálu nebo studovat knihovnu někoho jiného. Je dost možné, že v něm najdete optimálnější řešení svého problému. A naopak – pokud z datasheetu nechápete, jak registr vlastně funguje, vygooglujte si to: nejspíš už někdo vše popsal jednoduchými slovy nebo nechal na GitHubu jasný kód.

Slovníček

Některá užitečná slova a symboly, které vám pomohou rychle si zvyknout na datové listy. Co jsem si za posledních pár dní zapamatoval, doplnění a opravy vítám.

elektřina
Vcc, vdd – „plus“, jídlo
Vss, Vee – „mínus“, země
proud - aktuální
napětí - Napětí
potopit proud – pracovat jako „zem“ pro vnější zátěž
ke zdroji proudu – napájení externí zátěže
vysoký dřez/zdrojový kolík – čep se zvýšenou tolerancí vůči zatížení

IO
H, vysoká – na kolíku Vcc
L, Nízká – na čepu Vss
Vysoká impedance, Ahoj-Z, plovoucí – na kolíku nic není, „vysoký odpor“, pro vnější svět je prakticky neviditelný.
slabé vytáhnout nahoru, slabé strhnout – vestavěný pull-up/pull-down rezistor, přibližně ekvivalentní 50 kOhm (viz katalogový list). Používá se například k tomu, aby vstupní kolík nevisel ve vzduchu a způsoboval falešné poplachy. Slabý - protože je snadné ho „přerušit“.
tlačit táhnout – režim výstupu pin, ve kterém se přepíná Vysoký и Nízké – běžný OUTPUT z Arduina.
otevřený odtok – označení výstupního režimu, ve kterém může být pin buď NízkéNebo Vysoká impedance/plovoucí. Navíc se téměř vždy nejedná o „skutečný“ otevřený odtok; existují ochranné diody, odpory a cokoli jiného. To je prostě označení pro pozemní/žádný režim.
skutečný otevřený odtok - ale toto je skutečný otevřený odtok: kolík vede přímo k zemi, pokud je otevřený, nebo zůstává v limbu, pokud je zavřený. To znamená, že v případě potřeby jím může projít napětí větší než Vcc, ale maximum je stále uvedeno v datovém listu v části Absolutní maximální jmenovité hodnoty/napětí.

Rozhraní
v sériích – zapojen do série
řetězit – sestavovat čipy do řetězce pomocí sériového zapojení, čímž se zvyšuje počet výstupů.
posun – shift, obvykle označuje bitový posun. resp. zařadit se и vyřadit se – přijímat a přenášet data bit po bitu.
závora – západka, která zakrývá vyrovnávací paměť, zatímco se přes ni posouvají bity. Po dokončení přenosu se ventil otevře a bity začnou fungovat.
zařadit se – proveďte přenos bit po bitu, posuňte všechny bity na správná místa.
dvojitý buffer, stínový registr, preload registru – označení historie, kdy registr musí být schopen přijímat nová data, ale do určitého okamžiku je uchovávat. Například, aby PWM fungovalo správně, jeho parametry (pracovní cyklus, frekvence) by se neměly měnit, dokud aktuální cyklus neskončí, ale nové parametry již lze přenášet. V souladu s tím jsou zachovány ty současné stínový registra nové spadají do preload registru, který se zapisuje do odpovídajícího registru čipu.

Cokoliv
předdělička – frekvenční předdělička
trochu nastavit – nastavte bit na 1
trochu vymazat/resetovat – reset bit na 0 (obnovit – funkce STM datasheet)

Co je další

Obecně zde byla naplánována praktická část s ukázkou tří projektů na STM32 a STM8, vyrobených speciálně pro tento článek pomocí datasheetů, se žárovkami, SPI, časovači, PWM a přerušeními:

Jak a proč číst datové listy, pokud jsou mikrokontroléry vaším koníčkem

Textu je ale hodně, a tak se projekty posílají do druhého dílu.

Dovednost čtení datových listů vám pomůže s vaším koníčkem, ale je nepravděpodobné, že nahradí živou komunikaci s ostatními nadšenci na fórech a chatech. Abyste toho dosáhli, musíte se nejprve zlepšit v angličtině. Proto ti, kteří dočetli, obdrží speciální cenu: dvě bezplatné lekce Skyengu s první platbou pomocí kódu HABR2.

Zdroj: www.habr.com

Přidat komentář