Hvordan og hvorfor lese dataark hvis mikrokontrollere er hobbyen din

Hvordan og hvorfor lese dataark hvis mikrokontrollere er hobbyen din

Mikroelektronikk er en fasjonabel hobby de siste årene takket være den magiske Arduinoen. Men her er problemet: med nok interesse kan du raskt vokse ut av DigitalWrite(), men hva du skal gjøre videre er ikke helt klart. Arduino-utviklere har lagt mye arbeid i å senke barrieren for å komme inn i økosystemet deres, men utenfor det er det fortsatt en mørk skog av harde kretser som er utilgjengelige for amatørene.

For eksempel dataark. Det virker som de har alt, ta det og bruk det. Men forfatterne deres setter seg tydeligvis ikke i oppgave å popularisere mikrokontrollere; Noen ganger synesat de bevisst misbruker uforståelige termer og forkortelser når de beskriver enkle ting for å forvirre de uinnvidde mest mulig. Men ikke alt er så ille; om ønskelig åpnes kisten.

I denne artikkelen vil jeg dele erfaringen til en humanioraspesialist som kommuniserer med dataark for hobbyformål. Teksten er ment for amatører som har vokst opp fra Arduino-bukser; den forutsetter en viss forståelse av prinsippene for drift av mikrokontrollere.

Jeg begynner med det tradisjonelle

Blinker en LED på Arduino

Og umiddelbart koden:

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

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

"Hva er dette? – En sofistikert leser vil spørre. – Hvorfor skriver du noe til PINB-inndataregisteret? Den er kun for lesing!" Egentlig, Arduino dokumentasjon, som de fleste pedagogiske artikler på Internett, oppgir at dette registeret er skrivebeskyttet. Jeg trodde det selv helt til jeg leste det om igjen datablad til Atmega328p, forbereder denne artikkelen. Og der:

Hvordan og hvorfor lese dataark hvis mikrokontrollere er hobbyen din

Dette er en relativt ny funksjonalitet, den var ikke på Atmega8, ikke alle vet om den eller er ikke nevnt på grunn av bakoverkompatibilitet. Men det er ganske egnet for å demonstrere ideen om at dataark er verdt å lese for å bruke alle egenskapene til brikken, inkludert lite kjente. Og dette er ikke den eneste grunnen.

Hvorfor ellers lese datablad?

Vanligvis begynner Arduino-ingeniører, etter å ha spilt nok med lysdioder og AnalogWrites, å koble alle slags moduler og brikker til brettet, som det allerede er skrevet biblioteker for. Før eller siden dukker det opp et bibliotek som ikke fungerer som det skal. Så begynner amatøren å plukke på den for å fikse den, og så...

Og noe helt uforståelig skjer der, så du må gå til Google, lese en rekke veiledninger, trekke ut deler av noens passende kode og til slutt nå målet ditt. Dette gir en kraftig følelse av prestasjon, men i virkeligheten er prosessen som å finne opp hjulet på nytt ved å reversere en motorsykkel. Dessuten øker ikke forståelsen av hvordan denne sykkelen fungerer. Jeg vet, for jeg har gjort dette selv i ganske lang tid.

Hvis jeg i stedet for denne spennende aktiviteten hadde brukt et par dager på å studere Atmega328-dokumentasjonen, ville jeg ha spart enormt mye tid. Tross alt er dette en ganske enkel mikrokontroller.

Derfor må du i det minste lese databladene for å forestille deg hvordan mikrokontrolleren generelt fungerer og hva den kan gjøre. Og videre:

  • å sjekke og optimere andres biblioteker. De er ofte skrevet av de samme amatørene som finner opp hjulet på nytt; eller tvert imot, forfatterne gjør dem bevisst overdrevent idiotsikre. La det være tre ganger større og tregere, men det vil definitivt fungere;

  • å kunne bruke brikker i et prosjekt som ingen har skrevet et bibliotek for;

  • å gjøre det lettere for deg selv å migrere fra en MK-linje til en annen;

  • for å endelig optimalisere den gamle koden din, som ikke passet inn i Arduino;

  • å lære hvordan du kontrollerer en hvilken som helst brikke direkte gjennom registrene, uten å bry deg med å studere strukturen til bibliotekene, hvis noen.

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

ordliste
HAL, høyabstraksjonslag – et bibliotek for å kontrollere en mikrokontroller med et høyt abstraksjonsnivå. Hvis du trenger å bruke SPI1-grensesnittet, konfigurerer og aktiverer du SPI1 uten å tenke på hvilke registre som er ansvarlige for hva.
LL, lavt nivå API – et bibliotek som inneholder makroer eller strukturer med registeradresser, som lar deg få tilgang til dem med navn. DDRx, PORTx, PINx på Atmega er LL.

Tvister om emnet "HAL, LL eller registre" oppstår jevnlig i kommentarer på Habré. Uten å kreve tilgang til astral kunnskap, vil jeg ganske enkelt dele mine amatørerfaringer og tanker.

Etter å ha mer eller mindre funnet ut av Atmega og etter å ha lest artikler om det fantastiske med STM32, kjøpte jeg et halvt dusin forskjellige brett - Discovery og Blue Pills, og til og med bare chips for mine hjemmelagde produkter. De samlet alle støv i en boks i to år. Noen ganger sa jeg til meg selv: "Det var det, jeg mestrer STM denne helgen," lanserte CubeMX, genererte et oppsett for SPI, så på den resulterende tekstveggen, sjenerøst smaksatt med STM-opphavsrett og bestemte at dette på en eller annen måte var for mye .

Hvordan og hvorfor lese dataark hvis mikrokontrollere er hobbyen din

Selvfølgelig kan du finne ut hva CubeMX skrev her. Men samtidig er det klart at det er urealistisk å huske alle ordlydene og så skrive dem for hånd. Og for å feilsøke dette, hvis jeg ved et uhell glemmer å merke av i en boks i kuben, er det helt greit.

To år har gått, jeg slikker meg fortsatt om leppene ST MCU Finder for alle slags velsmakende, men utover min forståelse, chips, og ved et uhell kom over fantastisk artikkel, riktignok om STM8. OG plutselig Jeg innså at jeg hele denne tiden hadde banket på en åpen dør: registrene til STM er ordnet på samme måte som alle andre MK, og kuben er ikke nødvendig for å jobbe med dem. Var det i det hele tatt mulig?..

HAL og spesifikt STM32CubeMX er et verktøy for profesjonelle ingeniører som jobber tett med STM32-brikker. Hovedfunksjonen er et høyt abstraksjonsnivå, muligheten til å raskt migrere fra en MCU til en annen og til og med fra en kjerne til en annen, mens du forblir innenfor STM32-linjen. Hobbyister støter sjelden på slike problemer - vårt valg av mikrokontrollere er som regel begrenset til AliExpress-sortimentet, og vi migrerer ofte mellom radikalt forskjellige sjetonger - vi flytter fra Atmega til STM, fra STM til ESP, eller hva som helst nye ting våre kinesiske venner kaste på oss. HAL vil ikke hjelpe her, og å studere det vil spise opp mye tid.

LL gjenstår - men fra den til registrene er det et halvt trinn. Personlig synes jeg det er nyttig å skrive makroene mine med registeradresser: Jeg studerer dataarket mer nøye, jeg tenker på hva jeg vil trenge i fremtiden og hva jeg definitivt ikke vil, jeg strukturerer programmene mine bedre, og generelt hjelper det å overvinne. .

I tillegg er det en nyanse med den populære STM32F103 - det er to inkompatible LL-versjoner for den, en offisiell fra STM, den andre fra Leaf Labs, brukt i STM32duino-prosjektet. Hvis du skriver et åpen kildekode-bibliotek (og jeg hadde akkurat en slik oppgave), må du enten lage to versjoner, eller få tilgang til registrene direkte.

Til slutt, eliminering av LL, etter min mening, gjør migrering enklere, spesielt hvis du planlegger det helt fra begynnelsen av prosjektet. Overdrevet eksempel: la oss skrive Arduino blink i Atmel Studio uten 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 koden skal blinke lysdioden på et kinesisk bord med STM8 (fra ST Visual Desktop), er det nok å endre to adresser i den:

#define DDR_B 0x5007
#define OUT_B 0x5005

Ja, jeg bruker en funksjon for å koble til LED-en på et spesifikt bord, det vil blinke veldig sakte, men det vil skje!

Hvilke typer datablad finnes det?

I artikler og på fora, både russisk og engelsk, betyr "dataark" all teknisk dokumentasjon for brikker, og jeg gjør det samme i denne teksten. Formelt sett er de bare én type slik dokumentasjon:

Datablad – Ytelsesegenskaper, taktiske og tekniske egenskaper. Obligatorisk for enhver elektronisk komponent. Bakgrunnsinformasjon er nyttig å ha for hånden, men det er ikke mye å lese i den. Imidlertid er enklere brikker ofte begrenset til et dataark for ikke å produsere unødvendige dokumenter; i dette tilfellet Referansehåndbok er inkludert her.

Referansehåndbok – selve instruksjonene, en sunn bok på 1000+ sider. Arbeidet med alt som er stappet inn i brikken er beskrevet i detalj. Hoveddokumentet for å mestre mikrokontrolleren. I motsetning til dataarket, er instruksjoner skrevet for et bredt spekter av MK-er; de inneholder mye informasjon om periferiutstyr som ikke er tilgjengelig i din spesifikke modell.

Programmeringshåndbok eller Instruksjonssett Manual – instruksjoner for unike mikrokontrollerkommandoer. Designet for de som programmerer i Assembly-språk. Kompilatorforfattere bruker det aktivt for å optimalisere kode, så i det generelle tilfellet trenger vi det ikke. Men å se her er nyttig for en generell forståelse, for noen spesifikke kommandoer som å avslutte et avbrudd, samt for aktiv bruk av feilsøkeren.

Bruksanvisning – nyttige tips for å løse spesifikke problemer, ofte med kodeeksempler.

Errata ark – beskrivelse av tilfeller av ikke-standard brikkeoppførsel med eventuelle løsninger.

Hva står i databladene

Direkte til Datablad vi kan trenge følgende seksjoner:

Enhetssammendrag – den første siden i dataarket beskriver kort enheten. Veldig nyttig i situasjoner når du fant en brikke et sted (så den i en butikk, loddet den, kom over en omtale) og ønsker å forstå hva den er.

Generell beskrivelse – en mer detaljert beskrivelse av egenskapene til sjetongene fra linjen.

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

Pin Beskrivelse – beskrivelse av formålet og egenskapene til hver pinne.

Memory Map – Vi trenger neppe et adressekart i minnet, men noen ganger inkluderer det også en tabell med registerblokkadresser.

Registrer kart – tabellen over adresser til registerblokker er som regel plassert i dataarket og i Ref Manual – kun skift (adresseforskyvninger).

Elektriske egenskaper – i denne delen er vi først og fremst interessert i absolutte maksimale karakterer, som viser maksimale belastninger per brikke. I motsetning til den uforgjengelige Atmega328p, lar de fleste MK-er deg ikke koble alvorlige belastninger til pinnene, noe som blir en ubehagelig overraskelse for arduinister.

Pakkeinformasjon – tegninger av tilgjengelige saker, nyttig når du designer tavler.

Referansehåndbok strukturelt består av seksjoner viet til spesifikke periferiutstyr angitt i tittelen. Hvert kapittel kan deles inn i tre deler:

Oversikt, Introduksjon, Egenskaper – oversikt over perifere kapasiteter;

Funksjonell beskrivelse, Bruksanvisning eller ganske enkelt hovedblokken i seksjonen - en detaljert tekstbeskrivelse av prinsippene for den perifere enheten og hvordan du bruker den;

registre – beskrivelse av kontrollregistre. I enkle tilfeller som GPIO eller SPI kan dette være nok til å begynne å bruke periferiutstyret, men ofte må du likevel lese de foregående delene.

Hvordan lese dataark

Dataark skremmer deg av vane med volum og overflod av uforståelige ord. Faktisk er ikke alt så skummelt hvis du kjenner noen få life hacks.

Satt god PDF-leser. Datablad er skrevet i den herlige tradisjonen med papirinstruksjoner; de er flotte å skrive ut, sette inn med plastbokmerker og sy. Hypertekst i dem er observert i spormengder. Heldigvis er strukturen i dokumentet i det minste designet med bokmerker, så en passende leser med enkel navigering er svært nødvendig.

Dataarket er ikke Stroustrups lærebok; det inneholder trenger ikke å lese alt. Hvis du brukte det forrige rådet, finner du bare ønsket avsnitt i bokmerkelinjen.

Datablad, spesielt Referansehåndbøker, kan beskrive egenskapene til ikke en spesifikk brikke, men hele linjen. Dette betyr at halvparten eller til og med to tredjedeler av informasjonen ikke er relatert til brikken din. Sjekk inn før du studerer TIM7-registrene Generell beskrivelse, har du det?

Vet Norsk nok til grunnleggende nivå. Dataark består halvparten av termer som er ukjente for den gjennomsnittlige morsmålstaleren, og halvparten av enkle koblingsstrukturer. Det er også utmerkede kinesiske dataark på kinesisk engelsk, der halvparten også er termer, og den andre halvdelen er et tilfeldig sett med ord.

Hvis du møter ukjent ord, ikke prøv å oversette det med en engelsk-russisk ordbok. Hvis du er forvirret hysterese, da vil ikke oversettelsen "hysterese" gjøre deg varmere. Bruk Google, Stack Overflow, Wikipedia, fora, hvor det nødvendige konseptet vil være forklart i enkle ord med eksempler.

Den beste måten å forstå det du leser på er sjekke i aksjon. Hold derfor feilsøkingstavlen for hånden som du gjør deg kjent med, eller enda bedre to, i tilfelle du fortsatt har misforstått noe og så en magisk røyk.

Det er en god vane å ha dataarket ditt tilgjengelig når du lese noens veiledning eller studere noen andres bibliotek. Det er ganske mulig at du vil finne en mer optimal løsning på problemet ditt i den. Og omvendt - hvis du ikke kan forstå fra dataarket hvordan registeret faktisk fungerer, google det: mest sannsynlig har noen allerede beskrevet alt i enkle ord eller lagt igjen tydelig kode på GitHub.

ordliste

Noen nyttige ord og symboler som hjelper deg raskt å bli vant til dataark. Det jeg husket de siste par dagene, tillegg og rettelser er velkommen.

Электричество
Vcc, ekte – “pluss”, mat
Vss, Vee – «minus», jord
nåværende - nåværende
spenning - Spenning
å senke strøm – fungerer som "jord" for ekstern belastning
å kilde strøm – ekstern strømbelastning
høyvask/kildestift – pinne med økt "toleranse" for belastning

IO
H, Høy – på Vcc-pinnen
L, lav – på Vss-pinnen
Høy impedans, Hei-Z, flytende – det er ingenting på pinnen, "høy motstand", den er praktisk talt usynlig for omverdenen.
svak pull up, svakt trekk ned – innebygd pull-up/pull-down motstand, omtrent tilsvarende 50 kOhm (se datablad). Den brukes for eksempel for å forhindre at inngangspinnen dingler i luften og forårsaker falske alarmer. Svak - fordi det er lett å "avbryte" ham.
trykk trekk – pin-utgangsmodus, der den veksler mellom Høy и Lav – vanlig OUTPUT fra Arduino.
åpent sluk – betegnelse på utgangsmodusen der pinnen kan være enten LavEller Høy impedans/flytende. Dessuten er dette nesten alltid ikke et "ekte" åpent avløp; det er beskyttelsesdioder, motstander og annet. Dette er rett og slett en betegnelse for bakke/ingen-modus.
ekte åpent avløp - men dette er et skikkelig åpent avløp: tappen fører direkte til bakken hvis den er åpen, eller forblir i limbo hvis den er lukket. Dette betyr at om nødvendig kan en spenning større enn Vcc føres gjennom den, men maksimum er fortsatt spesifisert i dataarket i seksjonen Absolutte maksimale karakterer/spenning.

grensesnitt
i serier – koblet i serie
å lenke – sette sammen brikker til en kjede ved hjelp av en seriell forbindelse, og øke antall utganger.
skift – shift, betegner vanligvis en bit shift. Henholdsvis å skifte inn и å skifte ut – motta og overføre data bit for bit.
klinke – en lås som dekker bufferen mens biter forskyves gjennom den. Når overføringen er fullført, åpnes ventilen og bitene begynner å fungere.
å klokke inn – utfør en bit-for-bit-overføring, flytt alle bitene til de riktige stedene.
dobbel buffer, skyggeregister, forhåndsinnlastingsregister – historikkbetegnelser, når registeret skal kunne akseptere nye data, men beholde det til et tidspunkt. For eksempel, for at PWM skal fungere riktig, bør parameterne (driftsyklus, frekvens) ikke endres før den nåværende syklusen avsluttes, men nye parametere kan allerede overføres. Følgelig holdes de nåværende på skyggeregister, og nye faller inn forhåndsinnlastingsregister, blir skrevet til det tilsvarende brikkeregisteret.

Alle mulige ting
prescaler – frekvensforskalering
å sette litt – sett bit til 1
for å slette/nullstille litt – tilbakestill bit til 0 (tilbakestille – STM databladfunksjon)

Hva er neste

Generelt ble det planlagt en praktisk del her med en demonstrasjon av tre prosjekter på STM32 og STM8, laget spesielt for denne artikkelen ved hjelp av dataark, med lyspærer, SPI, timere, PWM og avbrudd:

Hvordan og hvorfor lese dataark hvis mikrokontrollere er hobbyen din

Men det er mye tekst, så prosjektene sendes til andre del.

Ferdigheten til å lese dataark vil hjelpe deg med hobbyen din, men det er usannsynlig å erstatte live kommunikasjon med andre hobbyister på fora og chatter. For dette formålet må du fortsatt forbedre engelsken din først og fremst. Derfor vil de som er ferdige med å lese, motta en spesiell premie: to gratis leksjoner i Skyeng med første betaling med koden HABR2.

Kilde: www.habr.com

Legg til en kommentar