
Mikroelektronika është një pasion i njohur në vitet e fundit falë magjisë së Arduino. Por ja, ndodhia: me një interes të duhur, DigitalWrite() mund të kalojë shpejt, por çfarë të bësh më pas – nuk është aq e qartë. Zhvilluesit e Arduino kanë bërë disa përpjekje për të ulur kufirin e hyrjes në ekosistemin e saj, por jashtë saj ende përshkruhet një pyll i errët i rrugës së vështirë të elektronikes, i pakapshëm për entuziastët.
Për shembull, datasheet-et. Duket sikur aty ka gjithçka, merr dhe përdor. Por autorët e tyre duket se nuk e kanë qëllim popullarizimin e mikroprocesorëve; ndonjëherë duket, se ata abuzojnë qëllimisht me terma dhe akronime të paqarta gjatë përshkrimit të gjërave të thjeshta, për të ngatërruar maksimalisht të paqartët. Por nuk është gjithçka aq keq, me dëshirë kutia hapet.
Në këtë artikull, do të ndaj përvojën time të një гуманитарija me datasheet-et për qëllime hobistike. Teksti është i destinuar për entuziastët që janë rritur nga pantallonat e vogla të Arduino, dhe supozon njohuri të caktuara mbi parimet e funksionimit të mikroprocesorëve.
Të fillojmë me të zakonshmen
Tërheqim dritën LED në Arduino
Dhe menjëherë kodi:
void setup() {
DDRB |= (1<<5);
}
void loop() {
PINB = (1<<5);
for (volatile uint32_t k=0; k<100000; k++);
}«Çfarë është kjo? – Do të pyesë lexuesi me përvojë. – Pse po shkruan diçka në regjistrin e hyrjes PINB? Ai është vetëm për të lexuar!» Realisht, , si shumica e artikujve mësimorë në internet, thotë se ky regjistër është read-only. Edhe unë mendova kështu, derisa e rilexova për Atmega328p, duke përgatitur këtë artikull. Dhe atje:

Kjo është një funksionalitet relativisht i ri, nuk ka qenë në Atmega8, për të cilin nuk e dinë të gjithë apo nuk e përmendin për arsye të kompatibilitetit të kundërt. Por është mjaft i mirë për të demonstruar idenë se është e rëndësishme të lexosh datasheet-et për të shfrytëzuar të gjitha mundësitë e çipit, duke përfshirë ato të panjohura. Dhe kjo nuk është arsyeja e vetme.
Pse duhet të lexosh datasheet-et
Zakonisht, entuziastët e Arduino, pasi kanë luajtur me LED-at dhe AnalogWrite, fillojnë të lidhen me bordin disa module dhe çipa, për të cilat tashmë ka biblioteka të shkruara. Njëherë ose një tjetër, shfaqet një bibliotekë që nuk punon ashtu siç duhet. Atëherë entuziasti fillon ta rregullojë, dhe aty…
Atje ndodhin gjëra që janë kategorikisht të paqartë, prandaj duhet të shkojë në Google, të lexoj tjerë numra të tutorialeve, të merrem me pjesë të kodit të dikujt tjetër të përshtatshëm dhe përfundimisht të arrij suksesin. Kjo jep një ndjenjë të fuqishme realizimi, por në të vërtetë procesi ngjan me shpikjen e biçikletës përmes inxhinierisë së rikthyer të një motoçiklete. Ndërkohë, njohja e mënyrës se si funksionon kjo biçikletë nuk rritet. E di, sepse vetë kam bërë këtë për një kohë të gjatë.
Nëse do të kisha kaluar një çift ditësh për të studiuar dokumentacionin për Atmega328, do të kisha kursyer një sasi të madhe kohë. Pas të gjithave, është një mikroçip mjaft i thjeshtë.
Prandaj, duhet të lexoni datasheet-et të paktën për të pasur një ide se si funksionon mikroçipi dhe çfarë mund të bëjë ai. Dhe gjithashtu:
për të kontrolluar dhe optimizuar bibliotekat e të tjerëve. Ato shpesh shkruhen nga entuziastë të ngjashëm që shpiknin biçikletën; ose, përkundrazi, autorët e bëjnë qëllimisht mbrojtjen e tepërt nga idiotët. Le të jetë tri herë më shumë dhe më ngadalë, por sigurisht do të funksionojë;
për të pasur mundësinë të përdor chips në projektin tuaj për të cilat askush nuk ka shkruar bibliotekën;
për të lehtësuar migrimin nga një gamë MK në një tjetër;
për të optimizuar kodin tim të vjetër, i cili nuk gjendej dot në Arduino;
për të mësuar të kontrolloj çdo chip direkt përmes regjistrave të tij, pa u shqetësuar për të studiuar strukturën e bibliotekave të tij, nëse ato ekzistojnë.
Pse të shkruaj në regjistra drejtpërdrejt, kur ka HAL dhe LL?
Fjalori
HAL, High Abstraction Layer – një bibliotekë për menaxhimin e mikroçipit me një nivel të lartë abstarcioni. Nëse duhet të përdorim ndërfaqen SPI1, thjesht e konfigurojmë dhe aktivizojmë SPI1, pa menduar se cilët regjistra janë për çfarë.
LL, Low Level API – një bibliotekë që përmban makro ose struktura me adresat e regjistrave, e cila lejon qasjen tek ata me emër. DDRx, PORTx, PINx në Atmega – këto janë LL.
Diskutimet mbi "HAL, LL ose regjistra" ndodhin rregullisht në komentet në Habra. Pa pretenduar për qasje në njohuri astrale, thjesht do të ndaja përvojën dhe mendimet e mia si entuziast.
Pasi më shumë-më pak duke u njohur me Atmegun dhe duke lexuar artikuj për bukuritë e STM32, kam blerë gjashtëlloj plaka – dhe Discovery, dhe "Tabletat Blu", dhe madje thjesht çipa për projektet e mia. Të gjitha ato kanë qëndruar për dy vjet në një kuti. Ndonjëherë i thosha vetes: "po, nga këto fundjava do të filloj me STM", hapja CubeMX, gjeneroja konfigurimin për SPI, shikoja tekstin e marrë, të formuluar abundueshëm me kopira të STM, dhe vendosja se ishte disi shumë.

Të kuptosh se çfarë ka shkruar CubeMX, natyrisht, është e mundur. Por njëherësh, është e qartë se të mbash mend të gjitha formulimet për t'i shkruar ato me dorë më pas, është e pamundur. Dhe debugging këtë, nëse ndonjëherë harroj të vendos ndonjë kutizë në Cube, është krejt një përshëndetje tjetër.
Ka kaluar dy vjet, unë ende po shihja në për çipa të ndryshëm që duken të shijshëm, por të paarritshëm për miratimin tim, dhe rastësisht u ndesha me , ndonëse për STM8. Dhe papritur kuptova se gjithë këtë kohë isha duke trokitur në një derë të hapur: regjistrat te STM janë të organizuar si te çdo mikrokontroller tjetër, dhe për të punuar me ta, Cube nuk është i detyrueshëm. Eh, kaq mund të bëhej?..
HAL dhe specifikisht STM32CubeMX është një instrument për inxhinierë profesionistë që punojnë ngushtë me çipat STM32. Tipari kryesor është niveli i lartë i abstraksionit, mundësia për të migruar shpejt nga një mikrokontroller në tjetër dhe madje nga një bërthamë në tjetër, duke qëndruar brenda linjës STM32. Adhuruesit hasin shumë rrallë në këto detyra – zgjedhja jonë e mikrokontrollerit është zakonisht e kufizuar në ofertën e AliExpress, dhe shpesh ne migrojmë mes çipave radikalisht të ndryshëm – kalojmë nga Atmega në STM, nga STM në ESP, mirëpo apo të tjera që na sjellin miqtë tanë kinezë. HAL këtu s’na ndihmon, dhe studimi i tij do të marrë shumë kohë.
Na mbetet LL – por nga ai deri te regjistrat është vetëm një hap. Personalish, e gjej të dobishme të shkruaj makrotë e mia me adresat e regjistrave: studioj më me kujdes fletën e të dhënave, mendoj se çfarë do të më duhet në të ardhmen, dhe çfarë s’ka pikë, e strukturoj më mirë programet e mia, dhe në përgjithësi, përballimi ndihmon në memorizim.
Për më tepër, ka një nuancë me populorin STM32F103 – për të ekzistojnë dy versione të LL që nuk janë të kompatibilshme, një zyrtare nga STM, dhe tjetra – nga Leaf Labs, e cila përdoret në projektin STM32duino. Nëse do të shkruaja një bibliotekë open-source (dhe unë kisha pikërisht ), duhet ose të bëja dy versione, ose të shkoja direkt te regjistrat.
Në fund, heqja e LL, sipas mendimit tim, e thjeshton migrimin, veçanërisht nëse e planifikoni që në fillim të punës mbi projektin. Një shembull ekstrem: të shkruajmë një blink për Arduino në Atmel Studio pa 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++);
}
}Për ta bërë këtë kod të ndizet me dritën LED në një bord kineze me STM8 (nga ST Visual Desktop), mjafton të ndryshoni dy adresat:
#define DDR_B 0x5007
#define OUT_B 0x5005Po, unë po përdor karakteristikën e lidhjes së dritës LED në bordin konkret, do të ndizet shumë ngadalë, por do të ndizet!
Çfarë janë datasheet-et
Në artikuj dhe forume, në gjuhën ruse dhe angleze, me "datasheet" kuptohet çdo dokumentacion teknik që i referohet çipave, ashtu siç po veproj edhe unë në këtë tekst. Formalisht, ato janë vetëm një lloj i tillë dokumentacioni:
Datasheet – TTX, karakteristikat taktiko-teknike. Kjo është e pranishme te çdo komponent elektronik. Informacion referues, e dobishme ta keni pranë, por nuk ka shumë për të lexuar me kujdes. Megjithatë, çipat më të thjeshtë shpesh kufizohen në datasheet për të mos krijuar dokumente shtesë; në këtë rast Manual Referencë përfshihet këtu.
Manual Referencë – vetë manuali, një libër i shëndoshë mbi 1000+ faqe. Përshtat imtësisht funksionimin e gjithçkaje që është ngjeshur në çip. Dokumenti kryesor për të mësuar një mikrocontroller. Ndryshe nga datasheet, instrukcionet shkruhen për një gamë të gjerë MCK, ato përmbajnë shumë informacion në lidhje me periferitë që mungojnë në modelin tuaj konkret.
Manualin e Programimit или Manuali i Setit të Instruksioneve – instrukcija për komandat unike të mikrocontroller-it. Destinohet për ata që programojnë në Assembler. Autorët e kompilatorëve e përdorin atë për optimizimin e kodit, prandaj në përgjithësi nuk do na nevojitet. Megjithatë, është e dobishme të hedhim një sy këtu për të kuptuar në përgjithësi, veçanërisht për disa komanda specifike si dalja nga ndërprerja, si dhe kur përdoret aktivisht debuggari.
Shënimi i Aplikacionit – këshilla të dobishme për zgjidhjen e detyrave specifike, shpesh me shembuj kodi.
Fletë Erratash – përshkrimi i rasteve të sjelljes jokonvencionale të çipit me mundësi për zgjidhje, nëse ka.
Çfarë ka në datasheet-e
Përveç Datasheet na mund të nevojiten këto seksione:
Përmbledhja e Pajisjeve – faqe e parë e datasheet-it jep një përmbledhje të shkurtër për pajisjen. Është shumë e dobishme në situata kur keni gjetur ndonjëherë një çip (e keni parë në dyqan, e keni nxjerrë, e keni hasur një përmendje) dhe doni të kuptoni çfarë është.
Përshkrimi i Përgjithshëm – përshkrim më të detajuar të mundësive të çipave nga seria.
Pinouts – skemat e pinouts për të gjitha rastet e mundshme të çipit (në cilin pin ndodhet cila këmbë).
Pin Description – përshkrimi i qëllimit dhe mundësive të çdo pini.
Memory Map – harta e adresave në memorie ndoshta nuk do na nevojitet, por ndonjëherë ajo përfshin gjithashtu tabelën e adresave të bllokave të regjistrave.
Register Map – tabela e adresave të bllokave të regjistrave, zakonisht ndodhet pikërisht në dokumentin e të dhënave, ndërsa në Ref Manual – vetëm offsetet (address offsets).
Karakteristikat Elektrike – në këtë seksion, na intereson kryesisht vlerave maksimale absolute, që përfshijnë ngarkesat maksimale mbi çip. Në krahasim me Atmega328p, shumica e MK-ve nuk lejojnë lidhjen e ngarkesave të mëdha mbi pin, që bëhet një surprizë e pakëndshme për përdoruesit e Arduino.
Informacioni i Paketimit – skicat e kapakëve të disponueshëm, të dobishme për projektimin e pllaka tuaja.
Manual Referencë strukturohet nga seksione që janë të dedikuara për periferinë specifike, të cituar në titujt e tyre. Çdo kapitull mund të ndahet në mënyrë të përafërt në tri pjesë:
Përmbledhje, Hyrje, Veçoritë – përmbledhja e mundësive të periferisë;
Përshkrimi Funksional, Udhëzuesi i Përdorimit ose thjesht blloku kryesor i seksionit – përshkrimi i detajuar tekstual i parimeve të funksionimit të periferisë dhe mënyrave të përdorimit të saj;
Regjistrat – përshkrimi i regjistrave menaxhues. Në raste të thjeshta si GPIO ose SPI, kjo mund të jetë mjaft e mjaftueshme për të filluar përdorimin e periferisë, por shpesh është e nevojshme të lexoni gjithashtu pjesë të mëparshme.
Si të lexoni dokumentet e të dhënave
Dokumentet e të dhënave shpesh i frikësojnë me volumin dhe bollëkun e fjalëve të paqarta. Në të vërtetë, gjithçka nuk është aq e frikshme, nëse dini disa këshilla.
Instaloni një lexues të mirë PDF. Dokumentet e të dhënave shkruhen në traditat e lavdishme të udhëzimeve në letër, është e shkëlqyer t'i printoni, t'i vendosni me shënime plastike dhe t'i lidhni. Hiperteksti në to vërehet në sasi të vogla. Për fat të mirë, të paktën struktura e dokumentit ka shenja, prandaj një lexues i mirë me navigacion të lehtë është shumë i nevojshëm.
Dokumenti i të dhënave nuk është një libër i Stroustrupit, në të nuk është e nevojshme të lexoni gjithçka rradhazi. Nëse e përdorni këshillën e mëparshme – thjesht gjeni seksionin e nevojshëm në panelin e shenjave.
Dokumentet e të dhënave, veçanërisht Manualet e Referencës, mund të përshkruajnë mundësitë jo të një çipi të caktuar, por të gjithë serisë. Kjo do të thotë se gjysma, ndoshta edhe dy të tretat e informacionit nuk kanë lidhje me çipin tuaj. Para se të studioni regjistrat TIM7, kontrolloni në Përshkrimi i Përgjithshëm, a e keni atë.
Dijeni anglisht mjaftueshëm në nivelin bazë. Fletë informacioni përbëhet gjysmë nga terma të panjohur për një përdorues të zakonshëm dhe gjysmë nga struktura të thjeshta lidhëse. Ndodhen gjithashtu fletë informacioni të shkëlqyera në anglishten kineze, ku gjysma tjetër përmban gjithashtu terma, ndërsa gjysma e dytë është një grup fjalësh të rastësishme.
Nëse hasni një fjalë të panjohur, mos u përpiqni ta përktheni atë me një fjalor anglisht-rusisht. Nëse ju ngatërron hysteresis, atëherë përkthimi "histerez" nuk do t'ju ndihmojë shumë. Përdorni Google, Stack Overflow, Wikipedia, forume ku koncepti i nevojshëm do të .
Mënyra më e mirë për të kuptuar atë që lexoni është ta provoni në praktiken. Prandaj mbani afër një kartë zhvillimi me të cilën po njohni, ose më mirë dy – për rastin nëse nuk keni kuptuar gjithçka dhe shihni një avull magjik.
Një zakon i dobishëm është të mbani afër një fletë informacioni kur po lexoni një tutorial të dikujt ose studioi një bibliotekë tjetër. Mjaft e mundshme, aty mund të gjeni një zgjidhje më optimale për problemin tuaj. Dhe përkundrazi – nëse nuk arrini të kuptoni se si funksionon regjistri nga fleta e informacionit, kërkoni atë: është e mundshme që dikush tashmë e ka përshkruar me fjalë të thjeshta ose ka lënë një kod të qartë në GitHub.
Fjalori
Disa fjalë dhe shkurtime të dobishme që ndihmojnë të bëni shpejt njohjen me fletët e informacionit. Çfarë më ka ardhur në mendje në dy ditët e fundit, shtesat dhe rregullimet janë të mirëpritura.
Elektriciteti
Vcc, Vdd – "plus", energji
Vss, Vee – "minus", toka
current – rrymë
voltage – tension
to sink current – të punosh "në tokë" për ngarkesën e jashtme
to source current – të ushqesh ngarkesën e jashtme
high sink/source pin – pin me "tolerancë" të lartë për ngarkesë
IO
H, High – në pinin Vcc
L, Low – në pinin Vss
High Impedance, Hi-Z, floating – në pin nuk ka asgjë, "rezistencë e lartë", ai faktikisht nuk është i dukshëm për botën e jashtme.
weak pull up, weak pull down – rezistori tërheqës/nxjerrës të integruar, një ekuivalenti i përafërt 50 kOhm (shih fletën e informacionit). Përdoret, për shembull, që pini hyrës të mos rrinë në ajër, duke shkaktuar aktive të rreme. Weak – sepse është e lehtë "ta kalosh".
push pull – moda e daljes së pinit, në të cilën ai kalon midis I Lartë и I Ulët – OUTPUT normal me Arduino.
open drain – përkufizimi i modës së daljes, në të cilin pini mund të jetë ose I Ulët, ose High Impedance / Floating. Megjithatë, pothuajse gjithmonë ky nuk është një "stok" i vërtetë i hapur, ka dioda mbrojtëse, rezistenca dhe gjëra të tjera. Simple është një shenja për modalitetin e tokës/nuk ka asgjë.
saktësisht shkarkim i hapur – dhe kjo tashmë është një stok i vërtetë i hapur: pini lidhet direkt në tokë, nëse është i hapur, ose qëndron në një gjendje të pezullt, nëse është i mbyllur. Kjo do të thotë se përmes tij, kur është e nevojshme, mund të kaloni një tension më të madh se Vcc, por maksimumi është përsëri i përmendur në të dhënat teknike në seksionin Vlerat Absolute Maksimale / Tensioni.
Interfacet
në seri – e lidhur në seri
për të lidhur çipat në një zinxhir duke i lidhur në seri, duke rritur numrin e daljeve. – zhvendosje, zakonisht i referohet zhvendosjes së bitëve. Kështu,
shift për të zhvendosur brenda për të zhvendosur jashtë и – marrjen dhe dërgimin e të dhënave bit për bit. – porti, që mbulon buffer-in, derisa bitët të zhvendosen përmes tij. Kur transferimi të përfundojë, porti hapet, bitët fillojnë të funksionojnë.
latch për të clock-in
– për të realizuar transferimin bit për bit, për të zhvendosur të gjitha bitët në vendet e nevojshme. ndihmës i dyfishtë
regjistri hije, regjistri i ngarkimit paraprak, – emërtime që tregojnë historinë, kur regjistri duhet të jetë në gjendje të pranojë të dhëna të reja, por t'i mbajë ato deri në një moment të caktuar. Për shembull, për funksionimin e saktë të PWM, parametrat e tij (dëmi, frekuenca) nuk duhet të ndryshojnë derisa cikli aktual të përfundojë, por parametrat e rinj tashmë mund të dërgohen. Kështu, ato aktuale mbahen në , dhe të rejat kalohen në regjistri i ngarkimit paraprak, duke u regjistruar në regjistrin përkatës të çipit. – emërtime që tregojnë historinë, kur regjistri duhet të jetë në gjendje të pranojë të dhëna të reja, por t'i mbajë ato deri në një moment të caktuar. Për shembull, për funksionimin e saktë të PWM, parametrat e tij (dëmi, frekuenca) nuk duhet të ndryshojnë derisa cikli aktual të përfundojë, por parametrat e rinj tashmë mund të dërgohen. Kështu, ato aktuale mbahen nëÇdo gjë
parapërcaktues
– ndarësi i frekuencës për të vendosur një bit
– të vendosësh bit-in në 1 për të pastruar/resetuar një bit
– të kesh bit-in në 0 ( – karakteristika e të dhënave teknike STM)reset Në të vërtetë, një pjesë praktike ishte planifikuar me demonstimin e tre projekteve në STM32 dhe STM8, të kryera posaçërisht për këtë artikull duke përdorur të dhënat, me llamba, SPI, temporizatorë, PWM dhe ndërprerje:
Çfarë pason
Por teksti del të jetë shumë, prandaj projektet dërgohen në pjesën e dytë.

Aftësia për të lexuar të dhënat do t'ju ndihmojë me hobin tuaj, por ndoshta nuk do të zëvendësojë komunikimin e drejtpërdrejtë me kolegët tuaj në forume dhe chat-e. Prandaj, për ata që e lexuan deri në fund – një shpërblim të veçantë: dy mësime falas në Skyeng me pagesën e parë me kodin
HABR2 Mikroelektronika..
Burimi: habr.com
