Hoe en waarom datasheets te lezen als microcontrollers jouw hobby zijn

Hoe en waarom datasheets te lezen als microcontrollers jouw hobby zijn

Micro-elektronica is een trendy bezigheid van de laatste jaren, dankzij de magie van Arduino. Maar er is een probleem: bij voldoende interesse groeit men snel uit DigitalWrite(), en wat daarna te doen is niet helemaal duidelijk. De ontwikkelaars van Arduino hebben veel moeite gestoken in het verlagen van de instapdrempel voor hun ecosysteem, maar daarbuiten blijft er een donkere wildernis van strenge schakelingen, moeilijk toegankelijk voor de liefhebber.

Bijvoorbeeld, datasheets. Het lijkt alsof ze alles bevatten, gewoon pakken en gebruiken. Maar de auteurs hebben duidelijk niet de doelstelling om microcontrollers populair te maken; soms lijkt het, dat ze opzettelijk misbruik maken van onduidelijke termen en afkortingen bij het beschrijven van eenvoudige dingen, om de leek zo goed mogelijk te verwarren. Maar het is niet allemaal slecht, als je wilt opent het zich.

In dit artikel deel ik mijn ervaring als geesteswetenschapper met datasheets voor hobbydoeleinden. De tekst is bedoeld voor degenen die zijn gegroeid uit hun Arduino-broekjes; hij veronderstelt enige kennis van de werkprincipes van microcontrollers.

Ik begin met de traditionele

Knipperen met een LED op Arduino

En meteen de code:

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

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

«Wat is dit? – vraagt de doorgewinterde lezer. – Waarom schrijf je iets naar de invoerregister PINB? Die is toch alleen voor lezen!» Dat klopt, de documentatie van Arduino, zoals de meeste educatieve artikelen op het internet, stelt dat dit register alleen-lezen is. Ik dacht dat ook, totdat ik het opnieuw las datasheet over de Atmega328p, terwijl ik dit artikel voorbereid. En daar staat:

Hoe en waarom datasheets te lezen als microcontrollers jouw hobby zijn

Dit is een relatief nieuwe functionaliteit, het was er niet op de Atmega8, niet iedereen weet ervan of noemt het om redenen van achterwaartse compatibiliteit. Maar het is zeker nuttig om de gedachte te demonstreren dat het lezen van datasheets de moeite waard is om alle mogelijkheden van de chip te benutten, inclusief de minder bekende. En dit is niet de enige reden.

Waarom nog meer datasheets lezen

Gewoonlijk beginnen Arduino-enthousiastelingen, nadat ze gespeeld hebben met LED's en AnalogWrite-s, allerlei modules en chips aan te sluiten met al geschreven bibliotheken. Vroeg of laat verschijnt er een bibliotheek die niet doet wat het moet. Dan begint de amateur deze te prutsen om deze te repareren, en daar...

Daar gebeurt iets volstrekt onbegrijpelijk, waardoor je weer naar Google moet, talloze tutorials moet lezen, stukjes van iemands geschikte code moet trekken en uiteindelijk je doel moet bereiken. Dit geeft een krachtig gevoel van prestatie, maar het proces lijkt eigenlijk op het uitvinden van een fiets door reverse engineering van een motorfiets. En het begrip van hoe deze fiets werkt, neemt niet toe. Ik weet het, want ik heb hier zelf behoorlijk lang mee geknoeid.

Als ik in plaats van deze fascinerende bezigheid een paar dagen had besteed aan het bestuderen van de documentatie van de Atmega328, had ik een hoop tijd bespaard. Uiteindelijk is het een vrij eenvoudige microcontroller.

Dus, je moet datasheets lezen, om in ieder geval een idee te hebben van hoe de microcontroller is opgebouwd en wat hij kan doen. En verder:

  • om de bibliotheken van anderen te controleren en te optimaliseren. Deze worden vaak geschreven door dezelfde amateur die de fiets opnieuw uitvindt, of omgekeerd, de auteurs maken opzettelijk overbodige beveiligingen tegen domheid. Laat het maar drie keer zoveel gecompliceerd en langzamer zijn, als het maar gegarandeerd werkt;

  • om in staat te zijn chips te gebruiken in je project waarvoor niemand een bibliotheek heeft geschreven;

  • om het je gemakkelijker te maken om van de ene serie microcontrollers naar de andere te migreren;

  • om eindelijk je oude code te optimaliseren die helemaal niet in de Arduino paste;

  • om te leren elk chip rechtstreeks aan te sturen via zijn registers, zonder je te bekommeren om het bestuderen van de werking van zijn bibliotheken, als die er al zijn.

Waarom direct naar de registers schrijven, als er HAL en LL zijn?

Woordenlijst
HAL, High Abstraction Layer – een bibliotheek voor het aansturen van een microcontroller met een hoog abstractieniveau. Als je de SPI1-interface moet gebruiken, stel je gewoon SPI1 in en schakel je het in, zonder je af te vragen welke registers waarvoor verantwoordelijk zijn.
LL, Low Level API – een bibliotheek die macro's of structuren met registeradressen bevat, waardoor je er bij naam naar kunt verwijzen. DDRx, PORTx, PINx op de Atmega – dat is LL.

Discussies over "HAL, LL of registers" komen regelmatig voor in de reacties op Habr. Zonder aanspraak te maken op toegang tot astrale kennis, wil ik gewoon mijn amateurervaring en overpeinzing delen.

Na het verkennen van de Atmega en het lezen van artikelen over de voordelen van de STM32, kocht ik een half dozijn verschillende borden – zowel Discovery als de ‘Blauwe Tablets’, en zelfs gewoon chips voor mijn eigen projecten. Ze hebben twee jaar in een doos stof liggen verzamelen. Soms zei ik tegen mezelf: ‘Dit is het, dit weekend ga ik STM leren’, opende CubeMX, genereerde de set-up voor SPI, keek naar de resulterende muur van tekst, rijkelijk versierd met copyrightvermeldingen van STM, en besloot dat het toch wel een beetje te veel was.

Hoe en waarom datasheets te lezen als microcontrollers jouw hobby zijn

Het is natuurlijk mogelijk om te begrijpen wat CubeMX heeft geschreven. Maar tegelijkertijd is het duidelijk dat het onrealistisch is om alle formuleringen te onthouden, zodat ik ze later met de hand kan schrijven. En als ik per ongeluk vergeet om in Cube een vinkje te zetten, wordt het helemaal een gedoe.

Twee jaar zijn verstreken, en ik kijk nog steeds verlangend naar ST MCU Finder allerlei lekkere chips die voor mijn begrip onbereikbaar zijn, en stuitte per toeval op een geweldig artikel, ook al gaat het over STM8. En plotseling realiseerde ik me dat ik de hele tijd tegen een open deur aan het kloppen was: de registers van STM zijn hetzelfde ingericht als die van elke andere microcontroller, en voor het werken ermee is Cube niet noodzakelijk. En wat, dat kon zo? ..

HAL en specifiek STM32CubeMX zijn tools voor professionele ingenieurs die nauw samenwerken met STM32-chips. Het belangrijkste kenmerk is het hoge abstractieniveau, de mogelijkheid om snel te migreren van de ene microcontroller naar de andere en zelfs van de ene kern naar de andere, terwijl je binnen de STM32 lijn blijft. Hobbyisten komen zelden met zulke taken in aanraking – onze keuze aan microcontrollers is meestal beperkt tot het assortiment van AliExpress, en we migreren vaker tussen radicaal verschillende chips – we schakelen over van de Atmega naar de STM, van de STM naar de ESP, of wat onze Chinese vrienden ons ook maar nieuw aanbieden. HAL zal hier niet helpen, en het leren ervan kost veel tijd.

Dat laat LL over – maar daar is het maar een klein stapje naar de registers. Persoonlijk vind ik het nuttig om mijn eigen macro's met de adressen van de registers te schrijven: ik bestudeer de datasheet beter, denk na over wat ik in de toekomst nodig zal hebben, en wat absoluut niet, en ik structureer mijn programma's beter; en bovendien helpt de overwinning bij het onthouden.

Bovendien is er een nuance met de populaire STM32F103 – voor deze microcontroller zijn er twee incompatibele versies van LL, één officiële van STM, de andere van Leaf Labs, gebruikt in het STM32duino-project. Als je een open-source bibliotheek schrijft (en dat was precies mijn taak), dan moet je ofwel twee versies maken, of rechtstreeks naar de registers verwijzen.

Uiteindelijk maakt het afzien van LL, naar mijn mening, de migratie gemakkelijker, vooral als men vanaf het begin van het project daarop rekent. Een overdrijven voorbeeld: laten we een Arduino-blink schrijven in Atmel Studio zonder 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++);
    } 
}

Om deze code de LED op een Chinese bord met STM8 (uit ST Visual Desktop) te laten knipperen, hoeft u slechts twee adressen te wijzigen:

#define DDR_B 0x5007
#define OUT_B 0x5005

Ja, ik maak gebruik van de eigenschap van de LED-aansluiting op het specifieke bord; het zal heel langzaam knipperen, maar het zal knipperen!

Wat zijn datasheets

In artikelen en op forums, zowel in het Russisch als in het Engels, wordt met "datasheets" elke technische documentatie voor chips bedoeld; zo doe ik het ook in deze tekst. Formeel zijn ze slechts een van de soorten dergelijke documentatie:

Datasheet – TTX, tactisch-technische specificaties. Moet aanwezig zijn bij elk elektronisch component. Handige referentieinformatie, goed om bij de hand te houden, maar er is niet veel bijzonder te lezen. Maar simpelere chips beperken zich vaak tot de datasheet om onnodige documenten te vermijden; in dat geval Referentiemanual wordt dit hier ook bijgevoegd.

Referentiemanual – de eigenlijke handleiding, een dikke boek met 1000+ pagina's. Beschrijft gedetailleerd de werking van alles wat in de chip is gestopt. Het belangrijkste document voor het leren van de microcontroller. In tegenstelling tot datasheet, worden handleidingen geschreven voor een brede reeks MCs en bevatten ze veel informatie over de peripherie die afwezig is in uw specifieke model.

Programming Manual of Instruction Set Manual – handleiding voor unieke instructies van de microcontroller. Bestemd voor degenen die in Assembly programmeren. De auteurs van compilers gebruiken deze actief voor code-optimalisatie, dus in de meeste gevallen hebben we het niet nodig. Maar het is nuttig om hier een blik op te werpen voor een algemeen begrip, voor enkele specifieke instructies zoals het verlaten van een interrupt, evenals bij actief gebruik van de debugger.

Application Note – nuttige tips voor het oplossen van specifieke problemen, vaak met codevoorbeelden.

Errata Sheet – een beschrijving van gevallen van ongebruikelijk gedrag van de chip met mogelijke oplossingen, indien beschikbaar.

Wat staat er in de datasheets

Direct in Datasheet hebben we mogelijk de volgende secties nodig:

Device Summary – de eerste pagina van de datasheet vertelt kort over het apparaat. Zeer nuttig in situaties waarin u ergens een chip vindt (gezien in een winkel, eruit gesoldeerd, een vermelding tegenkomt) en wilt begrijpen wat het is.

General Description – meer gedetailleerde beschrijving van de mogelijkheden van de chips uit de serie.

Pinouts – pin-schema's voor alle mogelijke behuizingen van de chip (op welke pin welke aansluiting).

Pinbeschrijving – beschrijving van de functie en mogelijkheden van elke pin.

Geheugenkaart – een adreskaart in het geheugen is waarschijnlijk niet nodig, maar soms bevat deze ook de tabel met adressen van registerblokken.

Registerkaart – de tabel met adressen van registerblokken staat meestal in het datasheet, en in Referentiemanual – alleen verschuivingen (adresverschuivingen).

Elektrische specificaties – in dit gedeelte zijn we vooral geïnteresseerd in absolute maximum ratings, waarin de maximale belastingen voor de chip worden opgesomd. In tegenstelling tot de onverwoestbare Atmega328p, staat de meeste microcontrollers niet toe om zware belastingen op de pinnen aan te sluiten, wat een onaangename verrassing kan zijn voor Arduino-gebruikers.

Package-informatie – tekeningen van beschikbare behuizingen, nuttig bij het ontwerpen van eigen printplaten.

Referentiemanual is doorgaans opgebouwd uit secties die aan specifieke periferie zijn gewijd, zoals in de titel staat aangegeven. Elke hoofdstuk kan ruwweg in drie delen worden verdeeld:

Overzicht, Inleiding, Functies – overzicht van de mogelijkheden van de periferie;

Functionele beschrijving, Gebruikershandleiding of simpelweg de hoofdsectie – een gedetailleerde tekstuele beschrijving van de werking van de periferie en de manieren van gebruik;

Registers – beschrijving van de controle registers. In eenvoudige gevallen zoals GPIO of SPI kan dit genoeg zijn om met de periferie aan de slag te gaan, maar vaak moet je toch de voorgaande delen lezen.

Hoe datasheets te lezen

Datasheets kunnen je in het begin afschrikken door hun omvang en overvloed aan onbekende woorden. In werkelijkheid is het echter niet zo eng, als je een paar handige tips kent.

Installeer een goede PDF-lezer. Datasheets worden in de fijne tradities van papieren instructies geschreven, ze zijn geweldig om af te drukken, met plastic bladwijzers te markeren en in te binden. Hypertext komt in zeer kleine hoeveelheden voor. Gelukkig, tenminste de structuur van het document heeft bladwijzers, dus een goede lezer met handige navigatie is erg nuttig.

Een datasheet is geen boek van Stroustrup, je hoeft niet alles van begin tot eind te lezen. Als je de vorige tip hebt opgevolgd – zoek gewoon het juiste gedeelte in de bladwijzerpanelen.

Datasheets, vooral Referentiemanuals, kunnen de mogelijkheden van niet een specifieke chip beschrijven, maar van een hele serieDat betekent dat de helft, of zelfs twee derde, van de informatie niet gerelateerd is aan uw chip. Voordat u de TIM7-registers bestudeert, controleer of General Descriptionu deze heeft.

Weten Engels is voldoende op basisniveau.Datasheets bestaan voor de helft uit termen die onbekend zijn voor een gemiddelde spreker, en voor de andere helft uit eenvoudige verbindingsconstructies. Er zijn ook uitstekende Chinese datasheets in Chinglish, waar de helft ook uit termen bestaat en de andere helft uit een willekeurige verzameling woorden.

Als je een onbekend woordtegenkomt, probeer het dan niet te vertalen met een Engels-Russisch woordenboek. Als het je in de war brengt hysteresis, dan wordt je niet warmer van de vertaling 'hysterese'. Gebruik Google, Stack Overflow, Wikipedia, forums, waar het benodigde concept in eenvoudige woorden met voorbeelden wordt uitgelegd..

De beste manier om te begrijpen wat je leest, is het in de praktijk te controleren.Houd daarom een ontwikkelbord bij de hand waarmee je vertrouwd raakt, of nog beter, twee - voor het geval je iets niet goed begreep en de magische rook zag.

Het is nuttig om een datasheet bij de hand te houden wanneer je iemand zijn tutorial leest of een externe bibliotheek bestudeert. Het is heel goed mogelijk dat je er een betere oplossing voor je probleem vindt. En omgekeerd - als je in de datasheet niet kunt begrijpen hoe het register werkt, zoek het dan op: waarschijnlijk heeft iemand het al in eenvoudige woorden beschreven of begrijpelijke code op GitHub achtergelaten.

Woordenlijst

Een paar nuttige woorden en termen die helpen om sneller aan datasheets te wennen. Wat ik de afgelopen paar dagen heb bedacht, aanvullingen en correcties zijn welkom.

Elektriciteit
Vcc, Vdd – 'plus', voeding.
Vss, Vee – 'min', aarde.
current – stroom.
voltage – spanning.
to sink current – werken als 'aarde' voor een externe belasting.
to source current – een externe belasting van stroom voorzien.
high sink/source pin – pin met hogere 'tolerantie' voor belasting.

IO
H, High – op pin Vcc.
L, Low – op pin Vss.
High Impedance, Hi-Z, floating – op de pin is niets, 'hoge weerstand', hij is feitelijk onzichtbaar voor de externe wereld.
weak pull up, weak pull down – ingebouwde pull-up/pull-down weerstand, ongeveer gelijk aan 50 kΩ (zie datasheet). Wordt gebruikt om ervoor te zorgen dat de ingangspinnen niet in de lucht zweven, wat valse triggers kan veroorzaken. Weak – omdat hij gemakkelijk te 'overschrijden' is.
push pull – uitgangsmodus van de pin, waarin hij schakelt tussen High en Laag – gewone OUTPUT met Arduino.
open drain – aanduiding van de uitgangsmodus waarin de pin ofwel Laag, ofwel Hoge Impedantie / Drijvend. Dit is bijna altijd geen «echte» open drain, er zijn beschermdiodes, weerstanden, enzovoorts. Het is gewoon een aanduiding van de modus aarde / niets.
echte open drain – en dit is al een echte open drain: de pin leidt rechtstreeks naar de aarde als deze open is, of is in een zwevende toestand als deze gesloten is. Dit betekent dat je indien nodig een spanning groter dan Vcc kunt toepassen, maar de maximale waarde wordt nog steeds vastgelegd in de datasheet in de sectie Absolute Maximum Ratings / Voltage.

Interfaces
in serie – in serie verbonden
om chips in een keten te plaatsen door sequentieel te verbinden, waardoor het aantal uitgangen toeneemt. – verschuiving, meestal aangeduid als bitverschuiving. Bijgevolg,
verschuiven om in te verschuiven om uit te verschuiven en – gegevens bit voor bit ontvangen en verzenden. – klep die de buffer bedekt terwijl de bits worden verschoven. Wanneer de overdracht voltooid is, opent de klep, en de bits beginnen te functioneren.
sluiting om in te klokken
– voer bit voor bit overdracht uit, verschuif alle bits naar de juiste posities. dubbele buffer
schaduwregister, vooraf laadregister, – aanduidingen van de situatie waarin het register nieuwe gegevens moet kunnen ontvangen, maar deze moet vasthouden tot een bepaald moment. Bijvoorbeeld, om PWM correct te laten werken, mogen de parameters (dutycycle, frequentie) niet veranderen totdat de huidige cyclus is voltooid, maar nieuwe parameters kunnen al worden overgedragen. Bijgevolg worden de huidige in , en de nieuwe belanden in vooraf laadregister, terwijl ze in het overeenkomstige register van de chip worden geschreven. – aanduidingen van de situatie waarin het register nieuwe gegevens moet kunnen ontvangen, maar deze moet vasthouden tot een bepaald moment. Bijvoorbeeld, om PWM correct te laten werken, mogen de parameters (dutycycle, frequentie) niet veranderen totdat de huidige cyclus is voltooid, maar nieuwe parameters kunnen al worden overgedragen. Bijgevolg worden de huidige inVan alles

prescaler
– frequentievoorverdeling om een bit in te stellen
– zet het bit op 1 om een bit te wissen / resetten
– zet het bit op 0 ( reset– functie van de STM datasheets) Wat daarna

Hier was eigenlijk een praktische sectie gepland met demonstratie van drie projecten op STM32 en STM8, speciaal voor dit artikel gemaakt met behulp van datasheets, met lampen, SPI, timers, PWM en interrupts:

Maar de tekst wordt behoorlijk veel, daarom worden de projecten naar het tweede deel verplaatst.

Hoe en waarom datasheets te lezen als microcontrollers jouw hobby zijn

De vaardigheid om datasheets te lezen zal je helpen met je hobby, maar zal waarschijnlijk niet het persoonlijke contact met collega's op forums en in chats vervangen. Voor dit moet je toch in de eerste plaats je Engelse taalvaardigheden verbeteren. En daarom, voor degenen die alles hebben gelezen – een speciale prijs: twee gratis lessen bij Skyeng bij de eerste betaling met de code

HABR2 Uitgave van versie 1.12.0 van het versiebeheersysteem Apache Subversion.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster