Hur och varför läser du datablad om mikrokontroller är din hobby

Hur och varför läser du datablad om mikrokontroller är din hobby

Mikroelektronik är en fashionabel hobby de senaste åren tack vare den magiska Arduino. Men här är problemet: med tillräckligt intresse kan du snabbt växa ur DigitalWrite(), men vad du ska göra härnäst är inte helt klart. Arduino-utvecklare har lagt ner mycket ansträngning på att sänka barriären för att komma in i deras ekosystem, men utanför det finns det fortfarande en mörk skog av hårda kretsar som är otillgängliga för amatören.

Till exempel datablad. Det verkar som om de har allt, ta det och använd det. Men deras upphovsmän har uppenbarligen inte satt sig i uppgift att popularisera mikrokontroller; Ibland det verkaratt de medvetet missbrukar obegripliga termer och förkortningar när de beskriver enkla saker för att förvirra den oinvigde så mycket som möjligt. Men allt är inte så illa, om så önskas öppnas kistan.

I den här artikeln kommer jag att dela erfarenheten av en humanistisk specialist som kommunicerar med datablad i hobbysyfte. Texten är avsedd för amatörer som har vuxit upp från Arduino-byxor; den förutsätter en viss förståelse för principerna för mikrokontrollers funktion.

Jag börjar med det traditionella

Blinkar en LED på Arduino

Och genast koden:

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

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

"Vad är detta? – En sofistikerad läsare kommer att fråga. – Varför skriver du något till PINB-inmatningsregistret? Det är bara för läsning!" Verkligen, Arduino dokumentation, liksom de flesta utbildningsartiklar på Internet, anger att detta register är skrivskyddat. Jag trodde det själv tills jag läste det igen datablad till Atmega328p, förbereder den här artikeln. Och där:

Hur och varför läser du datablad om mikrokontroller är din hobby

Det här är en relativt ny funktionalitet, den fanns inte på Atmega8, inte alla känner till den eller nämns inte på grund av bakåtkompatibilitet. Men det är ganska lämpligt för att demonstrera idén att datablad är värda att läsa för att kunna använda chipets alla funktioner, inklusive föga kända. Och detta är inte den enda anledningen.

Varför annars läsa datablad?

Vanligtvis börjar Arduino-ingenjörer, som har spelat tillräckligt med lysdioder och AnalogWrites, att ansluta alla typer av moduler och chips till kortet, för vilka det redan finns skrivna bibliotek. Förr eller senare dyker det upp ett bibliotek som inte fungerar som det ska. Sedan börjar amatören plocka på den för att fixa den, och sedan...

Och något helt obegripligt händer där, så du måste gå till Google, läsa många tutorials, dra ut delar av någons lämpliga kod och slutligen uppnå ditt mål. Detta ger en kraftfull känsla av prestation, men i verkligheten är processen som att återuppfinna hjulet genom att bakåtbygga en motorcykel. Dessutom ökar inte förståelsen för hur denna cykel fungerar. Jag vet, för jag gjorde det här själv ganska länge.

Om jag istället för denna spännande aktivitet hade ägnat ett par dagar åt att studera Atmega328-dokumentationen, skulle jag ha sparat enormt mycket tid. Detta är trots allt en ganska enkel mikrokontroller.

Därför måste du åtminstone läsa datablad för att föreställa dig hur mikrokontrollern i allmänhet fungerar och vad den kan göra. Och vidare:

  • att kontrollera och optimera andras bibliotek. De är ofta skrivna av samma amatörer som återuppfinner hjulet; eller tvärtom, författarna gör dem medvetet överdrivet idiotsäkra. Låt det vara tre gånger större och långsammare, men det kommer definitivt att fungera;

  • att kunna använda chips i ett projekt som ingen har skrivit ett bibliotek för;

  • för att göra det lättare för dig själv att migrera från en MK-linje till en annan;

  • för att äntligen optimera din gamla kod, som inte passade in i Arduino;

  • att lära sig att styra vilket chip som helst direkt genom dess register, utan att behöva studera strukturen på dess bibliotek, om någon.

Varför skriva till register direkt när det finns HAL och LL?

ordlista
HAL, högt abstraktionsskikt – ett bibliotek för att styra en mikrokontroller med hög abstraktionsnivå. Om du behöver använda SPI1-gränssnittet konfigurerar och aktiverar du helt enkelt SPI1 utan att tänka på vilka register som ansvarar för vad.
LL, Low Level API – ett bibliotek som innehåller makron eller strukturer med registeradresser, så att du kan komma åt dem med namn. DDRx, PORTx, PINx på Atmega är LL.

Tvister om ämnet "HAL, LL eller register" förekommer regelbundet i kommentarer på Habré. Utan att göra anspråk på tillgång till astral kunskap kommer jag helt enkelt att dela med mig av mina amatörerfarenheter och tankar.

Efter att ha mer eller mindre listat ut Atmega och läst artiklar om det underbara med STM32, köpte jag ett halvdussin olika brädor - Discovery och Blue Pills, och till och med bara chips för mina hemmagjorda produkter. De samlade alla damm i en låda i två år. Ibland sa jag till mig själv: "Det var det, jag behärskar STM i helgen," lanserade CubeMX, skapade en uppsättning för SPI, tittade på den resulterande väggen av text, generöst smaksatt med STM-upphovsrätt och bestämde mig för att detta på något sätt var för mycket .

Hur och varför läser du datablad om mikrokontroller är din hobby

Naturligtvis kan du lista ut vad CubeMX skrev här. Men samtidigt är det klart att det är orealistiskt att komma ihåg alla formuleringar och sedan skriva dem för hand. Och för att felsöka detta, om jag av misstag glömmer att markera en ruta i kuben, är det helt okej.

Två år har gått, jag slickar mig fortfarande om läpparna ST MCU Finder för alla typer av välsmakande, men bortom mitt förstånd, chips, och av misstag kom över underbar artikel, fast om STM8. OCH plötsligt Jag insåg att jag hela denna tid hade knackat på en öppen dörr: STM:s register är ordnade på samma sätt som alla andra MK:s register, och kuben är inte nödvändig för att arbeta med dem. Var det ens möjligt?..

HAL och specifikt STM32CubeMX är ett verktyg för professionella ingenjörer som arbetar nära med STM32-chips. Huvudfunktionen är en hög abstraktionsnivå, förmågan att snabbt migrera från en MCU till en annan och till och med från en kärna till en annan, samtidigt som den förblir inom STM32-linjen. Hobbyister stöter sällan på sådana problem - vårt val av mikrokontroller är som regel begränsat till AliExpress-sortimentet, och vi migrerar ofta mellan radikalt olika chips - vi flyttar från Atmega till STM, från STM till ESP, eller vilken nyhet våra kinesiska vänner kasta på oss. HAL kommer inte att hjälpa här, och att studera det kommer att äta upp mycket tid.

LL finns kvar – men från den till registren är det ett halvt steg. Personligen tycker jag att det är användbart att skriva mina makron med registeradresser: jag studerar databladet noggrannare, jag tänker på vad jag kommer att behöva i framtiden och vad jag definitivt inte kommer att behöva, jag strukturerar mina program bättre, och i allmänhet hjälper det att övervinna .

Dessutom finns det en nyans med den populära STM32F103 - det finns två inkompatibla LL-versioner för den, en tjänsteman från STM, den andra från Leaf Labs, som används i STM32duino-projektet. Om du skriver ett bibliotek med öppen källkod (och jag hade precis en sådan uppgift), måste du antingen göra två versioner eller komma åt registren direkt.

Slutligen, att eliminera LL, enligt min mening, gör migreringen lättare, speciellt om du planerar på det från början av projektet. Överdrivet exempel: låt oss skriva Arduino blink i Atmel Studio utan 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++);
    } 
}

För att den här koden ska blinka lysdioden på ett kinesiskt kort med STM8 (från ST Visual Desktop), räcker det att ändra två adresser i den:

#define DDR_B 0x5007
#define OUT_B 0x5005

Ja, jag använder en funktion för att ansluta lysdioden på ett specifikt kort, det kommer att blinka väldigt långsamt, men det kommer att hända!

Vilka typer av datablad finns det?

I artiklar och på forum, både ryska och engelska, betyder "datablad" all teknisk dokumentation för chips, och jag gör detsamma i den här texten. Formellt är de bara en typ av sådan dokumentation:

Datablad – Prestandaegenskaper, taktiska och tekniska egenskaper. Obligatorisk för alla elektroniska komponenter. Bakgrundsinformation är användbar att ha till hands, men det finns inte mycket att läsa i den. Enklare chips är dock ofta begränsade till ett datablad för att inte skapa onödiga dokument; I detta fall Referenshandbok ingår här.

