Hogyan és miért olvassunk adatlapokat, ha a mikrokontroller a hobbink

Hogyan és miért olvassunk adatlapokat, ha a mikrokontroller a hobbink

A mikroelektronika az utóbbi évek divatos szenvedélye a varázslatos Arduino révén. De mi a helyzet: ha valaki kellően érdeklődik, a DigitalWrite()-ra gyorsan rá lehet unni, de mi következik ezután – nem teljesen világos. Az Arduino fejlesztői jelentős erőfeszítéseket tettek, hogy csökkentsék az ökoszisztémájukba való belépés küszöbét, de annak határain kívül továbbra is ott van a durva áramkörök sötét erdeje, amely nehezen hozzáférhető a hobbisták számára.

Például a datasheetek. Úgy tűnik, minden benne van, csak vedd elő és használd. De az íróik nyilvánvalóan nem arra törekednek, hogy népszerűsítsék a mikrovezérlőket; néha úgy tűnik, hogy szándékosan bonyolult kifejezésekkel és rövidítésekkel írják le az egyszerű dolgokat, hogy maximálisan összezavarják a szakmai tudással nem rendelkezőket. De nem minden olyan rossz, ha akarod, a doboz kinyílik.

Ebben a cikkben megosztom tapasztalataimat a datasheetekkel való hobbicélú kommunikációról. A szöveg a már a rövidnadrágból kinőtt Arduino-rajongóknak szól, és feltételezi, hogy van némi elképzelésük a mikrovezérlők működési elveiről.

Kezdem a hagyományossal

LED villogtatás Arduino-n

És azonnal a kód:

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

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

„Mi ez? – kérdezi a tapasztalt olvasó. – Miért írsz valamit a PINB bemeneti regiszterbe? Az csak olvasási célra való!” Valóban, az Arduino dokumentációja, akárcsak a legtöbb online oktatóanyag, azt állítja, hogy ez a regiszter csak olvasásra való. Én is ezt hittem, amíg újra nem olvastam adatlap az Atmega328p-ról, miközben ezt a cikket készítettem. És ott van:

Hogyan és miért olvassunk adatlapokat, ha a mikrokontroller a hobbink

Ez egy viszonylag új funkció, nem volt jelen az Atmega8-on, sokan nem tudnak róla, vagy nem említik a visszamenőleges összeférhetőség miatt. De teljesen használható arra, hogy megmutassa, hogy a datasheeteket érdemes olvasni, hogy kihasználhassuk a chip összes lehetőségét, beleértve a kevéssé ismert funkciókat is. És ez nem az egyetlen ok.

Miért érdemes még datasheeteket olvasni

Általában az Arduino rajongók, miután játszadoztak a LED-ekkel és az AnalogWrite-okkal, elkezdik csatlakoztatni a táblához különböző modulokat és chippeket, amelyekhez már megírt könyvtárak léteznek. Előbb-utóbb megjelenik egy könyvtár, ami nem úgy működik, ahogy kellene. Ekkor a hobbista elkezdi szerkeszteni, hogy kijavítsa, és ott…

Ott valami kategórikusan érthetetlen dolog történik, ezért el kell mennem a Google-hoz, hogy olvassak számos útmutatót, kiszedegetve valakinek a megfelelő kódját, és végül elérjem a célomat. Ez erőteljes elégedettséget ad, de valójában a folyamat hasonlít a kerékpár feltalálására a motorkerékpár visszafejlesztésével. Ráadásul nem nő a megértés arról, hogyan működik ez a kerékpár. Tudom, mert magam is foglalkoztam ezzel egy ideig.

Ha inkább pazaroltam volna néhány napot az Atmega328 dokumentációjának tanulmányozására, hatalmas időt takaríthattam volna meg. Végül is ez egy meglehetősen egyszerű mikrokontroller.

Így hát legalább a datasheet-eket el kell olvasni, hogy valamilyen képet alkossunk arról, hogyan működik a mikrokontroller, és hogy mit tud csinálni. És még:

  • hogy ellenőrizzük és optimalizáljuk mások könyvtárait. Ezeket gyakran olyan hobbisták írják, akik kerékpárt találnak fel; vagy éppen ellenkezőleg, az írók szándékosan túlbiztosítják őket. Legyen akár háromszor nagyobb és lassabb, de biztosan működni fog;

  • hogy lehetővé tegyük olyan chip-ek használatát a projektben, amelyekhez senki nem írt könyvtárat;

  • hogy megkönnyítsük a feladatunkat egy mikrokontroller családról egy másikra való migráláskor;

  • hogy végre optimalizálhassuk a régi kódunkat, amely sehogy sem fért el az Arduinón;

  • hogy megtanuljunk közvetlenül irányítani bármely chipet a regiszterein keresztül, anélkül, hogy a könyvtárainak működését kellene tanulmányoznunk, ha egyáltalán vannak ilyenek.

Miért írjunk közvetlenül a regiszterekbe, amikor van HAL és LL?

Szótár
HAL, High Abstraction Layer – könyvtár a mikrokontroller magas szintű absztrakciójának kezelésére. Ha az SPI1 interfészt kell használnunk, egyszerűen beállítjuk és aktiváljuk az SPI1-et, anélkül, hogy gondolkodnunk kellene, hogy mely regiszterek mit irányítanak.
LL, Low Level API – könyvtár, amely makrókat vagy struktúrákat tartalmaz regiszterek címeivel, lehetővé téve számunkra, hogy neveken keresztül hívhassuk őket. DDRx, PORTx, PINx az Atmegán – ez LL.

A "HAL, LL vagy regiszterek" témában zajló viták rendszeresen előfordulnak a Habr kommentjeiben. Anélkül, hogy bármilyen asztrális tudásra törekednék, egyszerűen megosztom amatőr tapasztalataimat és megfontolásaimat.

Miután jobban megismertem az Atmegát és szakmai cikkeket olvastam az STM32 szépségeiről, vettem egy tucat különböző lapkát – így Discovery-t, „Kék Tablettákat”, és még sima chipet is a saját projektemhez. Két éven át porosodtak a dobozban. Néha azt mondtam magamnak: „na most kezdji el az STM tanulmányozását”, elindítottam a CubeMX-et, generáltam egy SPI beállítást, néztem a kapott szövegfalat, amit bőven fűszerezett az STM szerzői jogai, és úgy döntöttem, hogy ez már túl sok.

Hogyan és miért olvassunk adatlapokat, ha a mikrokontroller a hobbink

Megérteni, hogy mit írt a CubeMX, persze lehet. De nyilvánvaló, hogy az összes megfogalmazást megjegyezni, hogy később kézzel írhassam őket, lehetetlen. És debugolni ezt, ha véletlenül elfelejtem bekapcsolni egy pipát a Cube-ban – az kifejezetten kellemetlen.

Két év eltelt, én még mindig vágyakozva néztem a ST MCU Finder különféle ínycsiklandó, de számomra érthetetlen chipekre, és véletlenül rátaláltam egy csodálatos cikket, még ha az STM8-ról is volt szó. És hirtelen rájöttem, hogy mindez idő alatt nyitott ajtón kopogtattam: az STM regiszterei ugyanúgy működnek, mint bármely más mikrovezérlőé, és a velük való munka nem igényli a Cube használatát. Hogy mi? Ezt így is lehetett?

A HAL és konkrétan a STM32CubeMX egy professzionális mérnökek számára készült eszköz, akik szorosan dolgoznak az STM32 chipekkel. A fő jellemzője a magas szintű absztrakció, lehetőség arra, hogy gyorsan átállj egy másik mikrovezérlőre, sőt egy másik magra is, miközben az STM32 családon belül maradsz. Az ilyen feladatokat ritkán tapasztalják a hobbi felhasználók – általában a mikrovezérlő választásunkat az AliExpress kínálata korlátozza, és gyakran radikálisan különböző chipek között migrálunk – átugrunk az Atmegáról az STM-re, STM-ről az ESP-re, vagy amit a kínai barátainktól újonnan kapunk. A HAL itt nem segít, és az idő, amit a tanulmányozására fordítunk, sokat elvesz.

Marad a LL – de attól a regiszterekig csak egy lépés van. Személy szerint hasznosnak találom a regiszter címeket tartalmazó makrók írását: így figyelmesebben tanulmányozom a datasheetet, gondolkodom, mire lesz szükségem a jövőben, mi az, amire biztosan nem, jobban struktúrálom a programjaimat, és egyébként is a legyőzés hozzájárul a megjegyzéshez.

Ezen kívül van egy érdekesség a népszerű STM32F103-al kapcsolatban – létezik két inkompatibilis LL verziója, az egyik hivatalos az STM-től, a másik a Leaf Labs-tól, amelyet a STM32duino projekt használ. Ha open-source könyvtárat írok (és nekem éppen ilyen feladatom volt), akkor vagy két verziót kell csinálnom, vagy közvetlenül a regiszterekhez kell fordulnom.

Végül is, az LL elhagyása szerintem megkönnyíti a migrációt, különösen, ha már a projekt kezdetén figyelembe vesszük. Egy túlozott példa: írjuk meg az Arduino blink programot Atmel Studio-ban LL nélkül:

#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++);
    } 
}

Ahhoz, hogy ez a kód villogtassa a LED-et egy kínai STM8 lapkán (az ST Visual Desktop-ból), elég, ha két címet megváltoztatunk benne:

#define DDR_B 0x5007
#define OUT_B 0x5005

Igen, a konkrét lapkán lévő LED csatlakoztatásának sajátosságát használom, lassan fog villogni, de fog!

Milyen típusú adattáblák léteznek?

A cikkekben és fórumokon, mind a orosz, mind az angol nyelvűekben, az „adattáblák” alatt bármilyen technikai dokumentációt értenek a chippekhez, így én is ezt tegyem ebben a szövegben. Formálisan ezek csak egy típusa ennek a dokumentációnak:

Adattábla – műszaki adatok (TTX), taktikai-technikai jellemzők. Fenn kell, hogy legyen bármely elektronikus alkatrésznél. Segédinformáció, hasznos kéznél tartani, de különösebben nem érdemes alaposan átnézni. Mindazonáltal az egyszerűbb chipek gyakran csak adattáblával rendelkeznek, hogy elkerüljék a felesleges dokumentumok létrehozását; ebben az esetben Referencia Kézikönyv ide is beletartozik.

Referencia Kézikönyv – maga az útmutató, egy vaskos könyv 1000+ oldalon. Részletesen leírja mindazt, ami a chipbe van beépítve. A legfontosabb dokumentum a mikrokontroller elsajátításához. Ellentétben a datasheet, az útmutatókat széles skálában írják, sok információt tartalmaznak a perifériáról, amelyik hiányzik a konkrét modellből.

Programozási Kézikönyv vagy Utasításkészlet-útmutató – az egyedi mikrokontroller parancsokra vonatkozó útmutató. Azoknak szól, akik Assembly nyelven programoznak. A fordítóprogramok szerzői aktívan használják az optimalizált kódhoz, ezért általában nekünk erre nem lesz szükségünk. De érdemes ide benézni, hogy megértsük az általános koncepciót, különös figyelmet fordítva az olyan specifikus parancsokkal, mint a megszakításból való kilépés, és aktív debuggolásnál is.

Alkalmazási megjegyzés – hasznos tippek konkrét feladatok megoldásához, gyakran kód példákkal.

Hibajelentés – a chip nem szabványos viselkedésének leírása elkerülési lehetőségekkel, ha vannak.

Mik találhatók az adattáblákban?

Közvetlenül az Adattábla számunkra szükséges részek:

Device Summary – az adattábla első oldala röviden bemutatja az eszközt. Nagyon hasznos olyan helyzetekben, amikor valahol találtunk egy chipet (láttuk a boltban, kiszedtük, említést kaptunk róla), és szeretnénk megérteni, hogy mi az.

Általános leírás – részletesebb leírás a chipek képességeiről.

Pinouts – a chip minden lehetséges házához tartozó pin kiosztási sémák (melyik lábon melyik pin található).

Pin Description – a pinek funkcióinak és lehetőségeinek leírása.

Memory Map – a memóriában való címkép, amely valószínűleg nem szükséges számunkra, de néha a regiszterek blokkjainak címadatait is tartalmazza.

Register Map – a regiszterek blokkjainak címadatait általában a datasheet tartalmazza, míg a Ref Manual – csak a eltolások (address offsets).

Electrical Characteristics – ebben a részben elsősorban azzal vagyunk érdekeltek, abszolút maximális értékek, amelyek a chip maximális terheléseit sorolják fel. A robusztus Atmega328p-vel ellentétben a legtöbb mikrokontroller nem enged meg komoly terheléseket a pineken, ami kellemetlen meglepetést okozhat az Arduino felhasználóknak.

Package Information – a rendelkezésre álló házak rajzai, amelyek hasznosak a saját áramköreik tervezésénél.

Referencia Kézikönyv szerkezeti felépítése olyan részekből áll, amelyek a címükben feltüntetett konkrét perifériákkal foglalkoznak. Minden fejezet három részre bontható:

Áttekintés, Bevezetés, Features – a periféria lehetőségeinek áttekintése;

Functional Description, Usage Guide vagy egyszerűen a rész alapvető blokkja – a periféria működési elveinek és használati módjainak részletes leírása;

Registers – a vezérlőregiszterek leírása. Egyszerű esetekben, például GPIO vagy SPI esetén ez elegendő lehet a periféria használatának megkezdéséhez, de gyakran szükség van a korábbi részek átnézésére is.

Hogyan olvassunk datasheeteket

A datasheetek a kezdetben megdöbbenthetnek terjedelmükkel és az ismeretlen szavak gazdagságával. Valójában nem olyan ijesztő, ha tudunk néhány praktikus tippet.

Telepítse jó PDF-olvasóval. A datasheetek a papíralapú útmutatók dicsőséges hagyományai szerint készülnek, remekül kiadhatók, műanyag könyvjelzőkkel jelölhetők és összefűzhetők. A hipertext mennyisége elenyésző. Szerencsére a dokumentum struktúráját könyvjelzőkkel is ellátják, így egy jó navigációval rendelkező olvasóra nagy szükség van.

A datasheet nem Bjarne Stroustrup tankönyve, benne nem kell mindent egyből elolvasni. Ha az előző tanácsot követtük – egyszerűen keressük meg a könyvjelzők paneljén a szükséges részt.

A datasheetek, különösen Reference Manuals, nem a konkrét chip képességeit, hanem az egész sorozatot. Ez azt jelenti, hogy az információk fele, sőt lehet, hogy a kétharmada nem vonatkozik a chipre. Mielőtt a TIM7 regisztereit tanulmányoznánk, ellenőrizzük. Általános leírás, van van nálatok?

Tudni angolul elég alapszinten . A datasheetek félig ismeretlen szakszavakból, félig pedig egyszerű összekötő konstrukciókból állnak. Vannak csodás kínai datasheetek is kínai angolul, ahol a fele szakszó, a másik fele pedig véletlenszerű szavak összessége.Ha találkozol

ismeretlen szóval , ne próbáld meg lefordítani angol-orosz szótárral. Ha megakadálynak érzedhysteresis , akkor a "histerézis" fordítással nem fogsz melegebb érzéseket keltetni. Használj Gúglt, Stack Overflow-t, Wikipédia-t, fórumokat, ahol a szükséges fogalomegyszerű szavakkal, példákkal lesz magyarázva. A legjobb módja a megértésnek az, hogy.

kipróbálod a gyakorlatban. . Ezért tartsd kéznél a bemutató lapot, amivel ismerkedsz, vagy még jobb, ha van egy másik is – ha esetleg valamit nem értettél meg és megpillantottál egy varázslatos füstöt.Hasznos szokás, ha kéznél tartod a datasheetet, amikor

valaki tutoriálját olvasod vagy egy másik könyvtárat tanulmányozol. Előfordulhat, hogy benne találod a feladatod optimálisabb megoldását. És fordítva – ha a datasheetből nem tudod megérteni, hogyan működik a regiszter, keress rá: valószínűleg már valaki mindezt leírta egyszerű szavakkal vagy hagyott érthető kódot a GitHub-on. Néhány hasznos szó és jelölés, ami segíthet gyorsabban eligibilálódni a datasheetekkel. A legutóbbi pár napban eszembe jutott dolgok, bármilyen kiegészítést és javítást szívesen fogadok.

Szótár

Elektromosság

Vcc
Vdd, – "plusz", tápfeszültség Vss
Vee, – "mínusz", föld current
– áram voltage
– feszültség to sink current
– "földként" működik a külső terheléshez to source current
– táplálja a külső terhelést high sink/source pin
– tű, amely magasabb "toleranciát" bír el a terheléshez H, High

IO
– a Vcc tűn L, Low
– a Vss tűn High Impedance
floating, Hi-Z, – a tűn nincs semmi, "magas impedancia", valójában láthatatlan a külső világ számára. weak pull up
weak pull down, – beépített húzó/coszorúzó ellenállás, hozzávetőleg 50 kΩ (lásd datasheet). Használatos például, hogy a bemeneti tű ne legyen levegőben, ami téves aktiválást okozhat. Weak – mert könnyen "legyőzhető". push pull
– a tű kimeneti üzemmódja, amelyben vált át – szokásos OUTPUT az Arduinoval. Magas és Alacsony – a tű kimeneti üzemmódjának jelölése, amelyben a tű lehet vagy
open drain High Impedance / Floating Alacsony, vagy High Impedance / Floating. Szinte mindig nem 'igazi' nyitott áramkör, védő dióda, ellenállók és még sok más található benne. Ez csupán a földi / semmit sem jelölő üzemmódot jelenti.
igazi nyitott áramkör – ez már az igazi nyitott áramkör: a pin közvetlenül a földre vezet, ha nyitva van, vagy lebegő állapotban van, ha zárva van. Ez azt jelenti, hogy rajta keresztül szükség esetén a Vcc-nál nagyobb feszültséget lehet vezetni, de a maximumot még mindig a műszaki adatok tartalmazzák a Abszolút Maximális Értékek / Feszültség.

Csatlakozók
sorosan – sorosan csatlakoztatva
láncba – chipek láncba való összekapcsolása soros csatlakoztatással, növelve a kimenetek számát.
shift – eltolás, általában a bitek eltolását jelenti. Ennek megfelelően eltolni be és eltolni ki – bitek bitenkénti fogadása és továbbítása.
latch – egy záróelem, amely takarja a puffert, míg a bitek eltolódnak rajta. Amikor a továbbítás befejeződik, a záróelem kinyílik, a bitek aktiválódnak.
clockolni be – bitenkénti továbbítást végrehajtani, az összes bitet a megfelelő helyekre eltolni.
dupla puffert, árnyék regiszter, előre betöltött regiszter – történet jelzése, amikor a regiszternek új adatokat kell tudnia fogadni, de azokat el kell tartani egy bizonyos ideig. Például ahhoz, hogy a PWM megfelelően működjön, a paramétereknek (kitöltési arány, frekvencia) nem szabad változniuk, amíg a jelenlegi ciklus be nem fejeződik, de az új paraméterek már továbbíthatók. Ennek megfelelően a jelenlegi adatok a árnyék regiszter, míg az új adatok a előre betöltött regiszter, ezzel a chip megfelelő regiszterébe rögzítve.

Mindenféle
előosztó – frekvenciaelőosztó
egy bitet beállítani – a bitet 1-re állítani
egy bitet törölni / alaphelyzetbe állítani – a bitet 0-ra állítani (reset – STM adatlapok jelensége)

Mi következik

Itt eredetileg tervezett egy gyakorlati rész, amely három STM32 és STM8 projekt bemutatását célozta, amelyeket kifejezetten ehhez a cikkhez készítettek az adatlapok segítségével, lámpákkal, SPI-vel, időzítőkkel, PWM-mel és megszakításokkal:

Hogyan és miért olvassunk adatlapokat, ha a mikrokontroller a hobbink

De így túl sok szöveg keletkezik, ezért a projektek a második részbe kerülnek.

A datasheet olvasásának képessége segít a hobbidban, de aligha helyettesíti a fórumokon és csevegésekben való élő kommunikációt a hasonló érdeklődésű kollégákkal. Ehhez mindenképpen először is az angolt kell fejlesztened. Ezért akik eljutottak idáig, egy különleges ajándékot kapnak: két ingyenes órát a Skyeng-nél az első befizetéssel a kód használatával HABR2.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster