Hvordan og hvorfor læse datablade, hvis mikrocontrollere er din hobby

Hvordan og hvorfor læse datablade, hvis mikrocontrollere er din hobby

Mikroelektronik er en fashionabel hobby i de senere år takket være den magiske Arduino. Men her er problemet: med tilstrækkelig interesse kan du hurtigt vokse ud af DigitalWrite(), men hvad du skal gøre nu er ikke helt klart. Arduino-udviklere har brugt mange kræfter på at sænke barrieren for adgang til deres økosystem, men uden for det er der stadig en mørk skov af barske kredsløb, der er utilgængelige for amatøren.

For eksempel datablade. Det virker som om de har alt, tag det og brug det. Men deres forfattere sætter tydeligvis ikke sig selv til opgave at popularisere mikrocontrollere; Sommetider ser det ud tilat de bevidst misbruger uforståelige termer og forkortelser, når de beskriver simple ting for at forvirre de uindviede mest muligt. Men ikke alt er så slemt, hvis det ønskes, åbnes kisten.

I denne artikel vil jeg dele erfaringerne fra en humanistisk specialist, der kommunikerer med datablade til hobbyformål. Teksten er beregnet til amatører, der er vokset op fra Arduino-bukser; den forudsætter en vis forståelse af principperne for drift af mikrocontrollere.

Jeg starter med det traditionelle

Blinker 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? – En sofistikeret læser vil spørge. – Hvorfor skriver du noget til PINB-indtastningsregisteret? Det er kun til læsning!" Virkelig, Arduino dokumentation, ligesom de fleste undervisningsartikler på internettet, at dette register er skrivebeskyttet. Det troede jeg selv, indtil jeg læste det igen datablad til Atmega328p, ved at forberede denne artikel. Og der:

Hvordan og hvorfor læse datablade, hvis mikrocontrollere er din hobby

Dette er en relativt ny funktionalitet, den var ikke på Atmega8, ikke alle ved om den eller er ikke nævnt af årsager til bagudkompatibilitet. Men det er ganske velegnet til at demonstrere ideen om, at datablade er værd at læse for at bruge alle chippens muligheder, inklusive lidt kendte. Og dette er ikke den eneste grund.

Hvorfor ellers læse datablade?

Normalt begynder Arduino-ingeniører, efter at have spillet nok med LED'er og AnalogWrites, at forbinde alle mulige moduler og chips til kortet, som der allerede er skrevet biblioteker til. Før eller siden dukker der et bibliotek op, som ikke fungerer, som det skal. Så begynder amatøren at pille i det for at ordne det, og så...

Og noget helt uforståeligt sker der, så du skal gå til Google, læse adskillige tutorials, trække dele af en andens passende kode ud og endelig nå dit mål. Dette giver en stærk følelse af præstation, men i virkeligheden er processen som at genopfinde hjulet ved at reverse engineering af en motorcykel. Desuden øges forståelsen af, hvordan denne cykel fungerer, ikke. Jeg ved det, for jeg har selv gjort det her i ret lang tid.

Hvis jeg i stedet for denne spændende aktivitet havde brugt et par dage på at studere Atmega328-dokumentationen, ville jeg have sparet enormt meget tid. Dette er trods alt en ret simpel mikrocontroller.

Derfor skal du i det mindste læse datablade for at forestille dig, hvordan mikrocontrolleren generelt fungerer, og hvad den kan. Og videre:

  • at tjekke og optimere andres biblioteker. De er ofte skrevet af de samme amatører, som genopfinder hjulet; eller tværtimod, forfatterne gør dem bevidst overdrevent idiotsikre. Lad det være tre gange større og langsommere, men det vil helt sikkert virke;

  • at kunne bruge chips i et projekt, som ingen har skrevet et bibliotek til;

  • at gøre det lettere for dig selv at migrere fra en MK-linje til en anden;

  • for endelig at optimere din gamle kode, som ikke passede ind i Arduino;

  • at lære at styre enhver chip direkte gennem dens registre uden at besvære sig med at studere strukturen af ​​dens biblioteker, hvis nogen.

Hvorfor skrive til registre direkte, når der er HAL og LL?

ordliste
HAL, High Abstraktionslag – et bibliotek til styring af en mikrocontroller med et højt abstraktionsniveau. Hvis du skal bruge SPI1-grænsefladen, konfigurerer og aktiverer du blot SPI1 uden at tænke på, hvilke registre der er ansvarlige for hvad.
LL, Low Level API – et bibliotek, der indeholder makroer eller strukturer med registeradresser, så du kan få adgang til dem ved navn. DDRx, PORTx, PINx på Atmega er LL.

Tvister om emnet "HAL, LL eller registre" opstår jævnligt i kommentarer på Habré. Uden at kræve adgang til astral viden, vil jeg blot dele mine amatørerfaringer og tanker.

Efter mere eller mindre at have fundet ud af Atmega og efter at have læst artikler om det vidunderlige ved STM32, købte jeg et halvt dusin forskellige boards - Discovery og Blue Pills, og endda bare chips til mine hjemmelavede produkter. De samlede alle støv i en kasse i to år. Nogle gange sagde jeg til mig selv: "det var det, fra denne weekend mestrer jeg STM," lancerede CubeMX, genererede en opsætning til SPI, kiggede på den resulterende væg af tekst, generøst smagt til med STM-ophavsrettigheder og besluttede, at det på en eller anden måde også var meget.

Hvordan og hvorfor læse datablade, hvis mikrocontrollere er din hobby

Selvfølgelig kan du finde ud af, hvad CubeMX skrev her. Men samtidig er det klart, at det er urealistisk at huske alle formuleringerne og så skrive dem i hånden. Og for at debugge dette, hvis jeg ved et uheld glemmer at markere en boks i terningen, er det helt fint.

To år er gået, jeg slikker stadig mig om læberne ST MCU Finder for alle mulige velsmagende, men ud over min forståelse, chips, og ved et uheld kom på tværs vidunderlig artikel, omend om STM8. OG pludselig Jeg indså, at jeg al denne tid havde banket på en åben dør: STM'ens registre er arrangeret på samme måde som enhver anden MK's, og kuben er ikke nødvendig for at arbejde med dem. Var det overhovedet muligt?..

HAL og specifikt STM32CubeMX er et værktøj til professionelle ingeniører, der arbejder tæt sammen med STM32-chips. Hovedfunktionen er et højt abstraktionsniveau, evnen til hurtigt at migrere fra en MCU til en anden og endda fra en kerne til en anden, mens du forbliver inden for STM32-linjen. Hobbyister støder sjældent på sådanne problemer - vores valg af mikrocontrollere er som regel begrænset til AliExpress-sortimentet, og vi migrerer ofte mellem radikalt forskellige chips - vi flytter fra Atmega til STM, fra STM til ESP, eller hvad der nu er nyt, vores kinesiske venner kaste på os. HAL vil ikke hjælpe her, og at studere det vil æde meget tid.

LL forbliver - men fra den til registrene er der et halvt skridt. Personligt finder jeg det nyttigt at skrive mine makroer med registeradresser: Jeg studerer dataarket mere omhyggeligt, jeg tænker på, hvad jeg får brug for i fremtiden, og hvad jeg bestemt ikke vil, jeg strukturerer mine programmer bedre, og generelt hjælper overvindelse med at huske .

Derudover er der en nuance med den populære STM32F103 - der er to inkompatible LL-versioner til den, en embedsmand fra STM, den anden fra Leaf Labs, brugt i STM32duino-projektet. Hvis du skriver et open source-bibliotek (og jeg havde præcis sådan en opgave), skal du enten lave to versioner eller få direkte adgang til registrene.

Endelig vil eliminering af LL efter min mening forenkle migration, især hvis du planlægger det helt fra begyndelsen af ​​projektet. Overdrevet eksempel: lad os skrive Arduino blink 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 denne kode skal blinke LED'en på et kinesisk bord med STM8 (fra ST Visual Desktop), er det nok at ændre to adresser i det:

#define DDR_B 0x5007
#define OUT_B 0x5005

Ja, jeg bruger en funktion til at forbinde LED'en på et specifikt bord, det vil blinke meget langsomt, men det vil ske!

Hvilke typer datablade findes der?

I artikler og på fora, både russisk og engelsk, betyder "dataark" enhver teknisk dokumentation for chips, og jeg gør det samme i denne tekst. Formelt set er de kun én type sådan dokumentation:

Blad – Præstationskarakteristika, taktiske og tekniske egenskaber. Obligatorisk for enhver elektronisk komponent. Baggrundsinformation er nyttig at have ved hånden, men der er ikke meget at læse i dem. Men simplere chips er ofte begrænset til et datablad for ikke at producere unødvendige dokumenter; I dette tilfælde Referencehåndbog er medtaget her.

Referencehåndbog – selve instruktionerne, en sund bog på 1000+ sider. Arbejdet med alt, der er proppet ind i chippen, er beskrevet i detaljer. Hoveddokumentet til at mestre mikrocontrolleren. I modsætning til datablad, er instruktioner skrevet til en bred vifte af MK'er; de indeholder en masse information om perifere enheder, der ikke er tilgængelige i din specifikke model.

Programmeringsmanual eller Instruktionssæt manual – instruktioner til unikke mikrocontroller-kommandoer. Designet til dem, der programmerer i Assembly sprog. Compiler forfattere bruger det aktivt til at optimere kode, så i det generelle tilfælde har vi ikke brug for det. Men at se her er nyttigt for en generel forståelse, for nogle specifikke kommandoer, såsom at afslutte en interrupt, såvel som til aktiv brug af fejlfinderen.

Anvendelse note – nyttige tips til løsning af specifikke problemer, ofte med kodeeksempler.

Errata ark – beskrivelse af tilfælde af ikke-standard chipadfærd med eventuelle løsninger.

Hvad står der i databladene

Direkte til Blad vi har muligvis brug for følgende sektioner:

Enhedsoversigt – den første side af dataarket beskriver kort enheden. Meget nyttig i situationer, hvor du fandt en chip et sted (så den i en butik, loddede den, stødte på en omtale) og vil forstå, hvad det er.

Generel beskrivelse – en mere detaljeret beskrivelse af mulighederne for chipsene fra linjen.

Pinouts – pinout-diagrammer for alle mulige chippakker (hvilken pin er på hvilket ben).

Pin Beskrivelse – beskrivelse af formålet og mulighederne for hver stift.

Memory Kort – Vi har næppe brug for et adressekort i hukommelsen, men nogle gange inkluderer det også en tabel med registerblokadresser.

Registrer kort – tabellen over adresser for registerblokke er som regel placeret i databladet og i Ref manual – kun skift (adresseforskydninger).

Elektriske egenskaber – i dette afsnit er vi primært interesserede i absolut maksimale vurderinger, med en liste over de maksimale belastninger pr. chip. I modsætning til den uforgængelige Atmega328p tillader de fleste MK'er dig ikke at forbinde alvorlige belastninger til stifterne, hvilket bliver en ubehagelig overraskelse for arduinister.

Pakkeinformation – tegninger af tilgængelige sager, nyttige når du designer dine tavler.

Referencehåndbog strukturelt består af afsnit om specifikke perifere enheder angivet i deres titel. Hvert kapitel kan opdeles i tre dele:

Oversigt, Introduktion, Funktionalitet – oversigt over perifere kapaciteter;

Funktionsbeskrivelse, Brugsvejledning eller blot hovedblokken i afsnittet - en detaljeret tekstbeskrivelse af principperne for den perifere enhed og hvordan man bruger den;

registre – beskrivelse af kontrolregistre. I simple tilfælde som GPIO eller SPI kan dette være ganske nok til at begynde at bruge de perifere enheder, men ofte skal du stadig læse de foregående dele.

Sådan læser du datablade

Datablade skræmmer dig af vane med deres volumen og overflod af uforståelige ord. Faktisk er alt ikke så skræmmende, hvis du kender et par life hacks.

Indstil god PDF-læser. Datablade er skrevet i den herlige tradition med papirinstruktioner; de er gode at printe ud, indsætte med plastikbogmærker og sy. Hypertekst i dem observeres i spormængder. Heldigvis er strukturen af ​​dokumentet i det mindste designet med bogmærker, så en passende læser med nem navigation er meget nødvendig.

Databladet er ikke Stroustrups lærebog; det indeholder ingen grund til at læse alt. Hvis du brugte det tidligere råd, skal du blot finde det ønskede afsnit i bogmærkelinjen.

Datablade, især Referencehåndbøger, kan beskrive mulighederne for ikke en specifik chip, men hele linjen. Det betyder, at halvdelen eller endda to tredjedele af oplysningerne ikke er relevante for din chip. Inden du studerer TIM7-registre, skal du tjekke ind Generel beskrivelse, har du det?

Ved godt English nok til basis niveau. Datablade består halvdelen af ​​termer, som den gennemsnitlige indfødte taler ikke kender, og halvdelen af ​​simple forbindelsesstrukturer. Der er også fremragende kinesiske datablade på kinesisk engelsk, hvor halvdelen også er udtryk, og den anden halvdel er et tilfældigt sæt ord.

Hvis du møder ukendte ord, prøv ikke at oversætte det ved hjælp af en engelsk-russisk ordbog. Hvis du er forvirret hysterese, så vil oversættelsen "hysterese" ikke gøre dig varmere. Brug Google, Stack Overflow, Wikipedia, fora, hvor det krævede koncept vil være forklaret i enkle ord med eksempler.

