Hur och varför man ska lÀsa datablad, om mikrokontroller Àr ditt hobbyintresse

Hur och varför man ska lÀsa datablad, om mikrokontroller Àr ditt hobbyintresse

Mikroelektronik Àr en populÀr hobby de senaste Ären tack vare den magiska Arduino. Men tyvÀrr: med rÀtt intresse vÀxer man snabbt ur DigitalWrite(), och vad man ska göra hÀrnÀst Àr inte helt klart. Arduino-utvecklarna har lagt ner mycket arbete pÄ att sÀnka intrÀdesbarriÀren till sitt ekosystem, men utanför dess grÀnser skÀlver fortfarande den mörka skogen av hÄrdvaruteknik, svÄrÄtkomlig för nybörjare.

Till exempel, databladen. Det verkar som om de har allt, bara ta och anvÀnda. Men deras författare uppenbarligen inte har som mÄl att popularisera mikrokontroller; ibland verkar, som om de medvetet missbrukar oklara termer och akronymer för att beskriva enkla saker, för att maximalt förvirra den oinvigda. Men det Àr inte sÄ illa, med lite intresse öppnar sig lÄdan.

I den hÀr artikeln kommer jag att dela med mig av erfarenheterna hos en humanist nÀr det kommer till databladen för hobbyÀndamÄl. Texten Àr avsedd för de som vuxit ur Arduino-byxorna och förutsÀtter en viss förstÄelse av hur mikrokontroller fungerar.

Jag börjar med det traditionella

Blinka med en lysdiod pÄ Arduino

Och hÀr Àr koden:

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

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

"Vad Ă€r detta?" – FrĂ„gar den erfarne lĂ€saren. – "Varför skriver du nĂ„got i ingĂ„ngsregistret PINB? Det Ă€r ju bara för lĂ€sning!" Det Ă€r sant, Arduino-dokumentationen, precis som de flesta utbildningsartiklar pĂ„ internet, hĂ€vdar att detta register Ă€r read-only. Jag trodde ocksĂ„ det, tills jag lĂ€ste om datablad Atmega328p, medan jag förberedde den hĂ€r artikeln. Och dĂ€r stĂ„r det:

Hur och varför man ska lÀsa datablad, om mikrokontroller Àr ditt hobbyintresse

Detta Àr en relativt ny funktionalitet, den fanns inte pÄ Atmega8, och inte alla kÀnner till eller nÀmner den av bakÄtkompatibilitets skÀl. Men det Àr fullt anvÀndbart för att visa tanken att man bör lÀsa databladen för att utnyttja alla möjligheter hos chipet, inklusive de mindre kÀnda. Och det Àr inte den enda anledningen.

Varför man bör lÀsa databladen

Vanligtvis börjar Arduino-anvĂ€ndare, efter att ha lekt med lysdioder och AnalogWrite, att koppla in olika moduler och chip till kortet, för vilka det redan finns skrivna bibliotek. Men förr eller senare dyker ett bibliotek upp som inte fungerar som det ska. DĂ„ börjar hobbyn börjar peta i den för att fixa den, och dĂ€r


DÀr sker nÄgot som Àr helt oförstÄeligt, sÄ man tvingas att gÄ till Google, lÀsa otaliga handledningar, plocka delar frÄn nÄgon annans lÀmpliga kod och slutligen nÄ sina mÄl. Det ger en stark kÀnsla av prestation, men i sjÀlva verket pÄminner processen om att uppfinna en cykel genom att omvÀnda ingenjörskonst av en motorcykel. Och förstÄelsen för hur den hÀr cykeln fungerar ökar inte. Jag vet, eftersom jag har sysslat med detta ganska lÀnge.

Om jag istÀllet för detta fascinerande projekt hade lagt ett par dagar pÄ att studera dokumentationen för Atmega328, skulle jag ha sparat en enorm mÀngd tid. I slutÀndan Àr det en ganska enkel mikrokontroller.

SÄledes mÄste man lÀsa datablad minst för att förstÄ hur mikrokontrollern Àr uppbyggd och vad den kan göra. Och dessutom:

  • för att kunna kontrollera och optimera andras bibliotek. Dessa skrivs ofta av lika entusiastiska personer som uppfinner cykeln; eller, Ă„ andra sidan, författarna gör avsiktligt överflödig sĂ€kerhet för dĂ„rar. LĂ„t det vara tre gĂ„nger mer och lĂ„ngsammare, men det kommer definitivt att fungera;

  • för att kunna anvĂ€nda chip i projektet för vilka ingen har skrivit ett bibliotek;

  • för att göra det enklare att migrera frĂ„n en serie mikrokontrollers till en annan;

  • för att slutligen optimera sin gamla kod, som aldrig passade i Arduino;

  • för att lĂ€ra sig att styra vilken chip som helst direkt genom dess register, utan att behöva bekymra sig om att lĂ€ra sig strukturen i dess bibliotek, om sĂ„dana finns.

Varför skriva direkt i registren nÀr det finns HAL och LL?

Ordbok
HAL, High Abstraction Layer – ett bibliotek för att styra en mikrokontroller med hög nivĂ„ av abstraktion. Om man behöver anvĂ€nda SPI1-grĂ€nssnittet, konfigurerar och aktiverar man bara 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, vilket gör att man kan referera till dem med namn. DDRx, PORTx, PINx pĂ„ Atmega – detta Ă€r LL.

Diskussioner om "HAL, LL eller register" dyker regelbundet upp i kommentarerna pÄ Habré. Utan att pÄstÄ att jag har tillgÄng till astral kunskap, delar jag bara med mig av mina amatörmÀssiga erfarenheter och synpunkter.

Mer eller mindre bekant med Atmega och efter att ha lĂ€st artiklar om fördelarna med STM32, köpte jag ett halvdussin olika kort – bĂ„de Discovery och "BlĂ„a Tabletter", och till och med rena chip för mina egna projekt. Alla har legat i en lĂ„da i tvĂ„ Ă„r. Ibland sa jag till mig sjĂ€lv: "Nu börjar jag med STM frĂ„n detta veckoslut", startade CubeMX, genererade en setup för SPI, tittade pĂ„ den resulterande textvĂ€ggen, djupt kryddad av STM:s copyright, och beslöt att detta var lite för mycket.

Hur och varför man ska lÀsa datablad, om mikrokontroller Àr ditt hobbyintresse

SjÀlvklart Àr det möjligt att förstÄ vad CubeMX har skrivit. Men det Àr samtidigt klart att man inte kan komma ihÄg alla formuleringar för att sedan skriva dem manuellt. Och att debuggning av detta, om jag av misstag glömmer att slÄ pÄ nÄgon ruta i Cube, Àr helt ohanterligt.

TvÄ Är har gÄtt, och jag kollar fortfarande pÄ ST MCU Finder diverse intressanta men otillgÀngliga chip, och rÄkade snubbla över en utmÀrkt artikel, Àven om den handlar om STM8. Och plötsligt jag insÄg att jag hela tiden hade knackat pÄ en öppen dörr: register i STM Àr strukturerade precis som i vilken annan MK som helst, och för att arbeta med dem Àr Cube inte nödvÀndigt. VadÄ, kunde man göra sÄ?..

HAL och specifikt STM32CubeMX Ă€r verktyg för professionella ingenjörer som arbetar intensivt med STM32-chip. Den största fördelen Ă€r den höga abstraktionsnivĂ„n, möjligheten att snabbt migrera frĂ„n en MK till en annan och till och med frĂ„n en kĂ€rna till en annan, och Ă€ndĂ„ hĂ„lla sig inom STM32-familjen. Hobbyister stöter sĂ€llan pĂ„ sĂ„dana uppgifter – vĂ„rt val av MK Ă€r vanligtvis begrĂ€nsat till utbudet pĂ„ AliExpress, och vi migrerar oftare mellan helt olika chip – flyttar frĂ„n Atmega till STM, frĂ„n STM till ESP, eller vad de kinesiska vĂ€nnerna nu erbjuder oss.

Det kvarstĂ„r LL – men frĂ„n det till registren Ă€r det bara ett steg. Personligen tycker jag att skriva mina egna makron med registeradresser Ă€r anvĂ€ndbart: jag studerar databladet noggrant, tĂ€nker pĂ„ vad jag kommer att behöva i framtiden och vad som definitivt Ă€r onödigt, strukturerar bĂ€ttre mina program, och generellt sett hjĂ€lper övervinning att lĂ€ra sig.

Dessutom finns det ett problem med den populĂ€ra STM32F103 – för den finns tvĂ„ inkompatibla versioner av LL, en officiell frĂ„n STM och den andra frĂ„n Leaf Labs, som anvĂ€nds i projektet STM32duino. Om man ska skriva ett open-source bibliotek (och det var exakt den uppgiften), mĂ„ste man antingen göra tvĂ„ versioner eller gĂ„ direkt till registren.

Till slut förenklar avvisandet av LL, enligt min mening, migrationen, sÀrskilt om man planerar för det frÄn början av projektet. Ett överdrivet exempel: vi skriver ett 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 denna kod ska blinka en LED pÄ ett kinesiskt kretskort med STM8 (frÄn ST Visual Desktop), rÀcker det med att Àndra tvÄ adresser i den:

#define DDR_B 0x5007
#define OUT_B 0x5005

Ja, jag anvÀnder en speciell anslutning för LED:en pÄ det aktuella kortet, blinkandet kommer att vara vÀldigt lÄngsamt, men det kommer att fungera!

Vilka typer av datablad finns det

I artiklar och pÄ forum, bÄde pÄ ryska och engelska, betecknar "datablad" all teknisk dokumentation för chip, och sÄ gör jag Àven i denna text. Formellt sett Àr de endast en av typerna av sÄdan dokumentation:

Datablad – TTX, taktisk-tekniska specifikationer. Finns alltid för varje elektronisk komponent. Referensinformation, bra att ha till hands, men nĂ„got att tĂ€nka igenom i detalj finns det inte mycket av. Dock begrĂ€nsas enklare chip ofta till datablad för att undvika onödig dokumentation; i sĂ„ fall Reference Manual ingĂ„r detta hĂ€r ocksĂ„.

Reference Manual – sjĂ€lva manualen, en stor bok pĂ„ 1000+ sidor. Det beskrivs noggrant hur allt arbete i chipet fungerar. Huvuddokumentet för att lĂ€ra sig mikrokontrollern. Till skillnad frĂ„n datasheet, skrivs manualer för en bred serie MK, och de innehĂ„ller mycket information om periferin som saknas i din specifika modell.

Programmeringsmanual eller Instruktionshandbok – en instruktion om de unika kommandona för mikrokontrollern. Avsedd för dem som programmerar i assembler. Författarna av kompilatorer anvĂ€nder den aktivt för att optimera kod, sĂ„ i allmĂ€nna fall kommer vi inte att behöva den. Men det Ă€r bra att titta hit för att fĂ„ en allmĂ€n förstĂ„else, för vissa specifika kommandon som att avbryta, samt vid aktiv anvĂ€ndning av en debugger.

Applikationsnotat – anvĂ€ndbara tips för att lösa specifika uppgifter, ofta med exempel pĂ„ kod.

Errata-blad – en beskrivning av fall av icke-standardbeteende hos chipet med alternativa lösningar, om nĂ„gra.

Vad som finns i datablad

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

Enhetsöversikt – första sidan av databladet ger i korthet information om enheten. Mycket anvĂ€ndbar i situationer dĂ€r du har stött pĂ„ ett chip nĂ„gonstans (sett i en butik, lött ut det, stött pĂ„ en hĂ€nvisning) och vill förstĂ„ vad det Ă€r.

AllmĂ€n beskrivning – en mer detaljerad beskrivning av chipens möjligheter.

Pinouts – scheman för pinarrangemang för alla möjliga chipkapslar (vilken pin som finns pĂ„ vilken fot).

Pin Description – beskrivning av funktionen och möjligheterna hos varje pin.

Memory Map – minnesadresskartan kommer förmodligen inte att behövas, men ibland inkluderar den ocksĂ„ en tabell över adressblockens register.

Register Map – tabell över adressblockens register finns vanligtvis i databladet, och i Ref Manual – endast förskjutningar (address offsets).

Electrical Characteristics – i detta avsnitt Ă€r vi först och frĂ€mst intresserade av absolute maximum ratings, som listar de maximala belastningar som chipet kan hantera. Till skillnad frĂ„n den oförstörbara Atmega328p tillĂ„ter flesta MK inte att koppla allvarliga belastningar till pins, vilket blir en obehaglig överraskning för Arduino-anvĂ€ndare.

Package Information – ritningar av tillgĂ€ngliga kapslar, anvĂ€ndbara vid design av egna kretskort.

Reference Manual bestÄr strukturellt av avsnitt som Àr dedikerade till specifik periferihazard, som anges i deras rubriker. Varje kapitel kan grovt sett delas in i tre delar:

Översikt, Introduktion, Features – en översikt över periferins funktioner;

Functional Description, Usage Guide eller helt enkelt den huvudsakliga delen av avsnittet – en detaljerad textbeskrivning av hur periferin fungerar och hur den anvĂ€nds;

Registers – beskrivning av kontrollregister. I enkla fall som GPIO eller SPI kan detta vara tillrĂ€ckligt för att börja anvĂ€nda periferin, men oftast mĂ„ste man ocksĂ„ lĂ€sa de föregĂ„ende delarna.

Hur man lÀser datablad

Datablad kan vara skrÀmmande till en början med sin volym och mÀngden oklara ord. Egentligen Àr det inte sÄ illa om man vet nÄgra tricks.

Installera en bra PDF-lÀsare. Datablad skrivs i god tradition av pappersmanualer; det Àr fantastiskt att skriva ut dem, anvÀnda plastmarkörer och binda ihop dem. Hypertext finns i mycket smÄ mÀngder. Lyckligtvis gör dock dokumentets struktur det möjligt att anvÀnda markers, sÄ en bra lÀsare med enkel navigering Àr mycket nödvÀndig.

Datablad Ă€r inte en lĂ€robok av Stroustrup; man behöver inte lĂ€sa allt i ordning. Om du följde det tidigare rĂ„det – hitta helt enkelt det nödvĂ€ndiga avsnittet i bokmĂ€rkespanelen.

Datablad, sÀrskilt Reference Manuals, kan beskriva möjligheter inte för ett specifikt chip utan för hela serien. Det betyder att hÀlften, eller till och med tvÄ tredjedelar av informationen, inte har nÄgot att göra med din chip. Innan du studerar TIM7-register, kontrollera om AllmÀn beskrivning, har du det.

Att veta engelska Ă€r tillrĂ€ckligt pĂ„ grundlĂ€ggande nivĂ„. Datasheets bestĂ„r till hĂ€lften av termer som en genomsnittlig sprĂ„knivĂ„ inte Ă€r bekant med, och till hĂ€lften av enkla bindande konstruktioner. Det finns Ă€ven utmĂ€rkta kinesiska datasheets pĂ„ ”kinesisk engelska”, dĂ€r hĂ€lften Ă€r termer och den andra hĂ€lften Ă€r en slumpmĂ€ssig uppsĂ€ttning ord.

Om du stöter pÄ ett okÀnt ord, försök inte översÀtta det med en engelsk-ryska ordbok. Om du blir förvirrad av hysteresis, sÄ kommer översÀttningen "hysteresis" inte att göra dig varmare. AnvÀnd Google, Stack Overflow, Wikipedia, forum dÀr det relevanta begreppet förklaras med enkla ord och exempel.

Det bĂ€sta sĂ€ttet att förstĂ„ det lĂ€sta Ă€r att pröva praktiskt. SĂ„ hĂ„ll en utvecklingsbrĂ€da till hands, gĂ€rna tvĂ„ – ifall du inte har förstĂ„tt nĂ„got och ser den magiska röken.

Det Ă€r en bra vana att ha datasheeten till hands nĂ€r du lĂ€ser nĂ„gon annan tutorial eller studerar nĂ„gon annans bibliotek. Det Ă€r mycket möjligt att du hittar en mer optimal lösning pĂ„ ditt problem dĂ€r. Å andra sidan – om det frĂ„n datasheeten inte gĂ„r att förstĂ„ hur registret fungerar, googla det: troligtvis har nĂ„gon redan beskrivit det med enkla ord eller lĂ€mnat en begriplig kod pĂ„ GitHub.

Ordbok

Lite anvÀndbara ord och beteckningar som hjÀlper dig att snabbare bekanta dig med datasheets. Det som minns sig frÄn de senaste par dagarna, tillÀgg och correctioner Àr vÀlkomna.

Elektricitet
Vcc, Vdd – "plus", strömförsörjning
Vss, Vee – "minus", jord
current – ström
spĂ€nning – spĂ€nning
för att sĂ€nka ström – fungera som "jord" för extern belastning
för att kĂ€llstraum – försörja extern belastning
hög sĂ€nka/kĂ€lla pin – pin med hög "tolerans" för belastning

IO
H, High – pĂ„ pin Vcc
L, Low – pĂ„ pin Vss
Hög impedans, Hi-Z, flytande – pĂ„ pin finns inget, "hög resistans", den Ă€r faktist osynlig för den yttre vĂ€rlden.
svag pull up, svag pull down – inbyggd drag-upp/dra-ned resistor, ungefĂ€r 50 kΩ (se datasheet). AnvĂ€nds till exempel för att hĂ„lla ingĂ„ngspinnen frĂ„n att svĂ€va i luften och orsaka falska uppvaknanden. Svag – eftersom den enkelt kan "överskridas".
push pull – utgĂ„ngslĂ€get av pinnen, dĂ€r den vĂ€xlar mellan Hög och LĂ„g – vanlig OUTPUT med Arduino.
öppen drĂ€nering – beteckning för utgĂ„ngslĂ€get dĂ€r stiftet kan vara antingen LĂ„g, eller Hög impedans / Flytande. Vid detta tillstĂ„nd Ă€r det nĂ€stan alltid inte en "riktig" öppen drĂ€nering, det finns skyddsdioder, motstĂ„nd och sĂ„ vidare. Det Ă€r bara en beteckning för lĂ€get jord/nothing.
riktig öppen drĂ€nering – och detta Ă€r en riktig öppen drĂ€nering: stiftet leder direkt till jord nĂ€r det Ă€r öppet, eller Ă€r i svĂ€vtillstĂ„nd nĂ€r det Ă€r stĂ€ngt. Detta betyder att spĂ€nning högre Ă€n Vcc kan passera genom det om det behövs, men maxvĂ€rdet anges fortfarande i databladet i avsnittet Absoluta maximala vĂ€rden / SpĂ€nning.

GrÀnssnitt
i serie – anslutna i serie
till kedja – samla chip i en kedja genom att ansluta dem i serie, vilket ökar antalet utgĂ„ngar.
shift – skift, vanligtvis betecknar bitförskjutning. DĂ€rmed, att skifta in och att skifta ut – ta emot och överföra data bit för bit.
latch – en spĂ€rr som tĂ€cker bufferten medan bitarna skiftas genom den. NĂ€r överföringen Ă€r avslutad öppnas spĂ€rren och bitarna börjar fungera.
att klocka in – utföra bitförskjutning, flytta alla bitar pĂ„ de nödvĂ€ndiga platserna.
dubbel buffert, skuggreferens, förladdningsregister – beteckningar för historien nĂ€r registret mĂ„ste kunna ta emot nya data, men hĂ„lla dem tills en viss tidpunkt. Till exempel, för korrekt drift av PWM bör dess parametrar (cykel, frekvens) inte Ă€ndras förrĂ€n den aktuella cykeln Ă€r avslutad, men nya parametrar kan redan ha överförts. DĂ€rmed hĂ„lls de aktuella i skuggreferens, medan de nya gĂ„r till förladdningsregister, skrivs in i motsvarande register pĂ„ chipet.

Allt möjligt
prescaler – frekvensfördelare
att sĂ€tta en bit – sĂ€tta biten till 1
att rensa/nollstĂ€lla en bit – nollstĂ€lla biten till 0 (Ă„terstĂ€llning – funktion i STM-datablad)

Vad hÀnder hÀrnÀst

Det var faktiskt planerat en praktisk del med demonstration av tre projekt pÄ STM32 och STM8, utförda speciellt för denna artikel med hjÀlp av datablad, med lampor, SPI, tidtagare, PWM och avbrott:

Hur och varför man ska lÀsa datablad, om mikrokontroller Àr ditt hobbyintresse

Men texten blir lite för mycket, sÄ projekten gÄr till del tvÄ.

FĂ€rdigheten att lĂ€sa datablad kommer att hjĂ€lpa dig med din hobby, men ersĂ€tter knappast det faktiska samtalet med kollegor i ditt intresse pĂ„ forum och chattar. För detta mĂ„ste du Ă€ndĂ„ i första hand förbĂ€ttra engelskan. DĂ€rför, till dem som har lĂ€st till slut – en specialbelöning: tvĂ„ gratis lektioner i Skyeng vid första betalning med koden HABR2.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster