Hvordan og hvorfor man lĂŠser datablade, hvis mikrocontrollere er din hobby

Hvordan og hvorfor man lĂŠser datablade, hvis mikrocontrollere er din hobby

Mikroelektronik er en populĂŠr interesse i de seneste Ă„r takket vĂŠre det fantastiske Arduino. Men her er problemet: med den rette interesse bliver man hurtigt trĂŠt af DigitalWrite(), og hvad man skal gĂžre derfra – er ikke helt klart. Arduino-udviklerne har gjort en stor indsats for at sĂŠnke indgangsbarrieren til deres Ăžkosystem, men uden for det stĂ„r der stadig en mĂžrk skov af kompleks elektronik, som er svĂŠrt tilgĂŠngelig for hobbyisten.

For eksempel databladene. De ser ud til at indeholde alt, hvad du behĂžver – tag det og brug det. Men deres forfattere har tydeligvis ikke som mĂ„l at popularisere mikrocontrollere; nogle gange fĂžles det, at de bevidst misbruger uforstĂ„elige termer og forkortelser til at beskrive enkle ting for at forvirre den uindviede. Men alt hĂ„b er ikke ude; med vilje Ă„bner det sig.

I denne artikel vil jeg dele erfaringer fra en humanist med databladene til hobbyformÄl. Teksten er beregnet til dem, der er vokset ud af Arduino-bukserne, og den forudsÊtter en vis forstÄelse for, hvordan mikrocontrollere fungerer.

Lad mig begynde med den traditionelle

Blinke med en LED pÄ Arduino

Og straks koden:

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

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

"Hvad er dette? – vil den erfarne lĂŠser spĂžrge. – Hvorfor skriver du noget til indgangen PINB? Den er jo kun til lĂŠsning!" Faktisk, dokumentationen for Arduino, ligesom de fleste undervisningsartikler pĂ„ internettet, hĂŠvder, at denne registrering er read-only. Jeg troede det ogsĂ„, indtil jeg genlĂŠste datablad Atmega328p, mens jeg forberedte denne artikel. Og der stĂ„r:

Hvordan og hvorfor man lĂŠser datablade, hvis mikrocontrollere er din hobby

Dette er en relativt ny funktion, som ikke var til stede pÄ Atmega8; ikke alle kender den, eller nÊvner den af hensyn til bagudkompatibilitet. Men den er helt brugbar til at demonstrere tanken om, at databladene skal lÊses for at kunne udnytte alle chipens funktioner, inklusive de mindre kendte. Og det er ikke den eneste grund.

Hvorfor skal man ellers lĂŠse databladene

Normalt begynder Arduino-entusiaster at forbinde forskellige moduler og chips til brĂŠttet efter at have leget med LED'er og AnalogWrite'ere, for hvilke der allerede findes biblioteker. Tidligt eller sent dukker der et bibliotek op, der ikke fungerer som forventet. SĂ„ begynder hobbyisten at pille i det for at reparere det, og der


Der sker noget kategorisk uforstÄeligt, sÄ man mÄ ty til Google, lÊse utallige tutorials, snuppe dele af andres kode og endelig opnÄ sit mÄl. Det giver en stÊrk fÞlelse af prÊstation, men i virkeligheden minder processen om at opfinde cyklen ved at reverse-engineere en motorcykel. Der kommer ikke mere forstÄelse for, hvordan denne cykel fungerer. Jeg ved det, fordi jeg selv har beskÊftiget mig med det i lang tid.

Hvis jeg i stedet for denne spÊndende beskÊftigelse havde brugt et par dage pÄ at studere dokumentationen til Atmega328, ville jeg have sparet en enorm mÊngde tid. Det er trods alt en ganske simpel mikrokontroller.

Dermed skal man lÊse databladene, i det mindste for at have en idé om, hvordan mikrokontrolleren overhovedet er bygget og hvad den kan gÞre. Og desuden:

  • for at kunne kontrollere og optimere andres biblioteker. De skrives ofte af ligesindede, der opfinder cyklen; eller ogsĂ„ gĂžr forfatterne med vilje overdreven beskyttelse mod dumhed. Lad det vĂŠre tre gange mere og langsommere, men det virker helt sikkert;

  • for at have mulighed for at bruge chips i projektet, som ingen har skrevet et bibliotek til;

  • for at gĂžre det lettere at migrere fra Ă©n rĂŠkke af MK til en anden;

  • for endelig at optimere min gamle kode, der slet ikke kunne passe ind i Arduino;

  • for at lĂŠre at styre enhver chip direkte gennem dens registre uden at skulle bekymre sig om at studere opbygningen af dens biblioteker, hvis der overhovedet findes nogen.

Hvorfor skrive direkte til registrene, nÄr der findes HAL og LL?

Ordliste
HAL, High Abstraction Layer – et bibliotek til styring af mikrokontrolleren med hþj grad af abstraktion. Hvis man skal bruge SPI1-interface, konfigurerer og aktiverer man blot SPI1 uden at ténke over, hvilke registre der gþr hvad.
LL, Low Level API – et bibliotek, der indeholder makroer eller strukturer med registre adresser, der gĂžr det muligt at tilgĂ„ dem ved navn. DDRx, PORTx, PINx pĂ„ Atmega – det er LL.

Debatter om "HAL, LL eller registre" opstÄr regelmÊssigt i kommentarerne pÄ Habré. Uden at pÄstÄ adgang til astralt viden vil jeg blot dele mine amatÞr erfaringer og overvejelser.

Efter at have forstĂ„et det grundlĂŠggende ved Atmega og lĂŠst artikler om vidunderne ved STM32, kĂžbte jeg et halvt dusin forskellige kort – bĂ„de Discovery og 'De BlĂ„ Tabletter' samt bare chips til mine egne projekter. Alle har ligget i en kasse i to Ă„r. Nogle gange sagde jeg til mig selv: 'det er nu, jeg begynder at arbejde med STM', Ă„bnede CubeMX, genererede en opsĂŠtning for SPI, kiggede pĂ„ den resulterende mur af tekst, der var overdĂžvet med STMs ophavsretter, og besluttede, at det var for meget.

Hvordan og hvorfor man lĂŠser datablade, hvis mikrocontrollere er din hobby

Det er selvfÞlgelig muligt at finde ud af, hvad CubeMX har skrevet her, men det stÄr klart, at det er umuligt at huske alle formuleringerne for senere at skrive dem ned i hÄnden. At fejlfinde det, hvis jeg ved en fejl glemmer at markere en enkelt boks i Cube, er helt uoverskueligt.

To Är er gÄet, og jeg kigger stadig begÊrligt pÄ ST MCU Finder forskellige lÊkre, men uforstÄelige chips, og stÞdte tilfÊldigt pÄ en fantastisk artikel, selvom den handler om STM8. Og nÊvnelse i trÄden jeg indsÄ, at jeg hele tiden havde banket pÄ en Äben dÞr: registrene i STM er bygget pÄ samme mÄde som i enhver anden mikrokontroller, og brugen af Cube er ikke nÞdvendig for at arbejde med dem. Hvad, kunne jeg have gjort det pÄ den mÄde?..

HAL og specielt STM32CubeMX er et vĂŠrktĂžj til professionelle ingeniĂžrer, der arbejder intensivt med STM32-chips. HovedtrĂŠk ved det er det hĂžje abstraheringsniveau, muligheden for hurtigt at migrere fra en mikrokontroller til en anden og endda fra en kerne til en anden, alt sammen inden for STM32-serien. AmatĂžrer mĂžder sjĂŠldent sĂ„danne opgaver – vores valg af mikrokontrollere er som regel begrĂŠnset til hvad der findes pĂ„ AliExpress, og vi migrerer oftere mellem helt forskellige chips – fra Atmega til STM, fra STM til ESP, eller hvad de kinesiske venner nu tilbyder os af nyheder. HAL er ikke til hjĂŠlp her, og tid brugt pĂ„ at lĂŠre det vil tage meget.

Det efterlader LL – men fra det til registrene er der kun et skridt. Personligt finder jeg det nyttigt at skrive mine egne makroer med registrenes adresser: jeg studerer databladet mere omhyggeligt, overvejer hvad jeg mĂ„tte fĂ„ brug for i fremtiden, og hvad der bestemt ikke er nĂždvendigt, bedre strukturerer mine programmer, og generelt fremmer det hukommelsen.

Der er desuden et problem med den populĂŠre STM32F103 – for den findes der to inkompatible versioner af LL, en officiel fra STM, og den anden fra Leaf Labs, der bruges i projektet STM32duino. Hvis man skal skrive et open-source bibliotek (og jeg havde netop sĂ„dan en opgave), skal man enten lave to versioner eller adressere registrene direkte.

Endelig gĂžr afvisningen af LL, efter min mening, migrationen lettere, isĂŠr hvis man planlĂŠgger den fra starten af projektet. Et overdrevet eksempel: lad os skrive en Arduinoblink i Atmel Studio uden 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++);
    } 
}

For at fÄ denne kode til at blinke med lysdiode pÄ et kinesisk board med STM8 (fra ST Visual Desktop), er det nok at Êndre to adresser:

#define DDR_B 0x5007
#define OUT_B 0x5005

Ja, jeg bruger en funktion ved tilslutningen af lysdioden pÄ det specifikke board, det vil blinke meget langsomt, men det vil blinke!

Hvordan ser specifikationerne ud

I artikler og pÄ fora, bÄde pÄ russisk og engelsk, forstÄs 'datasheets' som enhver teknisk dokumentation for chips, og jeg bruger det samme i denne tekst. Formelt set er de kun en af typerne af sÄdan dokumentation:

Datasheet – TTH, taktisk-tekniske karakteristika. Der skal helt sikkert findes et for hver elektronisk komponent. Referencenotater, nyttige at have ved hĂ„nden, men der er ikke meget vigtig lĂŠsning i dem. Alligevel begrĂŠnses enklere chips ofte til datablade for ikke at skabe unĂždvendige dokumenter; i sĂ„danne tilfĂŠlde ReferencehĂ„ndbog inkluderes ogsĂ„ dette.

ReferencehĂ„ndbog – selve vejledningen, en tyk bog pĂ„ 1000+ sider. Det beskriver detaljeret, hvordan alt fungerer, hvad der er puttet i chippen. Hoveddokumentet til at forstĂ„ mikrocontrolleren. I modsĂŠtning til datasheet, skrives vejledninger for en bred vifte af MK, og de indeholder mange oplysninger om periferien, der er fravĂŠrende i din specifikke model.

Programming Manual eller Instruction Set Manual – vejledningen til de unikke kommandoer i mikrocontrolleren. Den er til dem, der programmerer i assembler. Forfatterne til compilere bruger den aktivt til at optimere kode, sĂ„ generelt set har vi ikke brug for den. Men det er nyttigt at kigge her for at fĂ„ en generel forstĂ„else, isĂŠr for nogle specifikke kommandoer sĂ„som initiere en afbrydelse, samt ved aktiv brug af debuggeren.

Application Note – nyttige tips til lþsning af specifikke opgaver, ofte med kodeeksempler.

Errata Sheet – beskrivelse af tilfĂŠlde med unormal adfĂŠrd af chippen med alternativer til at omgĂ„ dem, hvis det er muligt.

Hvad er der i databladene

Direkte i Datasheet kan vi have brug for sÄdanne sektioner:

Device Summary – den fĂžrste side af databladet giver kort information om enheden. Meget nyttig i situationer, hvor du har fundet en chip (set i en butik, udtaget, stĂždt pĂ„ omtale) og vil forstĂ„, hvad det er.

General Description – en mere detaljeret beskrivelse af kapabiliteterne for chips fra serien.

Pinouts – pinoutskemaer for alle mulige chipkapsler (hvilken pind der svarer til hvilken ben).

Pin Description – beskrivelse af formĂ„let og kapabiliteterne for hver pin.

Memory Map – hukommelsesadresserne vil vi nĂŠppe fĂ„ brug for, men nogle gange inkluderes ogsĂ„ en tabel over registrenes adresseblokke.

Register Map – tabellen over registrenes adresseblokke findes som regel i databladet, og i Ref Manual – kun offsets (address offsets).

Electrical Characteristics – i dette afsnit er vi primĂŠrt interesserede i absolute maximum ratings, der opregner de maksimale belastninger pĂ„ chippen. I modsĂŠtning til den uholdbare Atmega328p, tillader de fleste mikrocontrollere ikke at tilknytte betydelige belastninger til pinnene, hvilket bliver en ubehagelig overraskelse for Arduino-brugere.

Package Information – tegninger af tilgéngelige kabinetter, nyttige ved design af egne kredslþb.

ReferencehÄndbog strukturelt bestÄr af sektioner dedikeret til det specifikke periferi nÊvnt i deres overskrifter. Hver kapitel kan groft opdeles i tre dele:

Oversigt, Introduktion, Features – oversigt over periferiets kapabiliteter;

Functional Description, Usage Guide eller blot den primére blok i afsnittet – en detaljeret tekstbeskrivelse af periferiets funktioner og brug;

Registers – beskrivelse af kontrolregistre. I simple tilfĂŠlde som GPIO eller SPI kan dette vĂŠre tilstrĂŠkkeligt for at begynde at bruge periferien, men ofte mĂ„ man dog stadig lĂŠse de tidligere dele.

Hvordan man lĂŠser datablad

Datablade kan virke skrÊmmende med deres lÊngde og overflod af uklare ord. I virkeligheden er det ikke sÄ skrÊmmende, hvis man kender et par tricks.

Installer en god PDF-lÊser. Datablade er skrevet i de stolte traditioner for papirmanualer, de er gode at udskrive, benzere og binde dem plastisk. Hypertekst ses i meget begrÊnsede mÊngder. Heldigvis er dokumentets struktur dog forsynet med bogmÊrker, sÄ en god lÊser med nem navigation er meget nÞdvendig.

Et datablad er ikke en lĂŠrebog af Stroustrup, i det er der ikke noget behov for at lĂŠse alt fra ende til anden. Hvis du har brugt det tidligere rĂ„d – find blot den Ăžnskede sektion i bogmĂŠrkespanelet.

Datablade, isĂŠr Reference Manuals, kan beskrive kapabiliteterne for ikke den specifikke chip, men hele serien. Det betyder, at halvdelen, eller to tredjedele af informationen ikke er relevant for din chip. FĂžr du studerer registrene TIM7, skal du kontrollere i General Description, har du den?

At vide engelsk er tilstrÊkkeligt pÄ grundlÊggende niveau. Databladene bestÄr halvt af termer, der er ukendte for den gennemsnitlige taler, og halvt af enkle forbindelses strukturer. Der findes ogsÄ fantastiske kinesiske datablad pÄ kinesisk engelsk, hvor halvdelen ogsÄ er termer, og den anden halvdel er tilfÊldige ord.

Hvis du stÞder pÄ et ukendt ord, sÄ forsÞg ikke at oversÊtte det med en engelsk-russisk ordbog. Hvis det forvirrer dig hysteresis, bliver oversÊttelsen 'hysteresis' ikke varmere for dig. Brug Google, Stack Overflow, Wikipedia, fora, hvor det nÞdvendige koncept vil blive forklaret med enkle ord og eksempler.

Den bedste mĂ„de at forstĂ„ det lĂŠste pĂ„ er at prĂžve det i praksis. SĂ„ hav et udviklingsboard ved hĂ„nden, som du lĂŠrer at kende, eller bedre endnu to – i tilfĂŠlde af at du stadig ikke forstod alt og sĂ„ den magiske rĂžg.

Det er nyttigt at have databladet ved hĂ„nden, nĂ„r du lĂŠser en anden persons tutorial eller undersĂžger en andens bibliotek. Det er meget muligt, at du finder en mere optimal lĂžsning pĂ„ dit problem dĂ©r. Omvendt – hvis du ikke kan forstĂ„ fra databladet, hvordan registreringen faktisk fungerer, sĂ„ googl det: sandsynligvis har nogen allerede beskrevet det med enkle ord eller efterladt klar kode pĂ„ GitHub.

Ordliste

Nogle nyttige ord og betegnelser, der hjĂŠlper med hurtigt at vĂŠnne sig til databladene. Det, der er kommet i tankerne de sidste par dage, er velkomne tilfĂžjelser og rettelser.

Elektricitet
Vcc, Vdd – 'plus', strþm
Vss, Vee – 'minus', jord
current – strþm
voltage – spénding
to sink current – fungere som 'jord' for en ekstern belastning
to source current – forsyne en ekstern belastning
high sink/source pin – en pin med hþjere 'tolerance' overfor belastning

IO
H, High – pĂ„ pin Vcc
L, Low – pĂ„ pin Vss
High Impedance, Hi-Z, floating – pĂ„ pinnen er der ingenting, 'hĂžj modstand', det er faktisk usynligt for den ydre verden.
weak pull up, weak pull down – indbygget pull-up/pull-down modstand, cirka 50 kΩ (se datablad). Den bruges for eksempel for at sikre, at indgangspinnen ikke svĂŠver i luften, hvilket forĂ„rsager falske aktiveringer. Weak – fordi den er let at 'overkomme'.
push pull – udgangstilstand for pinnen, hvor den skifter mellem Hþj og Lav – standard OUTPUT med Arduino.
open drain – betegnelse for udgangstilstand, hvor pinnen kan vĂŠre enten Lav, eller High Impedance / Floating. Det er nĂŠsten altid ikke en "ĂŠgte" Ă„ben aflĂžb; der er beskyttende dioder, modstande osv. Dette er blot en betegnelse for jord-/ingen.
ĂŠgte Ă„ben aflĂžb – men dette er faktisk en ĂŠgte Ă„ben aflĂžb: benet gĂ„r direkte til jorden, nĂ„r det er Ă„bent, eller forbliver i en flydende tilstand, nĂ„r det er lukket. Det betyder, at det kan lede spĂŠnding stĂžrre end Vcc, men maksimum er stadig angivet i databladet i afsnittet Absolutte Maksimale Vurderinger / SpĂŠnding.

GrĂŠnseflader
i serie – tilsluttet i serie
til kéde – samle chips i en kéde ved serielforbindelse, hvilket þger antallet af udgange.
shift – skift, normalt betegner det bitshift. Fþlgelig, at skifte ind og at skifte ud – modtage og sende data bit for bit.
latch – skydelĂ„s, der dĂŠkker bufferen, mens bitene skydes gennem den. NĂ„r transmissionen er afsluttet, Ă„bnes skydelĂ„sen, og bitene begynder at arbejde.
at clocke ind – udfþre bit-for-bit transmission, flytte alle bit til de rigtige pladser.
dobbelt buffer, skygregister, forudindlĂŠsningsregister – betegnelser fra historien, nĂ„r registeret skal kunne modtage nye data, men holde dem tilbage indtil et bestemt tidspunkt. For korrekt drift af PWM mĂ„ dens parametre (duty cycle, frekvens) ikke ĂŠndres, indtil den nuvĂŠrende cyklus er afsluttet, men nye parametre kan allerede vĂŠre givet. FĂžlgelig opbevares de nuvĂŠrende i skygregister, og de nye kommer ind i forudindlĂŠsningsregister, nĂ„r de skrives ind i det tilsvarende chip-register.

Enhver
prescaler – frekvensdeler
at sétte et bit – sétte bit til 1
at rydde/reset et bit – nulstille bit til 0 (reset – en funktion af STM-datablade)

vil vĂŠre udsolgt

Der var faktisk planlagt en praktisk del med demonstration af tre projekter pÄ STM32 og STM8, lavet specielt til denne artikel ved hjÊlp af databladene, med lamper, SPI, timere, PWM og afbrydelser:

Hvordan og hvorfor man lĂŠser datablade, hvis mikrocontrollere er din hobby

Men teksten bliver lidt for meget, sÄ projekterne sendes til del to.

FĂŠrdigheden til at lĂŠse databladene vil hjĂŠlpe dig med din hobby, men vil nĂŠppe erstatte den personlige kommunikation med kolleger med samme interesse pĂ„ fora og i chatrum. For det krĂŠver det, at man fĂžrst forbedrer det engelske sprog. Derfor fĂ„r dem, der lĂŠser det til slut – en speciel belĂžnning: to gratis lektioner i Skyeng ved fĂžrste betaling med koden HABR2.

Kilde: habr.com

KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster