Hoe en hoekom om datablaaie te lees as mikrobeheerders jou stokperdjie is

Hoe en hoekom om datablaaie te lees as mikrobeheerders jou stokperdjie is

Mikro-elektronika is die afgelope jare 'n modieuse stokperdjie danksy die magiese Arduino. Maar hier is die probleem: met genoeg belangstelling kan jy DigitalWrite() vinnig ontgroei, maar wat om volgende te doen is nie heeltemal duidelik nie. Arduino-ontwikkelaars het baie moeite gedoen om die versperring vir toegang tot hul ekosisteem te verlaag, maar daarbuite is daar steeds 'n donker woud van harde stroombane wat ontoeganklik is vir die amateur.

Byvoorbeeld, datablaaie. Dit lyk of hulle alles het, neem dit en gebruik dit. Maar hulle skrywers stel hulle duidelik nie die taak om mikrobeheerders te populariseer nie; Soms dit blykdat hulle doelbewus onverstaanbare terme en afkortings misbruik wanneer hulle eenvoudige dinge beskryf om die oningewydes soveel as moontlik te verwar. Maar nie alles is so erg nie; as jy wil, gaan die kis oop.

In hierdie artikel sal ek die ervaring deel van 'n geesteswetenskaplike spesialis wat met datablaaie vir stokperdjiedoeleindes kommunikeer. Die teks is bedoel vir amateurs wat uit Arduino-broeke grootgeword het; dit veronderstel 'n mate van begrip van die beginsels van werking van mikrobeheerders.

Ek begin met die tradisionele

Flikker 'n LED op Arduino

En dadelik die kode:

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

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

"Wat is hierdie? – ’n Gesofistikeerde leser sal vra. – Hoekom skryf jy iets aan die PINB-invoerregister? Dis net vir lees!” Regtig, Arduino dokumentasie, soos die meeste opvoedkundige artikels op die internet, verklaar dat hierdie register leesalleen is. Ek het self so gedink totdat ek dit weer gelees het datablad aan Atmega328p, besig om hierdie artikel voor te berei. En daar:

Hoe en hoekom om datablaaie te lees as mikrobeheerders jou stokperdjie is

Dit is 'n relatief nuwe funksionaliteit, dit was nie op Atmega8 nie, nie almal weet daarvan nie of word nie genoem om redes van terugwaartse versoenbaarheid nie. Maar dit is baie geskik om die idee te demonstreer dat datablaaie die moeite werd is om te lees om al die vermoëns van die skyfie te gebruik, insluitend min bekendes. En dit is nie die enigste rede nie.

Hoekom anders datablaaie lees?

Gewoonlik begin Arduino-ingenieurs, wat genoeg met LED's en AnalogWrites gespeel het, allerhande modules en skyfies aan die bord koppel, waarvoor daar reeds geskrewe biblioteke is. Vroeër of later verskyn 'n biblioteek wat nie werk soos dit moet nie. Dan begin die amateur daaraan pluk om dit reg te maak, en dan...

En iets heeltemal onverstaanbaars gebeur daar, so jy moet na Google gaan, talle tutoriale lees, dele van iemand se geskikte kode uithaal en uiteindelik jou doelwit bereik. Dit gee 'n kragtige gevoel van prestasie, maar in werklikheid is die proses soos om die wiel weer uit te vind deur 'n motorfiets te reverse engineering. Boonop neem die begrip van hoe hierdie fiets werk nie toe nie. Ek weet, want ek het dit self vir 'n lang tyd gedoen.

As ek in plaas van hierdie opwindende aktiwiteit 'n paar dae spandeer het om die Atmega328-dokumentasie te bestudeer, sou ek 'n groot hoeveelheid tyd gespaar het. Dit is immers 'n redelik eenvoudige mikrobeheerder.

U moet dus datablaaie ten minste lees om te dink hoe die mikrobeheerder oor die algemeen werk en wat dit kan doen. En verder:

  • om ander mense se biblioteke na te gaan en te optimaliseer. Hulle word dikwels geskryf deur dieselfde amateurs wat die wiel herontdek; of, inteendeel, die skrywers maak hulle doelbewus buitensporig onfeilbaar. Laat dit drie keer groter en stadiger wees, maar dit sal beslis werk;

  • om skyfies te kan gebruik in 'n projek waarvoor niemand 'n biblioteek geskryf het nie;

  • om dit vir jouself makliker te maak om van een MK-lyn na 'n ander te migreer;

  • om uiteindelik jou ou kode, wat nie by Arduino gepas het nie, te optimaliseer;

  • om te leer hoe om enige skyfie direk deur sy registers te beheer, sonder om die struktuur van sy biblioteke te bestudeer, indien enige.

Hoekom skryf direk aan registers as daar HAL en LL is?

Woordeskat
HAL, Hoë Abstraksielaag – 'n biblioteek vir die beheer van 'n mikrobeheerder met 'n hoë vlak van abstraksie. As jy die SPI1-koppelvlak moet gebruik, konfigureer en aktiveer jy SPI1 eenvoudig sonder om te dink oor watter registers waarvoor verantwoordelik is.
LL, Laevlak API – 'n biblioteek wat makro's of strukture met registeradresse bevat, wat jou in staat stel om toegang daartoe te verkry op naam. DDRx, PORTx, PINx op Atmega is LL.

Dispute oor die onderwerp “HAL, LL of registers” kom gereeld voor in kommentaar op Habré. Sonder om toegang tot astrale kennis op te eis, sal ek bloot my amateur-ervaring en gedagtes deel.

Nadat ek Atmega min of meer uitgepluis het en artikels gelees het oor die wonderlikheid van STM32, het ek 'n halfdosyn verskillende borde gekoop - Discovery, en Blue Pills, en selfs net skyfies vir my tuisgemaakte produkte. Hulle het almal twee jaar lank stof in 'n boks versamel. Soms het ek vir myself gesê: "dit is dit, van hierdie naweek af bemeester ek STM," het CubeMX geloods, 'n opstelling vir SPI gegenereer, na die gevolglike muur van teks gekyk, mildelik gegeur met STM kopiereg, en besluit dat dit op een of ander manier ook is veel.

Hoe en hoekom om datablaaie te lees as mikrobeheerders jou stokperdjie is

Natuurlik kan jy uitvind wat CubeMX hier geskryf het. Maar terselfdertyd is dit duidelik dat dit onrealisties is om al die bewoording te onthou en dit dan met die hand te skryf. En om dit te ontfout, as ek per ongeluk vergeet om 'n blokkie in die Kubus te merk, is dit heeltemal in orde.

Twee jaar is verby, ek lek nog steeds my lippe af ST MCU Finder vir allerhande lekker, maar bo my begrip, skyfies, en per ongeluk afgekom wonderlike artikel, alhoewel oor STM8. EN skielik Ek het besef dat ek al die tyd aan 'n oop deur geklop het: die registers van die STM is op dieselfde manier gerangskik as dié van enige ander MK, en die Kubus is nie nodig om daarmee te werk nie. Was dit selfs moontlik?..

HAL en spesifiek STM32CubeMX is 'n hulpmiddel vir professionele ingenieurs wat nou saamwerk met STM32-skyfies. Die belangrikste kenmerk is 'n hoë vlak van abstraksie, die vermoë om vinnig van een MCU na 'n ander en selfs van een kern na 'n ander te migreer, terwyl dit binne die STM32-lyn bly. Stokperdjies ondervind selde sulke probleme - ons keuse van mikrobeheerders is as 'n reël beperk tot die AliExpress-assortiment, en ons migreer dikwels tussen radikaal verskillende skyfies - ons beweeg van Atmega na STM, van STM na ESP, of watter nuwe ding ook al ons Chinese vriende gooi na ons. HAL sal nie hier help nie, en om dit te bestudeer sal baie tyd opvreet.

LL bly oor - maar van dit na die registers is daar 'n halwe tree. Persoonlik vind ek dit nuttig om my makro's met registeradresse te skryf: ek bestudeer die datablad noukeuriger, ek dink aan wat ek in die toekoms sal nodig hê en wat ek beslis nie sal hê nie, ek struktureer my programme beter, en oor die algemeen help oorkoms om te memoriseer .

Daarbenewens is daar 'n nuanse met die gewilde STM32F103 - daar is twee onversoenbare LL-weergawes daarvoor, een amptenaar van STM, die tweede van Leaf Labs, wat in die STM32duino-projek gebruik word. As jy 'n oopbron-biblioteek skryf (en ek het presies so 'n taak), moet jy óf twee weergawes maak, óf direk toegang tot die registers kry.

Ten slotte, die uitskakeling van LL, na my mening, vergemaklik migrasie, veral as jy van die begin van die projek af beplan. Oordrewe voorbeeld: kom ons skryf Arduino blink in Atmel Studio sonder 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 hierdie kode die LED op 'n Chinese bord met STM8 (van ST Visual Desktop) te laat flikker, is dit genoeg om twee adresse daarin te verander:

#define DDR_B 0x5007
#define OUT_B 0x5005

Ja, ek gebruik 'n kenmerk om die LED op 'n spesifieke bord te koppel, dit sal baie stadig flikker, maar dit sal gebeur!

Watter tipes datablaaie is daar?

In artikels en op forums, beide Russies en Engels, beteken "datablaaie" enige tegniese dokumentasie vir skyfies, en ek doen dieselfde in hierdie teks. Formeel is dit net een tipe van sulke dokumentasie:

Heet – Prestasie-eienskappe, taktiese en tegniese eienskappe. Verpligtend vir enige elektroniese komponent. Agtergrondinligting is nuttig om byderhand te hou, maar daar is nie veel om nadenkend daarin te lees nie. Eenvoudiger skyfies word egter dikwels beperk tot 'n datablad om nie onnodige dokumente te produseer nie; in hierdie geval Verwysingshandleiding is hier ingesluit.

Verwysingshandleiding – die instruksies self, 'n gesonde boek van 1000+ bladsye. Die werk van alles wat in die skyfie geprop is, word in detail beskryf. Die hoofdokument vir die bemeestering van die mikrobeheerder. Anders as datablad, word instruksies vir 'n wye reeks MK's geskryf; dit bevat baie inligting oor randapparatuur wat nie in jou spesifieke model beskikbaar is nie.

Programmeringshandleiding of Instruksieset Handleiding - instruksies vir unieke mikrobeheerder opdragte. Ontwerp vir diegene wat in Assembly-taal programmeer. Samesteller-outeurs gebruik dit aktief om kode te optimaliseer, so in die algemene geval sal ons dit nie nodig hê nie. Maar om hier te kyk, is nuttig vir 'n algemene begrip, vir 'n paar spesifieke opdragte soos om 'n onderbreking te verlaat, sowel as om die ontfouter aktief te gebruik.

Aansoeknotas – nuttige wenke om spesifieke probleme op te los, dikwels met kodevoorbeelde.

Errata-blad – beskrywing van gevalle van nie-standaard skyfiegedrag met oplossingsopsies, indien enige.

Wat is in die datablaaie

Direk aan Heet ons mag dalk die volgende afdelings benodig:

Toestelopsomming – die eerste bladsy van die datablad beskryf die toestel kortliks. Baie nuttig in situasies wanneer jy 'n skyfie iewers gevind het (dit in 'n winkel gesien, gesoldeer, 'n melding gekry) en wil verstaan ​​wat dit is.

Algemene beskrywing – 'n meer gedetailleerde beskrywing van die vermoëns van die skyfies vanaf die lyn.

Uitkykpunte – uitsteekdiagramme vir alle moontlike skyfiepakkette (watter pen op watter been is).

Speldbeskrywing – beskrywing van die doel en vermoëns van elke pen.

Geheuekaart – ons sal waarskynlik nie 'n adreskaart in die geheue benodig nie, maar soms sluit dit ook 'n tabel van registerblokadresse in.

Registreer Kaart – die tabel met adresse van registerblokke is as 'n reël in die datablad geleë, en in Verwys Handleiding – slegs skofte (adres afwykings).

Elektriese eienskappe – in hierdie afdeling stel ons hoofsaaklik belang Absolute Maksimum Graderings, met 'n lys van die maksimum vragte per skyfie. Anders as die onvernietigbare Atmega328p, laat die meeste MK's jou nie toe om ernstige vragte aan die penne te koppel nie, wat 'n onaangename verrassing vir Arduiniste word.

Pakketinligting - tekeninge van beskikbare gevalle, nuttig wanneer u u planke ontwerp.

Verwysingshandleiding struktureel bestaan ​​uit afdelings gewy aan spesifieke randapparatuur wat in hul titel aangedui word. Elke hoofstuk kan in drie dele verdeel word:

Oorsig, Inleiding, Kenmerke – oorsig van perifere vermoëns;

Funksionele beskrywing, Gebruiksgids of bloot die hoofblok van die afdeling - 'n gedetailleerde teksbeskrywing van die beginsels van die perifere toestel en hoe om dit te gebruik;

registers – beskrywing van kontroleregisters. In eenvoudige gevalle soos GPIO of SPI is dit dalk genoeg om die randapparatuur te begin gebruik, maar dikwels moet jy nog die vorige dele lees.

Hoe om datablaaie te lees

Gegewensblaaie maak jou uit gewoonte bang met hul volume en oorvloed van onverstaanbare woorde. Om die waarheid te sê, alles is nie so scary as jy 'n paar life hacks ken nie.

Installeer goeie PDF-leser. Datablaaie is geskryf in die glorieryke tradisie van papierinstruksies; dit is wonderlik om uit te druk, met plastiekboekmerke in te voeg en naaldwerk. Hiperteks in hulle word in spoorhoeveelhede waargeneem. Gelukkig is die struktuur van die dokument ten minste met boekmerke ontwerp, so 'n geskikte leser met maklike navigasie is baie nodig.

Die datablad is nie Stroustrup se handboek nie; dit bevat nie nodig om alles te lees nie. As jy die vorige advies gebruik het, vind net die gewenste afdeling in die boekmerkbalk.

Gegewensblaaie, veral Verwysingshandleidings, kan beskryf die vermoëns van nie 'n spesifieke chip, maar die hele lyn. Dit beteken dat die helfte, of selfs twee derdes van die inligting nie relevant is vir jou skyfie nie. Meld aan voordat u TIM7-registers bestudeer Algemene beskrywing, het jy dit?

Om te weet Engels genoeg vir basiese vlak. Datablaaie bestaan ​​die helfte uit terme wat onbekend is vir die gemiddelde moedertaalspreker, en die helfte uit eenvoudige verbindingstrukture. Daar is ook uitstekende Chinese datablaaie in Chinese Engels, waar die helfte ook terme is, en die tweede helfte 'n ewekansige stel woorde.

As jy ontmoet onbekende woord, moenie probeer om dit te vertaal deur 'n Engels-Russiese woordeboek te gebruik nie. As jy deurmekaar is histerese, dan sal die vertaling “histerese” jou nie warmer maak nie. Gebruik Google, Stack Overflow, Wikipedia, forums, waar die vereiste konsep sal wees verduidelik in eenvoudige woorde met voorbeelde.

Die beste manier om te verstaan ​​wat jy lees, is tjek in aksie. Hou dus die ontfoutingsbord byderhand waarmee jy jouself vertroud maak, of beter nog twee, ingeval jy iets steeds verkeerd verstaan ​​het en 'n towerrook gesien het.

Dit is 'n goeie gewoonte om jou datablad byderhand te hou wanneer jy lees iemand se tutoriaal of iemand anders se biblioteek bestudeer. Dit is heel moontlik dat jy 'n meer optimale oplossing vir jou probleem daarin sal vind. En omgekeerd - as jy nie uit die datablad kan verstaan ​​hoe die register werklik werk nie, google dit: heel waarskynlik het iemand al alles in eenvoudige woorde beskryf of duidelike kode op GitHub gelaat.

Woordeskat

'n Paar nuttige woorde en simbole om jou te help om vinnig gewoond te raak aan datablaaie. Wat ek die afgelope paar dae onthou het, byvoegings en regstellings is welkom.

elektrisiteit
VCC, Waar – “plus”, kos
Vss, Vee – “minus”, aarde
huidige - huidige
spanning - Spanning
stroom te sink – werk as “grond” vir eksterne vrag
stroom te bron - krag eksterne las
hoë wasbak/bronpen – pen met verhoogde “toleransie” om te laai

IO
H, hoog – op die Vcc-pen
L, laag – op die Vss-pen
Hoë impedansie, Hi-Z, drywende – daar is niks op die pen nie, “hoë weerstand”, dit is feitlik onsigbaar vir die buitewêreld.
swak trek op, swak trek af – ingeboude optrek-/aftrekweerstand, ongeveer gelykstaande aan 50 kOhm (sien datablad). Dit word byvoorbeeld gebruik om te verhoed dat die insetpen in die lug hang en vals alarms veroorsaak. Swak - want dit is maklik om hom te “onderbreek”.
stoot trek – pen-uitsetmodus, waarin dit wissel tussen Hoogte и Laagte - gereelde UITSET van Arduino.
oop drein – aanwysing van die uitsetmodus waarin die pen óf kan wees LaagteOf Hoë impedansie/swewende. Boonop is dit byna altyd nie 'n "regte" oop drein nie; daar is beskermende diodes, resistors, en wat nog. Dit is bloot 'n benaming vir grond/geen-modus.
ware oop drein - maar dit is 'n regte oop drein: die pen lei direk na die grond as dit oop is, of bly in limbo as dit toe is. Dit beteken dat, indien nodig, 'n spanning groter as Vcc daardeur gevoer kan word, maar die maksimum word steeds in die datablad in die afdeling gespesifiseer Absolute maksimum graderings/spanning.

koppelvlakke
in reekse – in serie verbind
te ketting – monteer skyfies in 'n ketting deur 'n reeksverbinding te gebruik, wat die aantal uitsette verhoog.
skuif – skuif, dui gewoonlik 'n bietjie skuif aan. Onderskeidelik, in te skuif и uit te skuif – ontvang en versend data bietjie vir bietjie.
grendel – 'n grendel wat die buffer bedek terwyl stukkies daardeur geskuif word. Wanneer die oordrag voltooi is, gaan die klep oop en die stukkies begin werk.
om in te klok – voer 'n bietjie-vir-bietjie oordrag uit, skuif al die stukkies na die regte plekke.
dubbele buffer, skadu register, vooraflaai register – geskiedenisbenamings, wanneer die register nuwe data moet kan aanvaar, maar dit tot op 'n stadium moet hou. Byvoorbeeld, vir PWM om korrek te werk, moet sy parameters (dienssiklus, frekwensie) nie verander totdat die huidige siklus eindig nie, maar nuwe parameters kan reeds oorgedra word. Gevolglik word die huidige gehou by skadu register, en nuwes val in vooraflaai register, word na die ooreenstemmende skyfieregister geskryf.

Allerhande dinge
voorskaaler - frekwensie-voorskaaler
bietjie te stel – stel bietjie op 1
om 'n bietjie skoon te maak/terug te stel – stel bietjie terug na 0 (herstel - STM-databladfunksie)

Wat is volgende?

Oor die algemeen is 'n praktiese deel hier beplan met 'n demonstrasie van drie projekte oor STM32 en STM8, wat spesifiek vir hierdie artikel gemaak is met behulp van datablaaie, met gloeilampe, SPI, timers, PWM en onderbrekings:

Hoe en hoekom om datablaaie te lees as mikrobeheerders jou stokperdjie is

Maar daar is baie teks, so die projekte word na die tweede deel gestuur.

Die vaardigheid om datablaaie te lees sal jou help met jou stokperdjie, maar dit is onwaarskynlik dat dit regstreekse kommunikasie met mede-stokperdjies op forums en kletse sal vervang. Vir hierdie doel moet jy nog eerstens jou Engels verbeter. Daarom sal diegene wat klaar gelees het 'n spesiale prys ontvang: twee gratis lesse in Skyeng met die eerste betaling met die kode HABR2.

Bron: will.com

Voeg 'n opmerking