Cum și de ce să citiți fișele de date dacă microcontrolerele sunt hobby-ul tău

Cum și de ce să citiți fișele de date dacă microcontrolerele sunt hobby-ul tău

Microelectronica este un hobby la modă în ultimii ani datorită magicului Arduino. Dar iată problema: cu suficient interes, puteți depăși rapid DigitalWrite(), dar ce să faceți în continuare nu este complet clar. Dezvoltatorii Arduino au depus mult efort pentru a scădea bariera de intrare în ecosistemul lor, dar în afara acestuia există încă o pădure întunecată de circuite dure care este inaccesibilă amatorilor.

De exemplu, fișele tehnice. Se pare că au totul, ia-l și folosește-l. Dar autorii lor în mod clar nu își pun sarcina de a populariza microcontrolere; Uneori se parecă abuzează în mod deliberat de termeni și abrevieri de neînțeles atunci când descriu lucruri simple pentru a deruta cât mai mult pe neinițiați. Dar nu totul este atât de rău; dacă se dorește, sicriul se deschide.

În acest articol voi împărtăși experiența unui specialist în științe umaniste care comunică cu fișe de date în scopuri de hobby. Textul este destinat amatorilor care au crescut din pantalonii Arduino; presupune o anumită înțelegere a principiilor de funcționare a microcontrolerelor.

Voi începe cu tradiționalul

Aprinde intermitent un LED pe Arduino

Și imediat codul:

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

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

"Ce este asta? – Va întreba un cititor sofisticat. – De ce scrieți ceva în registrul de intrare PINB? Este doar pentru lectură!” Într-adevăr, Documentație Arduino, la fel ca majoritatea articolelor educaționale de pe Internet, afirmă că acest registru este doar pentru citire. Așa am crezut și eu până când am recitit-o fișa cu date la Atmega328p, pregătind acest articol. Și acolo:

Cum și de ce să citiți fișele de date dacă microcontrolerele sunt hobby-ul tău

Aceasta este o funcționalitate relativ nouă, nu era pe Atmega8, nu toată lumea știe despre ea sau nu este menționată din motive de compatibilitate inversă. Dar este destul de potrivit pentru a demonstra ideea că fișele de date merită citite pentru a utiliza toate capacitățile cipului, inclusiv cele puțin cunoscute. Și acesta nu este singurul motiv.

De ce altceva citiți fișele tehnice?

De obicei, inginerii Arduino, după ce s-au jucat suficient cu LED-uri și AnalogWrites, încep să conecteze tot felul de module și cipuri la placă, pentru care există deja biblioteci scrise. Mai devreme sau mai târziu, apare o bibliotecă care nu funcționează așa cum ar trebui. Apoi amatorul începe să se ocupe de el pentru a o repara și apoi...

Și acolo se întâmplă ceva complet de neînțeles, așa că trebuie să mergi la Google, să citești numeroase tutoriale, să scoți părți din codul potrivit cuiva și, în sfârșit, să-ți atingi obiectivul. Acest lucru dă un sentiment puternic de realizare, dar, în realitate, procesul este ca și cum ai reinventa roata prin ingineria inversă a unei motociclete. Mai mult, înțelegerea modului în care funcționează această bicicletă nu crește. Știu, pentru că am făcut asta de mult timp.

Dacă în loc de această activitate interesantă aș fi petrecut câteva zile studiind documentația Atmega328, aș fi economisit o cantitate enormă de timp. La urma urmei, acesta este un microcontroler destul de simplu.

Astfel, trebuie să citiți fișele de date cel puțin pentru a vă imagina cum funcționează în general microcontrolerul și ce poate face. Și mai departe:

  • pentru a verifica și optimiza bibliotecile altor persoane. Sunt adesea scrise de aceiași amatori care reinventează roata; sau, dimpotrivă, autorii le fac în mod deliberat excesiv de sigure. Lasă-l să fie de trei ori mai mare și mai lent, dar cu siguranță va funcționa;

  • pentru a putea folosi cipuri într-un proiect pentru care nimeni nu a scris o bibliotecă;

  • pentru a vă facilita migrarea de la o linie MK la alta;

  • pentru a optimiza în sfârșit vechiul cod, care nu se potrivea în Arduino;

  • să învețe cum să controlezi orice cip direct prin registrele sale, fără a te deranja să studiezi structura bibliotecilor sale, dacă există.

De ce să scrieți direct la registre când există HAL și LL?

glosar
HAL, Strat de abstracție ridicată – o bibliotecă pentru controlul unui microcontroler cu un nivel ridicat de abstractizare. Dacă trebuie să utilizați interfața SPI1, pur și simplu configurați și activați SPI1 fără să vă gândiți la ce registre sunt responsabile pentru ce.
LL, API de nivel scăzut – o bibliotecă care conține macro-uri sau structuri cu adrese de registru, permițându-vă să le accesați după nume. DDRx, PORTx, PINx pe Atmega sunt LL.

Disputele pe tema „HAL, LL sau registre” apar în mod regulat în comentariile despre Habré. Fără a pretinde acces la cunoașterea astrală, voi împărtăși pur și simplu experiența și gândurile mele de amator.

După ce mi-am dat seama mai mult sau mai puțin de Atmega și după ce am citit articole despre minunatia STM32, am cumpărat o jumătate de duzină de plăci diferite - Discovery și Blue Pills și chiar doar chipsuri pentru produsele mele de casă. Toți au adunat praf într-o cutie timp de doi ani. Uneori îmi spuneam: „asta e, începând din acest weekend stăpânesc STM”, am lansat CubeMX, am generat o configurare pentru SPI, m-am uitat la peretele de text rezultat, aromat generos cu drepturile de autor STM și am decis că și asta era cumva. mult.

Cum și de ce să citiți fișele de date dacă microcontrolerele sunt hobby-ul tău

Desigur, vă puteți da seama ce a scris CubeMX aici. Dar, în același timp, este clar că amintirea tuturor cuvintelor și apoi scrierea lor de mână este nerealist. Și pentru a depana acest lucru, dacă am uitat din greșeală să bifez o casetă în Cub, este în regulă.

Au trecut doi ani, încă îmi ling buzele ST MCU Finder pentru tot felul de gustoase, dar dincolo de înțelegerea mea, chips-uri, și accidental am găsit minunat articol, deși despre STM8. ȘI brusc Mi-am dat seama că în tot acest timp băteam la o ușă deschisă: registrele STM-ului sunt aranjate la fel ca ale oricărui alt MK, iar Cubul nu este necesar să lucreze cu ele. A fost chiar posibil?...

HAL și în special STM32CubeMX este un instrument pentru inginerii profesioniști care lucrează îndeaproape cu cipurile STM32. Caracteristica principală este un nivel ridicat de abstractizare, capacitatea de a migra rapid de la un MCU la altul și chiar de la un nucleu la altul, rămânând în același timp în linia STM32. Pasionații întâmpină rar astfel de probleme - alegerea noastră de microcontrolere, de regulă, se limitează la sortimentul AliExpress și migrăm adesea între cipuri radical diferite - trecem de la Atmega la STM, de la STM la ESP sau orice lucru nou, prietenii noștri chinezi. aruncă în noi. HAL nu va ajuta aici, iar studiul lui va consuma mult timp.

Rămâne LL - dar de la el la registre este o jumătate de pas. Personal, mi se pare util să scriu macrocomenzile cu adrese de registru: studiez mai atent fișa de date, mă gândesc la ce voi avea nevoie în viitor și la ce cu siguranță nu voi avea, îmi structurez mai bine programele și, în general, depășirea ajută la memorare .

În plus, există o nuanță cu popularul STM32F103 - există două versiuni LL incompatibile pentru acesta, una oficială de la STM, a doua de la Leaf Labs, folosită în proiectul STM32duino. Dacă scrieți o bibliotecă open-source (și am avut exact o astfel de sarcină), trebuie fie să faceți două versiuni, fie să accesați direct registrele.

În cele din urmă, eliminarea LL, în opinia mea, simplifică migrarea, mai ales dacă o planificați încă de la începutul proiectului. Exemplu exagerat: să scriem Arduino blink în Atmel Studio fără 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++);
    } 
}

Pentru ca acest cod să clipească LED-ul de pe o placă chineză cu STM8 (de la ST Visual Desktop), este suficient să schimbați două adrese în el:

#define DDR_B 0x5007
#define OUT_B 0x5005

Da, folosesc o caracteristică de conectare a LED-ului pe o anumită placă, va clipi foarte încet, dar se va întâmpla!

Ce tipuri de fișe de date există?

În articole și pe forumuri, atât în ​​rusă, cât și în engleză, „fișele de date” înseamnă orice documentație tehnică pentru cipuri și fac același lucru în acest text. În mod oficial, acestea sunt doar un tip de astfel de documentație:

Foaie de date – Caracteristici de performanță, caracteristici tactice și tehnice. Obligatoriu pentru orice componentă electronică. Informațiile de fundal sunt utile pentru a le păstra la îndemână, dar nu sunt multe de citit în ele cu atenție. Cu toate acestea, cipurile mai simple sunt adesea limitate la o fișă de date pentru a nu produce documente inutile; în acest caz, Manual de referință este inclus aici.

Manual de referință – instrucțiunile în sine, o carte sănătoasă de peste 1000 de pagini. Lucrarea a tot ceea ce este înghesuit în cip este descrisă în detaliu. Documentul principal pentru stăpânirea microcontrolerului. Spre deosebire de foaie de date, instrucțiunile sunt scrise pentru o gamă largă de MK-uri; ele conțin o mulțime de informații despre periferice care nu sunt disponibile în modelul dvs. specific.

Manual de programare sau Manual de set de instrucțiuni – instrucțiuni pentru comenzi unice ale microcontrolerului. Conceput pentru cei care programează în limbaj Asamblare. Autorii compilatorului îl folosesc în mod activ pentru a optimiza codul, așa că în cazul general nu vom avea nevoie de el. Dar căutarea aici este utilă pentru o înțelegere generală, pentru unele comenzi specifice, cum ar fi ieșirea dintr-o întrerupere, precum și pentru utilizarea activă a depanatorului.

Nota de aplicare – sfaturi utile pentru rezolvarea unor probleme specifice, adesea cu exemple de cod.

Foaia de Errata – descrierea cazurilor de comportament nestandard al cipului cu opțiuni de soluționare, dacă există.

Ce este în fișele tehnice

Direct către Foaie de date este posibil să avem nevoie de următoarele secțiuni:

Rezumatul dispozitivului – prima pagină a fișei de date descrie pe scurt dispozitivul. Foarte util în situațiile în care ai găsit un cip undeva (l-ai văzut într-un magazin, l-ai lipit, a dat peste o mențiune) și vrei să înțelegi ce este.

Descriere generala – o descriere mai detaliată a capacităților cipurilor din linie.

Pinouts – diagrame de fixare pentru toate pachetele de cipuri posibile (care pin este pe ce picior).

Descrierea pinului – descrierea scopului și capacitățile fiecărui pin.

Harta memoriei – este puțin probabil să avem nevoie de o hartă de adrese în memorie, dar uneori include și un tabel cu adrese de bloc de registru.

Înregistrează Harta – tabelul de adrese ale blocurilor de registre, de regulă, se află în fișa de date, iar în Ref Manual – doar schimburi (decalaje de adrese).

Caracteristici electrice – în această secțiune ne interesează în primul rând evaluări maxime absolute, listând sarcinile maxime pe cip. Spre deosebire de indestructibilul Atmega328p, majoritatea MK-urilor nu vă permit să conectați sarcini serioase la pini, ceea ce devine o surpriză neplăcută pentru arduiniști.

Informații despre pachet – desene cu carcasele disponibile, utile atunci când vă proiectați plăcile.

Manual de referință structural constă din secțiuni dedicate unor periferice specifice indicate în titlul acestora. Fiecare capitol poate fi împărțit în trei părți:

Descriere, Introducere, DESCRIERE – prezentare generală a capabilităților periferice;

Descriere funcțională, Ghid de utilizare sau pur și simplu blocul principal al secțiunii - o descriere text detaliată a principiilor dispozitivului periferic și a modului de utilizare;

Registre – descrierea registrelor de control. În cazuri simple, cum ar fi GPIO sau SPI, acest lucru poate fi suficient pentru a începe să utilizați perifericele, dar de multe ori mai trebuie să citiți părțile anterioare.

Cum să citești fișele tehnice

Fișele tehnice, din obișnuință, te sperie cu volumul și abundența lor de cuvinte de neînțeles. De fapt, totul nu este atât de înfricoșător dacă cunoașteți câteva trucuri de viață.

Set bun cititor PDF. Fișele de date sunt scrise în tradiția glorioasă a instrucțiunilor de hârtie; sunt grozave pentru a tipări, a introduce cu semne de carte din plastic și a coase. Hipertextul în ele este observat în urme. Din fericire, cel puțin structura documentului este concepută cu marcaje, așa că este foarte necesar un cititor adecvat, cu navigare ușoară.

Fișa de date nu este manualul lui Stroustrup; ea conține nu este nevoie să citești totul. Dacă ați folosit sfaturile anterioare, găsiți doar secțiunea dorită în bara de marcaje.

Fișele tehnice, în special Manuale de referință, poate descrie capacitățile nu unui anumit cip, dar întreaga linie. Aceasta înseamnă că jumătate, sau chiar două treimi din informații nu sunt legate de cipul tău. Înainte de a studia registrele TIM7, faceți check-in Descriere generala, îl ai?

Știi Englez destul pentru nivel de bază. Fișele de date constau în jumătate din termeni nefamiliari pentru vorbitorul nativ mediu și jumătate din structuri simple de conectare. Există, de asemenea, foi excelente de date chineze în engleză chineză, unde jumătate sunt, de asemenea, termeni, iar a doua jumătate sunt un set aleatoriu de cuvinte.

Dacă vă întâlniți cuvânt necunoscut, nu încercați să îl traduceți folosind un dicționar englez-rus. Dacă ești confuz histerezis, atunci traducerea „histereză” nu vă va face mai cald. Folosiți Google, Stack Overflow, Wikipedia, forumuri, unde va fi conceptul necesar explicat în cuvinte simple cu exemple.

Cel mai bun mod de a înțelege ceea ce citești este verifica in actiune. Prin urmare, păstrați la îndemână placa de depanare cu care vă familiarizați, sau mai bine zis două, în cazul în care încă ați înțeles ceva greșit și ați văzut un fum magic.

Este un obicei bun să-ți ții foaia de date la îndemână atunci când o faci citind tutorialul cuiva sau studiind biblioteca altcuiva. Este foarte posibil să găsiți în ea o soluție mai optimă la problema dvs. Și invers - dacă nu puteți înțelege din foaia de date cum funcționează de fapt registrul, căutați-l pe Google: cel mai probabil, cineva a descris deja totul în cuvinte simple sau a lăsat cod clar pe GitHub.

glosar

Câteva cuvinte și simboluri utile pentru a vă ajuta să vă obișnuiți rapid cu fișele de date. Ce mi-am amintit în ultimele două zile, completările și corecturile sunt binevenite.

electricitate
VDC, Adevărat – „plus”, mâncare
Vss, Vee – „minus”, pământ
curent - actual
Voltaj - Voltaj
a scufunda curentul – lucrează ca „sol” pentru sarcina externă
la sursa de curent – sarcină externă de alimentare
chiuvetă înaltă/pin sursă – știft cu „toleranță” crescută la încărcare

IO
H, sus – pe pinul Vcc
L, scăzut – pe pinul Vss
Impedanță ridicată, Bună ziua, plutitor – nu există nimic pe știft, „rezistență mare”, este practic invizibil pentru lumea exterioară.
trage slab în sus, trage slab în jos – rezistor de tragere/coborâre încorporat, aproximativ echivalent cu 50 kOhm (vezi fișa tehnică). Este folosit, de exemplu, pentru a preveni suspendarea pinului de intrare în aer, provocând alarme false. Slab - pentru că este ușor să-l „întrerupi”.
push pull – modul de ieșire pin, în care comută între Înalt и Jos – IEȘIRE obișnuită de la Arduino.
canal deschis – desemnarea modului de ieșire în care pinul poate fi fie JosSau Impedanță mare/plutitoare. În plus, aproape întotdeauna aceasta nu este o scurgere „adevărată” deschisă; există diode de protecție, rezistențe și altele. Aceasta este pur și simplu o desemnare pentru modul sol/niciunul.
scurgere deschisă adevărată - dar acesta este o scurgere adevărată deschisă: știftul duce direct la pământ dacă este deschis, sau rămâne în limb dacă este închis. Aceasta înseamnă că, dacă este necesar, o tensiune mai mare decât Vcc poate fi trecută prin el, dar maximul este încă specificat în fișa tehnică din secțiunea Valori maxime absolute/tensiune.

interfețe
în serie – conectat în serie
a înlănţui – asamblați cipurile într-un lanț folosind o conexiune serială, crescând numărul de ieșiri.
schimbare – deplasare, de obicei denotă o schimbare de pic. Respectiv, a se schimba и să treci afară – primirea și transmiterea datelor bit cu bit.
zăvor – un zăvor care acoperă tamponul în timp ce biții sunt deplasați prin el. Când transferul este finalizat, supapa se deschide și biții încep să funcționeze.
a intra – efectuați un transfer bit cu bit, mutați toți biții în locurile potrivite.
tampon dublu, registru de umbră, registru de preîncărcare – desemnări istorice, când registrul trebuie să poată accepta date noi, dar să le păstreze până la un moment dat. De exemplu, pentru ca PWM să funcționeze corect, parametrii săi (ciclul de funcționare, frecvența) nu ar trebui să se schimbe până la încheierea ciclului curent, dar noi parametri pot fi deja transferați. În consecință, cele actuale se păstrează la registru de umbră, iar altele noi cad în registru de preîncărcare, fiind scris în registrul de cip corespunzător.

Tot felul de lucruri
prescaler – prescaler de frecvență
a seta un pic - setați bitul la 1
pentru a șterge/reseta puțin – resetează bitul la 0 (reseta – caracteristica fișei de date STM)

Ce urmează

În general, aici a fost planificată o parte practică cu o demonstrație a trei proiecte pe STM32 și STM8, realizate special pentru acest articol folosind fișe de date, cu becuri, SPI, cronometre, PWM și întreruperi:

Cum și de ce să citiți fișele de date dacă microcontrolerele sunt hobby-ul tău

Dar există mult text, așa că proiectele sunt trimise în partea a doua.

Abilitatea de a citi fișele de date vă va ajuta cu hobby-ul dvs., dar este puțin probabil să înlocuiască comunicarea live cu colegii pasionați pe forumuri și chaturi. În acest scop, mai întâi de toate, trebuie să vă îmbunătățiți limba engleză. Prin urmare, cei care au terminat de citit vor primi un premiu special: două lecții gratuite în Skyeng cu prima plată folosind codul HABR2.

Sursa: www.habr.com

Adauga un comentariu