Den bedste måde at forstå, hvad du læser, er check i aktion. Hold derfor fejlretningstavlen ved hånden, som du er ved at gøre dig bekendt med, eller endnu bedre to, hvis du stadig har misforstået noget og så en magisk røg.

Det er en god vane at have dit datablad ved hånden, når du læser nogens tutorial eller studere en andens bibliotek. Det er meget muligt, at du finder en mere optimal løsning på dit problem i den. Og omvendt - hvis du ikke kan forstå ud fra dataarket, hvordan registeret rent faktisk fungerer, google det: højst sandsynligt har nogen allerede beskrevet alt i enkle ord eller efterladt tydelig kode på GitHub.

ordliste

Nogle nyttige ord og symboler, der hjælper dig med hurtigt at vænne dig til dataark. Hvad jeg huskede i de sidste par dage, tilføjelser og rettelser er velkomne.

elektricitet
Vcc, Sand – “plus”, mad
Vss, Vee – "minus", jord
strøm - nuværende
spænding - spænding
at synke strøm – arbejde som "jord" for ekstern belastning
at kilde strøm – ekstern strømbelastning
højvask/kildestift – pin med øget "tolerance" til belastning

IO
H, høj – på Vcc-stiften
L, lav – på Vss-stiften
Høj impedans, Hej-Z, flydende – der er intet på stiften, "høj modstand", det er stort set usynligt for omverdenen.
svag pull up, svagt træk ned – indbygget pull-up/pull-down modstand, cirka svarende til 50 kOhm (se datablad). Den bruges f.eks. til at forhindre, at indgangsstiften dingler i luften og forårsager falske positiver. Svag - fordi det er nemt at "afbryde" ham.
skub træk – pin-udgangstilstand, hvor den skifter mellem Høj и Lav – almindelig OUTPUT fra Arduino.
åbent afløb – betegnelse for udgangstilstanden, hvor stiften kan være enten LavEller Høj impedans/flydende. Desuden er dette næsten altid ikke et "rigtigt" åbent afløb; der er beskyttelsesdioder, modstande og hvad der ikke kan. Dette er simpelthen en betegnelse for jord/ingen tilstand.
ægte åbent afløb - men dette er et rigtigt åbent dræn: stiften fører direkte til jorden, hvis den er åben, eller forbliver i limbo, hvis den er lukket. Det betyder, at der om nødvendigt kan føres en spænding større end Vcc gennem den, men maksimum er stadig angivet i databladet i afsnittet Absolut maksimale ratings/spænding.

Interfaces
i serie – forbundet i serie
at kæde – samle chips til en kæde ved hjælp af en seriel forbindelse, hvilket øger antallet af udgange.
skifte – skift, betegner normalt et bitskifte. Henholdsvis, at skifte ind и at skifte ud – modtage og sende data bit for bit.
låsen – en lås, der dækker bufferen, mens bits flyttes gennem den. Når overførslen er afsluttet, åbner ventilen, og bitsene begynder at fungere.
at klokke ind – udfør en bit-for-bit-overførsel, flyt alle bits til de rigtige steder.
dobbelt buffer, skyggeregister, preload register – historikbetegnelser, når registret skal kunne acceptere nye data, men holde det indtil et tidspunkt. For at PWM for eksempel skal fungere korrekt, bør dens parametre (driftscyklus, frekvens) ikke ændres, før den aktuelle cyklus slutter, men nye parametre kan allerede overføres. De nuværende holdes derfor på skyggeregister, og nye falder ind preload register, bliver skrevet til det tilsvarende chipregister.

Alle mulige ting
præscaler – frekvensforskalering
at sætte lidt – sæt bit til 1
for at rydde/nulstille lidt – nulstil bit til 0 (nulstille - STM datablad funktion)

Hvad er næste

Generelt var der planlagt en praktisk del her med en demonstration af tre projekter om STM32 og STM8, lavet specifikt til denne artikel ved hjælp af datablade, med pærer, SPI, timere, PWM og interrupts:

Hvordan og hvorfor læse datablade, hvis mikrocontrollere er din hobby

Men der er meget tekst, så projekterne sendes til anden del.

Evnen til at læse dataark vil hjælpe dig med din hobby, men det er usandsynligt, at det vil erstatte live kommunikation med andre hobbyfolk på fora og chats. Til dette formål skal du stadig forbedre dit engelsk først og fremmest. Derfor vil de, der er færdige med at læse, modtage en særlig præmie: to gratis lektioner i Skyeng med den første betaling med koden HABR2.

Kilde: www.habr.com

Tilføj en kommentar