Referenshandbok – själva instruktionerna, en hälsosam bok på 1000+ sidor. Arbetet med allt som är inklämt i chippet beskrivs i detalj. Huvuddokumentet för att behärska mikrokontrollern. Till skillnad från datablad, instruktioner är skrivna för ett brett spektrum av MKs, de innehåller mycket information om kringutrustning som inte är tillgänglig i din specifika modell.

Programmeringshandbok eller Instruktionsset manual – instruktioner för unika mikrokontrollerkommandon. Designad för dig som programmerar i Assembly-språk. Kompilatorförfattare använder det aktivt för att optimera kod, så i det allmänna fallet kommer vi inte att behöva det. Men att titta här är användbart för en allmän förståelse, för vissa specifika kommandon som att avsluta ett avbrott, såväl som för att aktivt använda felsökaren.

Ansökan – användbara tips för att lösa specifika problem, ofta med kodexempel.

Errata ark – Beskrivning av fall av icke-standardiserat chipbeteende med alternativa lösningar, om några.

Vad står i databladen

Direkt till Datablad vi kan behöva följande avsnitt:

Enhetssammanfattning – den första sidan i databladet beskriver kortfattat enheten. Mycket användbart i situationer när du hittade ett chip någonstans (såg det i en butik, lödde det, stötte på ett omnämnande) och vill förstå vad det är.

Allmän beskrivning – en mer detaljerad beskrivning av kapaciteten hos chipsen från linjen.

Pinouts – pinoutdiagram för alla möjliga chippaket (vilken stift sitter på vilket ben).

Stiftbeskrivning – beskrivning av varje stifts syfte och kapacitet.

minnes Karta – Det är osannolikt att vi behöver en adresskarta i minnet, men ibland innehåller den också en tabell med registerblockadresser.

Registrera Karta – Adresstabellen för registerblock finns som regel i databladet och i Ref Manual – endast skift (adressförskjutningar).

Elektriska data – i det här avsnittet är vi främst intresserade av Absolut högsta betyg, listar de maximala belastningarna per chip. Till skillnad från den oförstörbara Atmega328p tillåter de flesta MK:er dig inte att ansluta allvarliga belastningar till stiften, vilket blir en obehaglig överraskning för arduinister.

Paketinformation – ritningar av tillgängliga fall, användbara när du designar dina brädor.

Referenshandbok strukturellt består av avsnitt som ägnas åt specifika kringutrustning som anges i deras titel. Varje kapitel kan delas in i tre delar:

Översikt, Beskrivning, Funktioner – Översikt över perifera kapaciteter.

Funktionsbeskrivning, Användarhandbok eller helt enkelt huvudblocket i avsnittet - en detaljerad textbeskrivning av principerna för den perifera enheten och hur man använder den;

register – Beskrivning av kontrollregister. I enkla fall som GPIO eller SPI kan detta vara tillräckligt för att börja använda kringutrustningen, men ofta måste man ändå läsa de tidigare delarna.

Hur man läser datablad

Datablad, av vana, skrämmer dig med sin volym och överflöd av obegripliga ord. Faktum är att allt inte är så skrämmande om du kan några life hacks.

Ställ bra PDF-läsare. Datablad är skrivna i den ärorika traditionen av pappersinstruktioner, de är bra att skriva ut, sätta in med plastbokmärken och sy. Hypertext i dem observeras i spårmängder. Lyckligtvis är åtminstone strukturen i dokumentet utformad med bokmärken, så en lämplig läsare med enkel navigering är mycket nödvändig.

Databladet är inte Stroustrups lärobok, det innehåller behöver inte läsa allt. Om du använde det tidigare rådet, hitta bara önskat avsnitt i bokmärkesfältet.

Speciellt datablad Referenshandböcker, kan beskriva kapaciteten hos inte ett specifikt chip, men hela raden. Det betyder att hälften eller till och med två tredjedelar av informationen inte är relaterad till ditt chip. Innan du studerar TIM7-register, checka in Allmän beskrivning, har du det?

Känna till Engelska tillräckligt för grundläggande nivå. Datablad består till hälften av termer som är obekanta för den genomsnittliga modersmålstalaren, och hälften av enkla sammankopplingsstrukturer. Det finns också utmärkta kinesiska datablad på kinesisk engelska, där hälften också är termer, och den andra hälften är en slumpmässig uppsättning ord.

Om du träffas obekant ord, försök inte översätta det med en engelsk-rysk ordbok. Om du är förvirrad hysteres, då kommer översättningen "hysteres" inte att göra dig varmare. Använd Google, Stack Overflow, Wikipedia, forum, där det erforderliga konceptet kommer att finnas förklaras i enkla ord med exempel.

Det bästa sättet att förstå vad du läser är check in action. Håll därför felsökningstavlan till hands som du bekantar dig med, eller ännu bättre två, ifall du fortfarande missförstod något och såg en magisk rök.

Det är en god vana att ha ditt datablad till hands när du läsa någons handledning eller studerar någon annans bibliotek. Det är mycket möjligt att du hittar en mer optimal lösning på ditt problem i den. Och vice versa - om du inte kan förstå från databladet hur registret faktiskt fungerar, googla det: troligtvis har någon redan beskrivit allt i enkla ord eller lämnat tydlig kod på GitHub.

ordlista

Några användbara ord och symboler som hjälper dig att snabbt vänja dig vid datablad. Det jag kom ihåg de senaste dagarna, tillägg och korrigeringar är välkomna.

Электричество
Vcc, vdd – ”plus”, mat
Vss, Vee – ”minus”, jord
ström - nuvarande
spänning - Spänning
att sänka ström – fungerar som "mark" för extern belastning
att källa ström – extern strömbelastning
hög diskbänk/källstift – stift med ökad "tolerans" för belastning

IO
H, hög – på Vcc-stiftet
L, Låg – på Vss-stiftet
Hög impedans, Hej-Z, flytande – det finns inget på stiftet, "högt motstånd", det är praktiskt taget osynligt för omvärlden.
svag pull up, svag dra ner – inbyggt pull-up/pull-down motstånd, ungefär motsvarande 50 kOhm (se datablad). Den används till exempel för att förhindra att ingångsstiftet dinglar i luften och orsakar falska positiva resultat. Svag - för att det är lätt att "avbryta" honom.
tryck dra – stiftutgångsläge, i vilket den växlar mellan Hög и Låg – vanlig OUTPUT från Arduino.
öppna avlopp – beteckning på utgångsläget där stiftet kan vara antingen LågEller Hög impedans/flytande. Dessutom är detta nästan alltid inte ett "riktigt" öppet avlopp; det finns skyddsdioder, resistorer och annat. Detta är helt enkelt en beteckning för mark/ingen-läge.
riktigt öppet avlopp - men det här är ett riktigt öppet avlopp: stiftet leder direkt till marken om det är öppet, eller förblir i limbo om det är stängt. Detta innebär att vid behov en spänning större än Vcc kan passera genom den, men maxvärdet anges fortfarande i databladet i avsnittet Absolut högsta betyg/spänning.

gränssnitt
i serie – seriekopplad
att kedja – montera chips till en kedja med en seriell anslutning, vilket ökar antalet utgångar.
skifta – shift, betecknar vanligtvis en bit shift. Respektive, att växla in и att flytta ut – ta emot och överföra data bit för bit.
spärr – en spärr som täcker bufferten medan bitar skiftas genom den. När överföringen är klar öppnas ventilen och bitarna börjar fungera.
att klocka in – utför en bit-för-bit-överföring, flytta alla bitar till rätt ställen.
dubbel buffert, skuggregister, förladdningsregister – historikbeteckningar, då registret måste kunna ta emot nya uppgifter, men behålla dem tills någon gång. Till exempel, för att PWM ska fungera korrekt, bör dess parametrar (driftcykel, frekvens) inte ändras förrän den aktuella cykeln slutar, men nya parametrar kan redan överföras. Följaktligen hålls de nuvarande vid skuggregister, och nya faller in förladdningsregisterskrivs till motsvarande chipregister.

Alla sorters saker
förskalare – frekvensförskalare
att ställa in lite – sätt bit till 1
för att rensa/återställa lite – återställ biten till 0 (återställa – STM databladsfunktion)

Vad är nästa

I allmänhet planerades en praktisk del här med en demonstration av tre projekt om STM32 och STM8, gjorda specifikt för denna artikel med hjälp av datablad, med glödlampor, SPI, timers, PWM och avbrott:

Hur och varför läser du datablad om mikrokontroller är din hobby

Men det är mycket text, så projekten skickas till den andra delen.

Förmågan att läsa datablad kommer att hjälpa dig med din hobby, men det är osannolikt att det kommer att ersätta livekommunikation med andra hobbyister på forum och chattar. För detta ändamål måste du först och främst förbättra din engelska. Därför kommer de som läst klart att få ett specialpris: två gratislektioner i Skyeng med den första betalningen med koden HABR2.

Källa: will.com

Lägg en kommentar