Hoe en wêrom gegevensblêden te lêzen as mikrocontrollers jo hobby binne

Hoe en wêrom gegevensblêden te lêzen as mikrocontrollers jo hobby binne

Microelectronics is in modieuze hobby yn de lêste jierren tank oan de magyske Arduino. Mar hjir is it probleem: mei genôch belangstelling, kinne jo fluch útgroeie DigitalWrite (), mar wat te dwaan neist is net hielendal dúdlik. Arduino-ûntwikkelders hawwe in protte muoite dien om de barriêre te ferleegjen foar yngong yn har ekosysteem, mar bûten it is d'r noch in tsjustere bosk fan hurde circuits dy't net tagonklik is foar de amateur.

Bygelyks, datasheets. It liket derop dat se alles hawwe, nim it en brûk it. Mar harren skriuwers dúdlik net sette harsels de taak fan popularizing microcontrollers; Somtiden it liketdat se mei opsetsin ûnbegryplike termen en ôfkoartings misbrûke by it beskriuwen fan ienfâldige dingen om de ûneinige safolle mooglik yn betizing te bringen. Mar net alles is sa slim; as jo wolle, giet de kiste iepen.

Yn dit artikel sil ik de ûnderfining diele fan in geastesspesjalist dy't kommunisearret mei datablêden foar hobbydoelen. De tekst is bedoeld foar amateurs dy't opgroeid binne út Arduino-broeken; it giet oan wat begryp fan 'e prinsipes fan wurking fan mikrocontrollers.

Ik sil begjinne mei it tradisjonele

Flashing in LED op Arduino

En daliks de koade:

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

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

"Wat is dit? - In ferfine lêzer sil freegje. - Wêrom skriuwe jo wat oan it PINB ynfier register? It is allinich foar lêzen! ” Werklik, Arduino dokumintaasje, lykas de measte edukative artikels op it ynternet, stelt dat dit register allinnich-lêzen is. Dat tocht ik sels oant ik it nochris lies datasheet to Atmega328p, it tarieden fan dit artikel. En dêr:

Hoe en wêrom gegevensblêden te lêzen as mikrocontrollers jo hobby binne

Dit is in relatyf nije funksjonaliteit, it wie net op Atmega8, net elkenien wit it of wurdt net neamd om redenen fan efterkompatibiliteit. Mar it is hiel geskikt foar it demonstrearjen fan it idee dat gegevensblêden it wurdich binne te lêzen om alle mooglikheden fan 'e chip te brûken, ynklusyf lytsbekenden. En dit is net de ienige reden.

Wêrom oars gegevensblêden lêze?

Meastentiids begjinne Arduino-yngenieurs, nei't se genôch spile hawwe mei LED's en AnalogWrites, om allerhanne modules en chips te ferbinen oan it bestjoer, wêrfoar d'r al skreaune biblioteken binne. Ier of let ferskynt der in bibleteek dy't net wurket sa't it moat. Dan begjint de amateur derop te pakken om it te reparearjen, en dan ...

En dêr bart wat folslein ûnbegrypliks, dus jo moatte nei Google gean, in protte tutorials lêze, dielen fan 'e gaadlike koade fan ien útlûke en úteinlik jo doel berikke. Dit jout in krêftich gefoel fan prestaasjes, mar yn werklikheid is it proses as it opnij útfine fan it tsjil troch reverse engineering fan in motorfyts. Boppedat nimt it begryp fan hoe't dizze fyts wurket net ta. Ik wit it, om't ik dit sels in lange tiid dien haw.

As ik ynstee fan dizze spannende aktiviteit in pear dagen hie bestege oan it bestudearjen fan de Atmega328-dokumintaasje, soe ik in protte tiid hawwe besparre. Ommers, dit is in frij ienfâldige mikrocontroller.

Sa moatte jo op syn minst gegevensblêden lêze om jo foar te stellen hoe't de mikrocontroller oer it algemien wurket en wat it kin dwaan. En fierder:

  • om de biblioteken fan oaren te kontrolearjen en te optimalisearjen. Se wurde faak skreaun troch deselde amateurs dy't it tsjil opnij útfine; of, krekt oarsom, de skriuwers meitsje se mei opsetsin al te foolproof. Lit it wêze trije kear grutter en stadiger, mar it sil grif wurkje;

  • om chips brûke te kinnen yn in projekt dêr't gjinien in bibleteek foar skreaun hat;

  • om it makliker foar josels te meitsjen fan de iene MK-line nei de oare te migrearjen;

  • om úteinlik jo âlde koade te optimalisearjen, dy't net yn Arduino paste;

  • om te learen hoe't jo elke chip direkt kinne kontrolearje fia har registers, sûnder lestich te meitsjen mei it bestudearjen fan de struktuer fan syn bibleteken, as der ien is.

Wêrom skriuwe nei registers direkt as der HAL en LL is?

Wurdboek
HAL, hege abstraksjelaach - in bibleteek foar it kontrolearjen fan in mikrocontroller mei in heech nivo fan abstraksje. As jo ​​de SPI1-ynterface moatte brûke, kinne jo SPI1 gewoan ynstelle en ynskeakelje sûnder te tinken oer hokker registers ferantwurdlik binne foar wat.
LL, Low Level API - in bibleteek mei makro's as struktueren mei registeradressen, wêrtroch jo tagong krije kinne mei namme. DDRx, PORTx, PINx op Atmega binne LL.

Diskusjes oer it ûnderwerp "HAL, LL of registers" komme geregeld foar yn opmerkings op Habré. Sûnder tagong ta astrale kennis te claimen, sil ik myn amateurûnderfining en tinzen gewoan diele.

Ik haw Atmega min of mear útfûn en artikels lêzen oer de wûnderens fan STM32, kocht ik in heale tsiental ferskillende boerden - Discovery, en Blue Pills, en sels gewoan chips foar myn selsmakke produkten. Se sammele twa jier lang stof yn in doaze. Soms sei ik tsjin mysels: "dat is it, begjin dit wykein behearskje ik STM," lansearre CubeMX, generearre in opset foar SPI, seach nei de resultearjende muorre fan tekst, royaal op smaak mei STM-auteursrjochten, en besleat dat dit ek op ien of oare manier wie folle.

Hoe en wêrom gegevensblêden te lêzen as mikrocontrollers jo hobby binne

Fansels kinne jo útfine wat CubeMX hjir skreau. Mar tagelyk is it dúdlik dat it ûnthâlden fan alle formulearringen en dan mei de hân skriuwe ûnrealistysk is. En om dit te debuggen, as ik per ongelok ferjit in fakje yn 'e kubus te kontrolearjen, is dat hielendal goed.

Twa jier binne ferrûn, ik slikje noch oan myn lippen ST MCU Finder foar alle soarten fan lekker, mar boppe myn ferstân, chips, en by ûngelok kaam oer prachtich artikel, hoewol oer STM8. EN ynienen Ik realisearre dat ik al dy tiid op in iepen doar kloppe: de registers fan 'e STM binne op deselde manier ynrjochte as dy fan elke oare MK, en de Cube is net nedich om mei har te wurkjen. Wie it sels mooglik?..

HAL en spesifyk STM32CubeMX is in helpmiddel foar profesjonele yngenieurs dy't wurkje nau gear mei STM32 chips. De haadfunksje is in heech nivo fan abstraksje, de mooglikheid om fluch te migrearjen fan de iene MCU nei de oare en sels fan de iene kearn nei de oare, wylst se binnen de STM32-line bliuwe. Hobbyisten komme selden tsjin sokke problemen - ús kar fan mikrocontrollers, yn 'e regel, is beheind ta it AliExpress-assortiment, en wy migrearje faak tusken radikale ferskillende chips - wy ferhúzje fan Atmega nei STM, fan STM nei ESP, of wat nij ding ús Sineeske freonen smyt op ús. HAL sil hjir net helpe, en it studearjen sil in protte tiid ite.

LL bliuwt - mar fan it nei de registers is der in heale stap. Persoanlik fyn ik it skriuwen fan myn makro's mei registeradressen nuttich: ik studearje it gegevensblêd foarsichtiger, ik tink oer wat ik yn 'e takomst nedich sil en wat ik perfoarst net sil, ik strukturearje myn programma's better, en yn't algemien helpt oerwinning te ûnthâlden .

Derneist is d'r in nuânse mei de populêre STM32F103 - d'r binne twa ynkompatibele LL-ferzjes foar, ien amtner fan STM, de twadde fan Leaf Labs, brûkt yn it STM32duino-projekt. As jo ​​​​in iepen boarne biblioteek skriuwe (en ik hie krekt sa'n taak), moatte jo twa ferzjes meitsje, of direkt tagong krije ta de registers.

Ta beslút, elimineren LL, yn myn miening, simplifies migraasje, benammen as jo plannen op it fan it begjin fan it projekt. Oerdreaun foarbyld: lit ús Arduino blink skriuwe yn Atmel Studio sûnder 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 dizze koade de LED op in Sineesk boerd mei STM8 te knipperen (fan ST Visual Desktop), is it genôch om twa adressen yn te feroarjen:

#define DDR_B 0x5007
#define OUT_B 0x5005

Ja, ik brûk in funksje fan it ferbinen fan de LED op in spesifyk boerd, it sil tige stadich knipperje, mar it sil barre!

Hokker soarten gegevensblêden binne d'r?

Yn artikels en op foarums, sawol Russysk en Ingelsk, betsjut "datasheets" alle technyske dokumintaasje foar chips, en ik doch itselde yn dizze tekst. Formeel binne se mar ien soarte fan sokke dokumintaasje:

Datasheet - Prestaasjekarakteristiken, taktyske en technyske skaaimerken. Ferplicht foar elke elektroanyske komponint. Eftergrûnynformaasje is nuttich om by de hân te hâlden, mar d'r is net folle yn te lêzen. Lykwols, ienfâldiger chips wurde faak beheind ta in datasheet om net te produsearje ûnnedige dokuminten; yn dit gefal Referinsje hânboek is hjir opnommen.

Referinsje hânboek - de ynstruksjes sels, in sûn boek fan 1000+ siden. It wurk fan alles dat yn 'e chip is stutsen wurdt yn detail beskreaun. It haaddokumint foar it behearjen fan de mikrocontroller. Oars as datasheet, ynstruksjes binne skreaun foar in breed oanbod fan MK's; se befetsje in soad ynformaasje oer perifeare apparaten dy't net beskikber binne yn jo spesifike model.

Programmearingshanneling of Instruction Set Manual - ynstruksjes foar unike kommando's fan mikrocontroller. Ûntwurpen foar dyjingen dy't programma yn Assembly taal. Compiler-auteurs brûke it aktyf om koade te optimalisearjen, dus yn 't algemien sille wy it net nedich hawwe. Mar sjoch hjir is nuttich foar in algemien begryp, foar guon spesifike kommando's lykas it ôfsluten fan in ûnderbrekking, en ek foar it aktyf brûken fan de debugger.

Oanfraachnota - nuttige tips foar it oplossen fan spesifike problemen, faak mei koadefoarbylden.

Errata Sheet - beskriuwing fan gefallen fan net-standert chipgedrach mei oplossingsopsjes, as der binne.

Wat stiet yn de datasheets

Direkt nei Datasheet wy kinne de folgjende seksjes nedich wêze:

Apparaat Gearfetting - de earste side fan it gegevensblêd beskriuwt it apparaat koart. Hiel brûkber yn situaasjes as jo earne in chip fûn (seagen it yn in winkel, soldered it, kaam oer in fermelding) en wolle begripe wat it is.

Algemiene beskriuwing – in mear detaillearre beskriuwing fan de mooglikheden fan de chips út de line.

Pinouts - pinout diagrammen foar alle mooglike chip pakketten (hokker pin is op hokker skonk).

Pin Beskriuwing - beskriuwing fan it doel en mooglikheden fan elke pin.

Unthâld Map - wy binne nei alle gedachten net nedich in adres map yn it ûnthâld, mar soms befettet it ek in tabel fan register blok adressen.

Registrearje Map - de tabel mei adressen fan register blokken, as regel, leit yn it datablêd, en yn Ref Manual - allinich ferskowings (adres offsets).

Electrical Characteristics - yn dizze paragraaf binne wy ​​benammen ynteressearre yn absolute maksimum wurdearrings, list de maksimale loads per chip. Oars as de ûnferwoastbere Atmega328p, de measte MKs net tastean jo te ferbinen serieuze loads oan de pinnen, dat wurdt in onaangename ferrassing foar Arduinists.

Pakketynformaasje - tekeningen fan beskikbere gefallen, nuttich by it ûntwerpen fan jo boerden.

Referinsje hânboek bestiet struktureel út seksjes wijd oan spesifike perifeare apparaten oanjûn yn har titel. Elk haadstik kin wurde ferdield yn trije dielen:

Oersicht, Ynlieding, Features - oersjoch fan perifeare mooglikheden;

Funksjonele beskriuwing, Brûkersgids of gewoan it haadblok fan 'e seksje - in detaillearre tekstbeskriuwing fan' e prinsipes fan 'e perifeare apparaat en hoe't jo it brûke;

Register - beskriuwing fan kontrôle registers. Yn ienfâldige gefallen lykas GPIO of SPI kin dit genôch wêze om de perifeare apparaten te brûken, mar faaks moatte jo de foarige dielen noch lêze.

Hoe kinne jo gegevensblêden lêze

Gegevensblêden, út gewoante, meitsje jo bang mei har folume en oerfloed fan ûnbegryplike wurden. Yn feite is alles net sa eng as jo in pear life hacks kenne.

Ynstallearje goede PDF-lêzer. Gegevensblêden binne skreaun yn 'e glorieuze tradysje fan papieren ynstruksjes; se binne geweldich om út te printsjen, yn te setten mei plestik blêdwizers en naaien. Hypertekst yn harren wurdt waarnomd yn spoarminten. Gelokkich is op syn minst de struktuer fan it dokumint ûntwurpen mei blêdwizers, dus in gaadlike lêzer mei maklike navigaasje is tige needsaaklik.

It datablêd is net it learboek fan Stroustrup; it befettet net nedich om alles te lêzen. As jo ​​​​it foarige advys hawwe brûkt, fine jo gewoan de winske seksje yn 'e blêdwizerbalke.

Datasheets, benammen Referinsje hânboeken, kin beskriuwe de mooglikheden fan net in spesifike chip, mar de hiele line. Dit betsjut dat de helte, of sels twatredde fan de ynformaasje is net relevant foar jo chip. Kontrolearje foardat jo TIM7-registers studearje Algemiene beskriuwing, Hasto it?

Witte Ingelsk genôch foar basis nivo. Datasheets besteane de helte út termen dy't ûnbekend binne foar de gemiddelde memmetaalsprekker, en de helte út ienfâldige ferbinende struktueren. D'r binne ek poerbêste Sineeske gegevensblêden yn Sineesk Ingelsk, wêrby't de helte ek termen binne, en de twadde helte in willekeurige set wurden is.

As jo ​​moetsje ûnbekend wurd, besykje it net te oersetten mei in Ingelsk-Russysk wurdboek. As jo ​​binne betize hysterese, dan sil de oersetting "hysteresis" jo net waarmer meitsje. Brûk Google, Stack Overflow, Wikipedia, foarums, wêr't it fereaske konsept sil wêze útlein yn ienfâldige wurden mei foarbylden.

De bêste manier om te begripen wat jo lêze is kontrolearje yn aksje. Hâld dêrom it debugboerd by de hân wêrmei jo josels fertroud meitsje, of better noch twa, foar it gefal dat jo noch wat ferkeard begrepen hawwe en in magyske reek seagen.

It is in goede gewoante om jo gegevensblêd handich te hâlden as jo it lêzen fan immen syn tutorial of studearje in oar syn bibleteek. It is goed mooglik dat jo dêr in mear optimale oplossing foar jo probleem fine. En oarsom - as jo net kinne begripe út it datablêd hoe't it register eins wurket, google it: nei alle gedachten hat immen al alles yn ienfâldige wurden beskreaun of dúdlike koade op GitHub efterlitten.

Wurdboek

Guon nuttige wurden en symboalen om jo te helpen fluch te wennen oan datablêden. Wat ik my de lêste pear dagen herinnerde, tafoegings en korreksjes binne wolkom.

Elektrisiteit
VDC, wier - "plus", iten
Vss, Vee - "minus", ierde
aktueel - aktueel
foltaazje - foltaazje
stroom te sinkjen - wurkje as "grûn" foar eksterne lading
te boarne hjoeddeistige - macht eksterne lading
hege sink / boarne pin - pin mei ferhege "tolerânsje" om te laden

IO
H, Heech - op de Vcc pin
L, leech - op de Vss pin
Hege Impedânsje, Hoi-Z, driuwend - der stiet neat op 'e pin, "hege wjerstân", it is frijwol ûnsichtber foar de bûtenwrâld.
swakke pull up, swakke pull del - ynboude pull-up / pull-down wjerstân, likernôch lykweardich oan 50 kOhm (sjoch datasheet). It wurdt bygelyks brûkt om foar te kommen dat de ynfierpin yn 'e loft bungelt, wêrtroch falske alaarms feroarsaakje. weak - om't it maklik is om him te "ûnderbrekken".
triuwe pull - pinútfiermodus, wêryn it wikselt tusken heech и Leech - reguliere OUTPUT fan Arduino.
iepen drain - oantsjutting fan de útfier modus wêryn de pin kin wêze beide Leech, of Hege impedânsje / driuwend. Boppedat is dit hast altyd gjin "echte" iepen drain; d'r binne beskermjende diodes, wjerstannen, en sa. Dit is gewoan in oantsjutting foar grûn / gjin modus.
wiere iepen drain - mar dit is in echte iepen drain: de pin liedt direkt nei de grûn as it iepen is, of bliuwt yn limbo as it ticht is. Dit betsjut dat, as it nedich is, in spanning grutter dan Vcc kin wurde trochjûn, mar it maksimum wurdt noch oanjûn yn it datablêd yn 'e seksje Absolute maksimale wurdearrings / voltage.

Interfaces
yn searje - ferbûn yn searjes
oan keatling - assemble chips yn in keatling mei help fan in serial ferbining, it fergrutsjen fan it oantal útgongen.
feroarje - ferskowing, meastal jout in bytsje ferskowing. Respektivelik, yn te wikseljen и út te skeakeljen - gegevens bit foar bit ûntfange en ferstjoere.
klink - in klink dy't de buffer beslacht wylst bits der trochhinne wurde ferpleatst. As de oerdracht foltôge is, iepenet it fentyl en begjinne de bits te operearjen.
ynklokje - útfiere in bytsje-by-bit oerdracht, ferskowe alle bits nei de goede plakken.
dûbele buffer, skaad register, preload register - skiednis oantsjuttings, doe't it register moat wêze kinne om te akseptearjen nije gegevens, mar hâld it oant in punt. Bygelyks, foar PWM om goed te wurkjen, moatte har parameters (plichtsyklus, frekwinsje) net feroarje oant de hjoeddeistige syklus einiget, mar nije parameters kinne al oerdroegen wurde. Dêrnjonken wurde de hjoeddeistige bewarre bleaun skaad register, en nije falle yn preload register, wurdt skreaun nei de byhearrende chip register.

Allerhande dingen
prescaler - frekwinsje prescaler
in bytsje te setten - set bit op 1
in bytsje wiskje / weromsette - bit weromsette nei 0 (weromsette - STM-datasheetfunksje)

Wat is hjirnei

Yn 't algemien waard hjir in praktysk diel pland mei in demonstraasje fan trije projekten op STM32 en STM8, spesifyk makke foar dit artikel mei gegevensblêden, mei gloeilampen, SPI, timers, PWM en interrupts:

Hoe en wêrom gegevensblêden te lêzen as mikrocontrollers jo hobby binne

Mar der is in soad tekst, dus de projekten wurde stjoerd nei it twadde diel.

De feardigens fan it lêzen fan gegevensblêden sil jo helpe mei jo hobby, mar it is net wierskynlik om live kommunikaasje te ferfangen mei kollega-hobbyisten op foarums en petearen. Foar dit doel moatte jo earst jo Ingelsk noch ferbetterje. Dêrom krije dejingen dy't lêzen hawwe in spesjale priis: twa fergese lessen yn Skyeng mei de earste betelling mei de koade HABR2.

Boarne: www.habr.com

Add a comment