Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • OS
  • Kurse programimi për mikrokontrolluesit stm32 për fillestarët. ARM

Kurse programimi për mikrokontrolluesit stm32 për fillestarët. ARM

Ata që janë të njohur me kontrollorët tetë-bitësh si AVR dhe PIC, ndoshta janë të vetëdijshëm për një gjë kaq të nevojshme siç është memoria e integruar EEPROM. Kjo ju lejon të ruani disa të dhëna në të dhe më pas t'i lexoni pasi të keni fikur / ndezur kontrolluesin. Kujtesa jo e paqëndrueshme me pak fjalë. Duke kaluar te kontrollorët STM32, u befasova kur zbulova se ata thjesht nuk kanë një memorie të tillë! Por siç doli më vonë, ka deri në dy alternativa për një kujtesë të tillë. E para është përdorimi i një domeni rezervë. Kjo nuk është një memorie plotësisht e paqëndrueshme, në mënyrë që informacioni të mos shkatërrohet pasi të jetë fikur energjia kryesore, duhet të lidhet një bateri me një dalje të caktuar të kontrolluesit (si ato që janë në pllakat amë). Unë do të flas për këtë në më shumë detaje në artikullin vijues. Dhe tani do të shqyrtojmë mënyrën e dytë të ruajtjes jo të paqëndrueshme të të dhënave të përdoruesit - memoria flash e kontrolluesit.

DAC në STM32

DAC (ose DAC në gjuhën borgjeze) është një ADC pikërisht e kundërta - ajo transformon disa të dhëna dixhitale në analogun e tyre përfaqësimi (lexo tensionin). Për ta thënë edhe më thjeshtë, DAC do të na lejojë relativisht ndryshoni pa probleme tensionin në këmbën e kontrolluesit. Zonat praktike aplikacionet: gjenerimi i zërit dhe sinjalet arbitrare forma. Mund të vidhni një kartë SD në kontrollues dhe të bëni luajtës wav. Performanca kontrolluesi është padyshim i mjaftueshëm, sepse unë e bëra këtë edhe në AVR, dhe meqë ra fjala ata nuk kanë asnjë të integruar DAC dhe unë vidhosëm e jashtme. Punojnë me DAC shumë e lehtë, dhe në këtë artikull do të përpiqem të tregoj gjithçka që di DACE në STM32. Në foton më poshtë - gjenerimi i një sinusi duke përdorur DAC:

Gjenerimi i PWM në STM32

Në artikullin e mëparshëm në lidhje me kohëmatësit bazë, ne ndezëm edhe një herë LED, por këtë herë do të shkojmë shumë më tej dhe do të përpiqemi të tymosim se si ta bëjmë kontrolluesin STM32 të gjenerojë PWM. Për ta bërë këtë, do të duhet të përdorim një nga kohëmatësit me qëllime të përgjithshme, sepse ata kanë gjithçka që nevojitet për këtë. Pjesa tjetër e funksionalitetit të këtyre kohëmatësve është sigurisht mbresëlënëse, por në praktikën time nuk ka ardhur ende në ndihmë. Edhe pse është e mundur që në të ardhmen karakteristika të tilla të dobishme si funksioni i numërimit të pulseve të jashtme dhe aftësia për të përpunuar kthesat e koduesit në pajisje do të jenë të dobishme për mua. Por tani për tani, le të merremi me PWM. Ekziston një qark i tillë nga një kontrollues, tre rezistorë dhe një LED RGB që ne do të kontrollojmë. Kontrolli është që të ndriçohet pa probleme dhe të shuhet çdo ngjyrë. Sigurisht, mund të merrni tre LED të ndryshëm nëse nuk ka RGB.

Kohëmatësit bazë në STM32

Kohëmatësit janë pajisje të tilla periferike të kontrolluesit STM32 që na lejojnë të numërojmë intervalet kohore me shumë saktësi. Ky është ndoshta një nga funksionet më të rëndësishme dhe më të përdorura, por ka edhe të tjerë. Ju duhet të filloni me faktin se në kontrollorët STM32 ka kohëmatës me shkallë të ndryshme freskie. Më të thjeshtat janë bazë kohëmatës . Ato janë të mira sepse janë shumë të lehta për t'u konfiguruar dhe menaxhuar me një minimum regjistrash. Gjithçka që ata mund të bëjnë është të numërojnë intervalet kohore dhe të gjenerojnë ndërprerje kur kohëmatësi arrin një vlerë të caktuar. Grupi tjetër ( kohëmatës për qëllime të përgjithshme ) është shumë më i ftohtë se i pari, mund të gjenerojnë PWM, mund të numërojnë pulset që vijnë në këmbë të caktuara, mund të lidhni një kodues, etj. Dhe kohëmatësi më i lezetshëm është kohëmatës i avancuar i kontrollit , Unë mendoj se nuk do ta përdor për një kohë shumë të gjatë, pasi ende nuk kam nevojë të kontrolloj një motor elektrik trefazor. Fillimi i njohjes me kohëmatësit duhet të jetë diçka më e thjeshtë, vendosa të marr përsipër kohëmatësit bazë. Detyra që i vendosa vetes: Bëj kohëmatësin të gjenerojë ndërprerje çdo sekondë.

Ndërpret në STM32

Ky artikull është i pari në një seri artikujsh të planifikuar mbi studimin e programimit të mikrokontrolluesve. Duke studiuar materiale të ndryshme, vura re se pothuajse të gjitha fillojnë me faktin se fillestari ftohet të shkarkojë (ose të përdorë bibliotekën që vjen me mjedisin e zhvillimit) për të punuar me pajisjet periferike dhe ta përdorë atë për të shkruar programin e tij të parë (zakonisht duke pulsuar një LED).

Më befasoi vërtet. Sipas këtyre artikujve, programimi nuk është i nevojshëm as për të lexuar dokumentacionin për kontrolluesin e programueshëm. Më mësuan mençurinë "programimi i harduerit" krejtësisht të ndryshme.

Në këtë artikull, rruga nga fraza "Po, dua të provoj!" deri sa mbyllja e gëzueshme e syrit të LED-it, do të jetë shumë më e gjatë se ajo e autorëve të tjerë. Do të përpiqem të zbuloj aspekte të programimit të mikrokontrolluesve që fshihen pas përdorimit të funksioneve të bibliotekës dhe shembujve të gatshëm.
Nëse keni ndërmend të studioni seriozisht programimin e mikrokontrolluesve, ky artikull është për ju. Ndoshta mund të jetë gjithashtu me interes për ata që kanë luajtur mjaftueshëm me Arduino dhe duan të marrin në dorë të gjitha aftësitë harduerike të hekurit.

Zgjedhja e mikrokontrolluesit

Shumë mund të thonë se është më mirë të filloni të mësoni mikrokontrollues me AVR, PIC, 8051 ose diçka tjetër. Çështja është e shumëanshme dhe e diskutueshme. Unë di mjaft shembuj kur njerëzit, pasi kanë studiuar Cortex-M, kanë programuar AVR, ARM7, etj. Unë vetë fillova me Cortex-M3. Nëse përballeni me një detyrë specifike, ka shumë informacione në internet që krahasojnë lloje të ndryshme të mikrokontrolluesve dhe detyrat e zgjidhura me ndihmën e tyre. Në Habré, kjo pyetje u ngrit gjithashtu, për shembull.

Ne do të supozojmë se kemi kuptuar llojin e mikrokontrolluesit. Por në treg ekziston një gamë e madhe modifikimesh të ndryshme nga prodhues të ndryshëm. Ato ndryshojnë në shumë mënyra, nga madhësia e memories flash deri tek numri i hyrjeve analoge. Për secilën detyrë, zgjedhja duhet të bëhet individualisht. Nuk ka rekomandime të përgjithshme këtu dhe nuk mund të jenë. Do të vërej vetëm se ia vlen të fillohet studimi me prodhuesit MK me gamën më të madhe të mundshme. Pastaj, kur zgjidhni një MK për një detyrë specifike, ekziston një shans mjaft i madh që diçka nga asortimenti i paraqitur t'ju përshtatet.

Unë zgjodha për STM32(megjithëse mendoj se është më mirë të filloni të mësoni me MK nga Texas Instruments - dokumentacioni është i shkruar shumë mirë), sepse ato janë të përhapura në mesin e zhvilluesve rusë të elektronikës. Nëse keni probleme ose pyetje, mund të gjeni lehtësisht zgjidhje në forume. Një tjetër plus është përzgjedhja e pasur e tabelave demo si nga prodhuesi ashtu edhe nga organizatat e palëve të treta.

Çfarë nevojitet për të studiuar?

Fatkeqësisht, vetëm PC nuk mjafton për të filluar programimin e MK. Ju do të duhet të merrni një bord demo dhe një programues diku. Edhe pse kjo redukton konkurrencën në tregun e punës.

Unë vetë përdor një tabelë demo STM3220G-EVAL dhe programues J-Link PRO. Por për fillestarët, do të jetë e mjaftueshme STM32F4Zbulim, i cili mund të blihet pa problem për një shumë të vogël.

Të gjithë shembujt do të jenë për bordin e korrigjimit STM32F4Zbulim. Në këtë fazë, nuk do të kemi fare rëndësi që kjo tabelë të jetë e pajisur me një MK të bazuar në bërthamën Cortex-M4. Në të ardhmen e afërt, ne nuk do të përdorim veçoritë dhe avantazhet e tij ndaj Cortex-M3. Dhe si do të jetë më tej - do të shohim.

Nëse keni ndonjë bord tjetër me bazë STM32F2xx/STM32F4xx, mund të punoni me të. Në prezantimin e materialit do të përpiqem të përshkruaj sa më hollësisht të jetë e mundur. pse ne e bëjmë këtë në këtë mënyrë, dhe jo ndryshe. Shpresoj se askush nuk do të ketë probleme me transferimin e shembujve në pajisje të tjera.

Mjedisi i zhvillimit

Siç është përmendur vazhdimisht, ka një numër të mjaftueshëm mjedisesh zhvillimi për mikrokontrolluesit ARM, të paguara dhe jo aq shumë. Dhe përsëri, dua të heq polemikën për këtë çështje. Unë jam duke përdorur IAR Embedded Workbench për ARM 6.60. Të gjithë shembujt do të jenë në këtë mjedis. Nëse ju pëlqen (ose përdorni në organizatën tuaj) diçka tjetër (Keil, Eclipse, CCS, CooCoc, etj.), atëherë kjo nuk do t'ju dëmtojë shumë. Unë do t'i kushtoj vëmendje të veçantë veçorive që lidhen veçanërisht me mjedisin e zhvillimit.

Pse mjedisi i zhvillimit me pagesë?

Ndoshta dikush nuk do të jetë plotësisht i kënaqur me faktin që unë sugjeroj përdorimin e një mjedisi zhvillimi me pagesë, por në IAR ekziston një mundësi për të marrë një licencë të përkohshme pa kufizime funksionale, ose një licencë të pakufizuar me një kufi të madhësisë së kodit (32 KB për MK është një shumë).
Për më tepër, menjëherë do të vërej se për disa MK nuk ka mjedise zhvillimi falas. Dhe për fat të keq, këto MK janë të domosdoshme në disa fusha.


Unë nuk do të përshkruaj procesin e instalimit.

Ku të fillojë?

Krijo një projekt
Le të fillojmë duke krijuar një projekt bosh. IAR ju lejon të krijoni projekte në ASM, C dhe C++. Ne do të përdorim C.

Do të shohim një projekt bosh me një skedar kryesor.

Tani ju duhet të konfiguroni projektin për të filluar punën me MK "tonë" dhe korrigjuesin. MK i instaluar në tabelën STM32F4DISCOVERY STM32F407VG. Duhet të zgjidhet në vetitë e projektit (Opsionet e përgjithshme->Target->Pajisja):

Kur zgjidhet një procesor i programueshëm i synuar, ngarkohet përshkrimi i tij, i cili ofron mundësi të shumta për korrigjim (kjo do të diskutohet më poshtë). Përveç kësaj, një skedar konfigurimi që përshkruan hapësirën e disponueshme të adresave për lidhësin bashkëngjitet automatikisht. Nëse është e nevojshme, ne do të prekim temën e skedarit të konfigurimit të lidhjes në artikujt e ardhshëm.

Pas kësaj, duhet të konfiguroni korrigjuesin. Korrigjimi i programit bëhet drejtpërdrejt "në harduer". Kjo bëhet duke përdorur korrigjuesin JTAG. Mund të mësoni më shumë se si ndodh kjo në Wikipedia. Debugeri ST-LINK/V2 është i integruar në tabelën STM32F4DISCOVERY. Për të punuar me korrigjuesin, duhet të zgjidhni drejtuesin e tij në meny Debugger->Setup->Driver. Është gjithashtu e nevojshme të tregohet se korrigjimi duhet të bëhet drejtpërdrejt në harduer. Për ta bërë këtë, vendosni flamurin Korrigjues->Shkarko->Përdor ngarkues(et) flash


Për ata që panë fjalën Simulator

Në teori, IAR ju lejon të korrigjoni programet duke përdorur një simulator. Por nuk e kam parë kurrë të përdoret në praktikë.

Tani projekti është gati për punë (programim, derdhje dhe korrigjim).

“TK” për projektin e parë
Le të përmbledhim: MK dhe bordi i korrigjimit janë zgjedhur, projekti është përgatitur. Është koha për të marrë përsipër detyrën.

Le të mos devijojmë nga klasikët. Projekti i parë do të jetë një LED që vezullon. Për fat të mirë, ka mjaft të tillë në bord.Çfarë do të thotë kjo përsa i përket programimit? Hapi i parë është të studioni diagramin e qarkut të bordit demo dhe të kuptoni se si "ndizet" LED.
në dispozicion në faqen e internetit të prodhuesit. Ky përshkrim madje ka një seksion të veçantë në lidhje me LED-të në tabelë - 4.4 LED. Për shembull, ne do të përdorim Përdoruesi LD3. Le ta gjejmë në diagram:

Analiza më e thjeshtë e qarkut sugjeron që për të "ndezur" LED, është e nevojshme të aplikoni "1" në pinin MK (i cili për këtë MK korrespondon me 3.3V). Fikja bëhet duke aplikuar "0" në këtë pin. Në diagram, kjo kunj tregohet PD13(ky është ndoshta informacioni më i rëndësishëm nga ky dokument).

Si rezultat, ne mund të shkruajmë "TOR" për programin tonë të parë:
Programi për MK duhet të transferojë gjendjen e pinit të MK PD13 nga gjendja "0" në gjendjen "1" dhe anasjelltas me një periodicitet të caktuar të dallueshëm për syrin e njeriut (shënim i rëndësishëm, nëse pulsoni gjithashtu LED shpesh, syri mund të mos e dallojë këtë).

Para se të filloni programimin, ose pak teori
Përpara se të vazhdoni me zbatimin e TOR-së tonë, është e nevojshme të kuptoni se si menaxhohet MC.

Le të fillojmë me faktin se çdo MK përfshin një bërthamë, memorie dhe njësi periferike. Unë mendoj se gjithçka është e qartë me kujtesën. Do të përmend vetëm se STM32 ka një memorie flash në të cilën ruhet programi MK (në rastin e përgjithshëm, kjo nuk është një deklaratë e vërtetë, programi mund të ruhet në memorie të jashtme jo të paqëndrueshme, por tani për tani ne do ta heqim këtë ) dhe të dhëna të tjera, duke përfshirë të dhënat e përdoruesit. Ekziston edhe SRAM - memorie me akses të rastësishëm.

Bërthama është pjesa e mikrokontrolluesit që ekzekuton një rrymë të vetme instruksioni. Në MK tonë, lloji kryesor është Cortex-M4. Bërthama MK mund të krahasohet me procesorin në një PC. Mund të ekzekutojë vetëm komanda dhe të transferojë të dhëna në blloqe të tjera (ky krahasim nuk merr parasysh përpunuesit me përshpejtues grafikë të integruar).
Në të njëjtën kohë, prodhuesi MK nuk e zhvillon kernelin. Bërthama është blerë nga ARM Limited. Dallimi kryesor midis MK-ve të ndryshme është në periferi.

Blloqe periferike - blloqe që ndërveprojnë me "botën e jashtme" ose kryejnë funksione specifike që nuk janë të disponueshme për bërthamën MK. MK-të moderne (përfshirë STM32) përmbajnë një gamë të madhe njësish periferike. Blloqet periferike janë krijuar për të zgjidhur probleme të ndryshme, nga leximi i vlerës së tensionit nga hyrja analoge e MK deri tek transmetimi i të dhënave në pajisjet e jashtme përmes autobusit SPI.
Ndryshe nga bërthama MK, njësitë periferike nuk ekzekutojnë instruksione. Ata ekzekutojnë vetëm komandat e kernelit. Në këtë rast, pjesëmarrja e kernelit gjatë ekzekutimit të komandës nuk kërkohet.

Shembull

Një shembull është blloku UART, i cili është krijuar për të marrë dhe transmetuar të dhëna nga MK në pajisje të jashtme. Nga kerneli, është e nevojshme vetëm të konfiguroni bllokun dhe t'i jepni të dhëna për transmetim. Pas kësaj, kerneli mund të vazhdojë të ekzekutojë instruksionet. Mbi supet e njësisë periferike qëndron kontrolli i daljes përkatëse të MK për transferimin e të dhënave në përputhje me protokollin. Vetë njësia periferike e përkthen daljen e MK në gjendjen e kërkuar "0" ose "1" në kohën e duhur, duke kryer transmetimin.

Ndërveprimi i bërthamës me njësinë periferike
Ndërveprimi i bërthamës MK me njësinë periferike kryhet duke përdorur regjistra të veçantë (ka edhe ndërveprim përmes mekanizmit të ndërprerjes dhe DMA, por më shumë për këtë në postimet e ardhshme). Nga pikëpamja e kernelit, kjo është vetëm një pjesë e kujtesës me një adresë specifike, thjesht nuk është kështu. Shkrimi i të dhënave në një regjistër special është i barabartë me dërgimin e një komande ose të dhënash në një njësi periferike. Leximi - marrja e të dhënave nga blloku ose leximi i gjendjes së tij. Përshkrimi i blloqeve periferike dhe regjistrave të tyre të veçantë zë pjesën e luanit të përshkrimit të MK.

E RËNDËSISHME: Pas shkrimit të të dhënave në një regjistër special dhe leximit pasues, mund të merrni të dhëna krejtësisht të ndryshme. Për shembull, transferimi i të dhënave në bllokun UART për dërgim dhe leximi i të dhënave të marra nga blloku nga një pajisje e jashtme kryhet duke përdorur të njëjtin regjistër.

Regjistrat specialë zakonisht ndahen në fusha bit. Një (ose më shumë) bit kontrollojnë një parametër të caktuar të bllokut periferik, zakonisht në mënyrë të pavarur. Për shembull, bit të ndryshëm të të njëjtit regjistër kontrollojnë gjendjen e daljeve të ndryshme MK.

Mbani mend C
Nëse jeni mësues i gjuhës C, mos ngurroni ta kaloni këtë seksion. Ai është menduar kryesisht për ata që janë mësuar (ose që kanë mësuar vetë) të programojnë për një PC. Përvoja tregon se njerëzit shpesh nuk i mbajnë mend komandat e rëndësishme. Këtu do t'ju kujtoj shkurtimisht për operacionet bitwise dhe punën direkt me memorien në adresën e saj.

Shkrimi i të dhënave në një adresë në memorie

Supozoni se gjatë leximit të përshkrimit të njësisë periferike, kuptuam se për funksionimin e saktë të saj është e nevojshme të shkruhet numri 0x3B në të. Adresa e regjistrit special 0x60004012. Regjistri është 32-bit.
Nëse nuk e dini menjëherë se si ta bëni këtë, unë do të përpiqem të përshkruaj zinxhirin e arsyetimit për të marrë komandën e duhur.

Vlera 0x60004012 nuk është asgjë më shumë se vlera e një treguesi në një vend memorie. Kjo është pikërisht ajo që duhet të specifikojmë në programin tonë, domethënë të bëjmë konvertimin e tipit sipas sintaksës së gjuhës C:

(i gjatë i panënshkruar*) (0x60004012)

Kështu, ne kemi një tregues për një element. Tani ju duhet të shkruani vlerën e kërkuar në këtë element. Kjo bëhet duke çreferencuar treguesin. Kështu marrim komandën e saktë:

*(i gjatë i panënshkruar*)(0x60004012) = 0x3B;

Vendosja e biteve arbitrare në 1

Supozoni se duam të vendosim bitet 7 dhe 1 për të adresuar 0x60004012 në "1" pa ndryshuar vlerën e të gjithë biteve të tjerë në regjistër. Për ta bërë këtë, duhet të përdorni operacionin binar |. Unë do t'ju jap përgjigjen e saktë:

*(i gjatë i panënshkruar*)(0x60004012) |= 0x82;

Kushtojini vëmendje 2 fakteve. Bitet numërohen nga zero, jo nga e para. Ky operacion në fakt kërkon të paktën 3 cikle - leximi i vlerës, modifikimi, shkrimi. Ndonjëherë kjo nuk lejohet, sepse midis leximit dhe shkrimit, vlera e njërit prej biteve që ne jemi të ndaluar të ndryshojmë mund të ndryshohet nga njësia periferike. Mos harroni për këtë veçori, përndryshe gabimet që janë jashtëzakonisht të vështira për t'u kapur mund të futen.

Vendosja e biteve arbitrare në 0

Supozoni se duam të vendosim bitet 7 dhe 1 në adresën 0x60004012 në "0" pa ndryshuar vlerën e të gjithë biteve të tjerë në regjistër. Për ta bërë këtë, duhet të përdorni operatorin binar &. Unë do t'ju jap përgjigjen e saktë:

*(i gjatë i panënshkruar*)(0x60004012) &= 0xFFFFFF7D;

Ose shënimi i tij më i thjeshtë (mos u shqetësoni për funksionimin shtesë, përpiluesi do të llogarisë gjithçka paraprakisht edhe me optimizim minimal):

*(i gjatë i panënshkruar*)(0x60004012) &= (~0x82);

Disa veçori të programeve për MK
Këtu do të përpiqem të përshkruaj disa nga veçoritë e programeve MK që janë të rëndësishme për t'u mbajtur mend. Gjërat janë mjaft të dukshme, por ende.
Programi nuk ka fund
Ndryshe nga shumica e programeve të PC, programi MK nuk duhet të përfundojë kurrë, KURRË! Dhe çfarë saktësisht do të duhet të bëjë MC pas përfundimit të programit tuaj? Pyetja është praktikisht retorike. Prandaj, mos harroni të siguroheni që të mos harroni lakun e përjetshëm. Nëse dëshironi, mund ta vendosni MK në modalitetin e fjetjes.
Përdorni variablat me numër të plotë
Edhe pse ne përdorim një mikrokontrollues Cortex-M4 që kryen operacione me pikë lundruese në harduer, unë ju këshilloj të ndaloni përdorimin e tyre. Në MK pa mbështetje për operacione të tilla, koha e llogaritjes do të jetë thjesht e madhe.
Shmangni alokimin dinamik të memories
Kjo është vetëm këshilla. Arsyeja është e thjeshtë - nuk ka memorie të mjaftueshme. Kam hasur në biblioteka që kanë "rrjedhje të ngadalta" të kujtesës. Ishte shumë zhgënjyese kur, pas disa javësh funksionimi të qëndrueshëm, MK u var me një gabim. Është më mirë të mendoni për arkitekturën e programit tuaj paraprakisht në mënyrë që të mos keni nevojë të përdorni shpërndarjen dinamike të memories.
Nëse ende dëshironi ta përdorni, studioni me kujdes punën e menaxherit të kujtesës ose shkruani tuajën.

Le të shkojmë në punë!

Puna në një program për MK gjithmonë fillon me leximin e dokumentacionit. Për MK tonë është në dispozicion në faqen e internetit të prodhuesit. Shumë faqe, por lexojini të gjitha mirupafshim nuk ka nevojë. Siç është përmendur tashmë, shumica e dokumentacionit është një përshkrim i njësive periferike dhe regjistrave të tyre. Gjithashtu dua të tërheq vëmendjen tuaj për faktin se ky Manual Referencë nuk është shkruar për një MK, por për disa rreshta. Kjo sugjeron që kodi do të jetë i lëvizshëm kur kaloni në MK të tjera në këto linja (përveç nëse, sigurisht, përpiqeni të përdorni njësi periferike që nuk janë në MK të përdorur).

Para së gjithash, ju duhet të vendosni me cilat blloqe të punoni. Për këtë, mjafton të studiohen seksionet Prezantimi dhe Karakteristikat kryesore.

Kontrolli i drejtpërdrejtë i gjendjes së kunjave MK kryhet duke përdorur bllokun GPIO. Siç thuhet në dokumentacion, STM32 MK mund të ketë deri në 11 blloqe të pavarura GPIO. Blloqe të ndryshme periferike GPIO quhen porte. Portat emërtohen nga A deri në K. Çdo port mund të përmbajë deri në 16 kunja. Siç kemi theksuar më herët, LED është i lidhur me pinin PD13. Kjo do të thotë që ky pin kontrollohet nga njësia periferike GPIO porta D. Pini numër 13.

Këtë herë nuk do të kemi nevojë për asnjë bllok tjetër periferik.

Kontrolli i orës periferike
Për të reduktuar konsumin e energjisë së MC, pothuajse të gjitha njësitë periferike fiken pasi MC është ndezur. Njësia ndizet/fiket duke aplikuar/ndaluar sinjalin e orës në hyrjen e saj. Për funksionimin e duhur, është e nevojshme të konfiguroni kontrolluesin e orës së MCU në mënyrë që njësia periferike e nevojshme të marrë një sinjal të orës.
E rëndësishme: Njësia periferike nuk mund të niset menjëherë pasi sinjali i orës është ndezur. Është e nevojshme të prisni disa cikle derisa të "fillojë". Njerëzit që përdorin bibliotekat për pajisjet periferike shpesh nuk janë as të vetëdijshëm për këtë veçori.

Regjistrat janë përgjegjës për të mundësuar klockimin e njësive periferike Regjistri i aktivizimit të orës periferike RCC XXX.Në pozicionin XXX mund të përdoren gomat AHB1, AHB2, AHB3, APB1 dhe APB2. Pasi kemi studiuar me kujdes përshkrimin e regjistrave përkatës, mund të konkludojmë se rrahja e njësisë periferike GPIOD mundësohet duke vendosur "1" në bitin e tretë të regjistrit. Regjistri i aktivizimit të orës periferike RCC AHB1 (RCC_AHB1ENR):

Tani ju duhet të kuptoni se si të gjeni adresën e vetë regjistrit RCC_AHB1ENR.

Koment: Përshkrimi i sistemit të orës STM32 MK është i denjë për një artikull të veçantë. Nëse lexuesit kanë një dëshirë, unë do ta trajtoj këtë pjesë më në detaje në një nga artikujt e mëposhtëm.

Përcaktimi i adresave të regjistrave të veçantë
Përcaktimi i adresave të regjistrave të veçantë duhet të fillojë duke lexuar seksionin harta e kujtesës në manualin e referencës. Ju mund të shihni se çdo bllok ka seksionin e vet të hapësirës së adresave. Për shembull, për bllokun RCC, ky është seksioni 0x4002 3800 - 0x4002 3BFF:

Për të marrë adresën e regjistrit, është e nevojshme të shtoni në vlerën fillestare hapësirën e adresave të bllokut RCC Adr. kompensuar regjistri i dëshiruar. Kompensimi i adresës tregohet në përshkrimin e regjistrit (shih pamjen e ekranit më lart).

Si rezultat, ne përcaktuam adresën e regjistrit RCC_AHB1ENR- 0x4002 3830.

Blloku GPIO
Për një hyrje të përgjithshme në bllokun GPIO, unë rekomandoj shumë të lexoni seksionin përkatës të Manualit të Referencës në tërësi. Ndërkohë që nuk mund t'i kushtoni shumë vëmendje Mënyra alternative. Do ta lëmë për më vonë.

Tani detyra jonë është të mësojmë se si të menaxhojmë gjendjen e kunjave MK. Le të shkojmë drejtpërdrejt në përshkrimin e regjistrave GPIO.

Mënyra e punës
Para së gjithash, duhet të vendosni mënyrën e funksionimit të kunjit të 13-të të portit D si Mënyra e daljes për qëllime të përgjithshme, që do të thotë se blloku GPIO do të kontrollojë gjendjen e pinit MK. Mënyra e funksionimit të kunjave MK kontrollohet duke përdorur regjistrin Regjistri i modalitetit të portës GPIO (GPIOx_MODER) (x = A..I/J/K):

Siç shihet nga përshkrimi, për të bërë cilësimet që na nevojiten, duhet të shkruajmë vlerën 01b në 26-27 bit të regjistrit. GPIOx_MODER. Adresa e regjistrit mund të përcaktohet me të njëjtën metodë siç përshkruhet më sipër.

Konfigurimi i parametrave të funksionimit të kunjave të daljes së portës GPIO
Blloku GPIO ju lejon të aplikoni cilësime shtesë për kunjat e daljes së portit. Këto cilësime bëhen në regjistra:
  • Regjistri i llojit të daljes së portës GPIO (GPIOx_OTYPER)- vendosni llojin e daljes në push-pull ose open-drain
  • Regjistri i shpejtësisë së daljes së portës GPIO (GPIOx_OSPEEDR)- vendosni shpejtësinë e daljes
Ne nuk do t'i ndryshojmë këto parametra, pasi jemi mjaft të kënaqur me vlerat e paracaktuara.
Vendosja e vlerës në pin MK
Më në fund, kemi ardhur në momentin e kontrollit të gjendjes së prodhimit të MK. Ekzistojnë dy mënyra për të vendosur vlerën e daljes në një kunj të veçantë të MK.

Përdor regjistrin e vendosjes/rivendosjes së biteve të portës GPIO (GPIOx_BSRR)

Shkrimi i "0" ose "1" në bitet 0-16 rezulton në një ndryshim përkatës në gjendjen e kunjave të portit. Për të vendosur një vlerë të caktuar në daljen e një ose më shumë kunjave të MK dhe për të mos ndryshuar gjendjen e pjesës tjetër, do të jetë e nevojshme të përdoret funksioni i modifikimit të biteve individuale. Një operacion i tillë kryhet në të paktën 3 cikle. Nëse është e nevojshme të shkruani 1 për disa bit dhe 0 për të tjerët, atëherë do të kërkohen të paktën 4 cikle. Kjo metodë përdoret më së miri për të kthyer gjendjen e një prodhimi nëse gjendja e tij origjinale nuk dihet.

Regjistri i vendosjes/rivendosjes së biteve të portës GPIO (GPIOx_BSRR)

Ndryshe nga metoda e mëparshme, të shkruash 0 në cilindo prej biteve në këtë regjistër nuk do të bëjë asgjë (dhe në të vërtetë, të gjithë bitët janë vetëm për shkrim!). Shkrimi i 1 në bit 0-15 do të vendosë "1" në daljen përkatëse të MK. Shkrimi i 1 në bitet 16-31 do të vendosë "0" në daljen përkatëse të MK. Kjo metodë preferohet nga ajo e mëparshme nëse është e nevojshme të vendosni një vlerë të caktuar në pinin "MK" dhe të mos e ndryshoni atë.

Le të ndezim LED!
Pasi të keni gjetur adresat e të gjithë regjistrave të nevojshëm, mund të shkruani një program që ndez LED:
void main() ( //Aktivizo orën e portit D *(i gjatë i panënshkruar*)(0x40023830) |= 0x8; //vonesë e vogël për GPIOD bëhu gati e paqëndrueshme e panënshkruar gjatë i=0; i++; i++; i++; i=0; / /Cakto PD13 si dalje për qëllime të përgjithshme *(i gjatë i panënshkruar*)(0x40020C00) = (*(i gjatë i panënshkruar*)(0x40020C00)& (~0x0C000000)) |(0x04000000); //Ndiz LED të gjatë të ndezur!*(un (0x40020C14) |= 0x2000; ndërsa (1); )
mund të përpilojë ( Projekt->Përpilimi) dhe mbush ( Projekt->Shkarkim->Shkarko aplikacionin aktiv). Ose filloni korrigjimin ( Projekt->Dpdownload dhe Debug) dhe filloni ekzekutimin (F5).
LED është ndezur!
LED ndezës
Ndezja e LED nuk është gjë tjetër veçse një ndezje dhe fikje alternative me një vonesë midis këtyre veprimeve. Mënyra më e lehtë është të vendosni ndezjen dhe fikjen në një lak të përjetshëm dhe të futni një vonesë midis tyre.
void main() ( //Aktivizo orën e portit D *(i gjatë i panënshkruar*)(0x40023830) |= 0x8; //vonesë e vogël për GPIOD bëhu gati e paqëndrueshme e panënshkruar gjatë i=0; i++; i++; i++; i=0; / /Cakto PD13 si dalje për qëllime të përgjithshme *(i gjatë i panënshkruar*)(0x40020C00) = (*(i gjatë i panënshkruar*)(0x40020C00)& (~0x0C000000)) |(0x04000000); ndërsa(1) ( / *(Kthejeni LEDON i panënshkruar gjatë*)(0x40020C14) |= 0x2000; //Vonesë për(i=0; i<1000000 ;++i); //Turn LED OFF *(unsigned long*)(0x40020C14) &= ~0x2000; //Delay for(i=0; i<1000000 ;++i); } }
Vlera prej 1000000 në vonesë u zgjodh eksperimentalisht në mënyrë që periudha e ndezjes së LED-it të ishte e dukshme për syrin, por jo shumë e gjatë.
Optimizimi i algoritmit
Disavantazhi i qasjes së zgjedhur duke ndezur LED është se bërthama MK shpenzon shumicën e kohës në cikle boshe, megjithëse mund të bëjë diçka të dobishme (në shembullin tonë nuk ka detyra të tjera, por ato do të shfaqen në të ardhmen).

Për të shmangur këtë, zakonisht përdoret një numërues cikli, dhe gjendja e pinit MK ndërrohet kur programi kalon një numër të caktuar ciklesh.
void main() ( //Aktivizo orën e portit D *(i gjatë i panënshkruar*)(0x40023830) |= 0x8; //vonesë e vogël për GPIOD bëhu gati e paqëndrueshme e panënshkruar gjatë i=0; i++; i++; i++; i=0; / /Cakto PD13 si dalje për qëllime të përgjithshme *(i gjatë i panënshkruar*)(0x40020C00) = (*(i gjatë i panënshkruar*)(0x40020C00)& (~0x0C000000)) | (0x04000000); while(1) (i++; nëse(! %2000000)) ( //Ndiz LED *(i gjatë i panënshkruar*)(0x40020С14) |= 0x2020; ) tjetër nëse(!(i%1000000)) ( //Fike LED *(i gjatë i panënshkruar*)(0x40020С1) = ~0x2000;)))
Por edhe këtu nuk do të jetë pa probleme, me një ndryshim në numrin e komandave të ekzekutuara brenda ciklit, periudha e ndezjes së LED-it (ose periudha e ekzekutimit të komandave të tjera në cikël) do të ndryshojë. Por në këtë fazë, ne nuk mund ta luftojmë atë.

Pak për korrigjimin e gabimeve
IAR ju lejon të korrigjoni një aplikacion direkt në harduer. Gjithçka duket pothuajse e njëjtë me korrigjimin e një aplikacioni PC. Ekziston një mënyrë ekzekutimi hap pas hapi, duke futur një funksion, duke parë vlerën e variablave (në modalitetin e korrigjimit Shiko->Shiko->Shiko1/4).

Por përveç kësaj, ekziston mundësia për të parë vlerat e regjistrave të kernelit, regjistrat specialë të njësive periferike (View-> Register), etj.
Unë rekomandoj shumë të njiheni me veçoritë e korrigjuesit gjatë mësimit të programimit MK.

Disa fjalë në përfundim

Ndoshta shumë do të thonë se shkrimi manual i adresave në një program nuk është i saktë, pasi prodhuesi ofron skedarë me përkufizimet e regjistrave dhe fushave të biteve, biblioteka për të punuar me pajisje periferike dhe mjete të tjera që e bëjnë jetën më të lehtë për zhvilluesin. Jam plotësisht dakord me këtë, por gjithsesi mendoj se hapat e parë në programimin MK duhet të bëhen duke gërmuar manualisht në dokumentacion, duke përcaktuar në mënyrë të pavarur regjistrat e nevojshëm dhe fushat e biteve. Në të ardhmen, nuk mund ta përdorni këtë, por duhet të jeni në gjendje.
Këtu janë vetëm disa arsye për këtë pohim:
  • Ndonjëherë ka gabime në biblioteka nga prodhuesi! Një herë pothuajse e humba afatin e projektit për shkak të kësaj. Unë e bashkova çipin disa herë, duke menduar se e kam dëmtuar kristalin gjatë saldimit (kjo ka ndodhur më parë). Dhe problemi ishte se adresa e regjistrit special ishte regjistruar gabimisht në bibliotekë. Zakonisht kjo ndodh me linjat MK ose MK të sapo lëshuara në treg.
  • Bibliotekat për të punuar me pajisje periferike të disa prodhuesve nuk zbatojnë të gjitha aftësitë e njësive periferike. Veçanërisht mëkatova me këtë Mikro ndriçues, të cilat më pas u blenë nga TI. Më duhej të shkruaja inicializimin e periferisë me dorë.
  • Shumë njerëz mësohen të fillojnë programimin MK duke studiuar shembuj. Unë besoj se së pari ju duhet të vendosni se çfarë ju lejon të zbatoni MK. Kjo mund të kuptohet vetëm duke lexuar dokumentacionin. Nëse diçka nuk është në shembuj, kjo nuk do të thotë që pajisja nuk e mbështet atë. Shembulli i fundit është mbështetja e harduerit PTP STM32. Sigurisht, mund të gjeni diçka në rrjet, por kjo nuk përfshihet në grupin standard nga prodhuesi.
  • Drejtuesit e njësive periferike të disa prodhuesve janë aq të pa optimizuar sa që duhen deri në 20 cikle për të ndërruar gjendjen e pinit duke përdorur bibliotekën. Ky është një luks i papërballueshëm për disa detyra.

Faleminderit të gjithëve që lexuan postimin tim, doli shumë më tepër nga sa prisja në fillim.
Pres komentet dhe kritikat tuaja të arsyeshme. Nëse ata që lexojnë kanë dëshirë, do të përpiqem të vazhdoj serinë e artikujve. Ndoshta dikush ka ide për tema që mund të mbulohen - do të doja t'i dëgjoja.

Sistemi i orës STM32.

Sot do të flasim për sistemin e klockimit të mikrokontrolluesve STM 32. Nëse ende nuk e dini se çfarë është ora, frekuencë dhe nuk e keni prekur fare sistemin e klockimit më parë,. Megjithëse kjo lidhje diskuton sistemin e rrahjes së mikrokontrolluesit AVR, konceptet e përcaktuara në mësim sipas referencës janë gjithashtu të zbatueshme për sistemin e rrahjes së mikrokontrolluesit STM 32.

Pra, le të fillojmë!

Ne do të shqyrtojmë sistemin e fiksimit duke përdorur shembullin e mikrokontrolluesit STM 32F 303VCT 6, i cili është i instaluar në tabelën e korrigjimit STM 32 F 3 DISCOVERY.

Le të hedhim një vështrim në strukturën e përgjithshme të sistemit të orës:

Siç mund ta shohim, sistemi i rrahjes STM 32 është një rend i madhësisë më i ndërlikuar se sistemi i rrahjes së mikrokontrolluesit. AVR, pavarësisht se Figura tregon vetëm pjesën kryesore të saj.

Le ta kuptojmë!

Diagrami duhet parë nga e majta në të djathtë. Së pari, ne duhet të zgjedhim burimin kryesor të orës së kontrolluesit. Ne do të zgjedhim midis HSI dhe HSE.

HSE- Gjenerator i jashtëm me frekuencë të lartë. Burimi i orës për të është një sinjal i orës së jashtme ( Frekuenca hyrëse), e cila, siç e shohim nga diagrami, mund të jetë nga 4 në 32 MHz. Mund të jetë një rezonator kuarci, një gjenerator i orës, e kështu me radhë.

HSI - Gjenerator i brendshëm me frekuencë të lartë. Në mikrokontrolluesit STM 32 F 3 është një qark RC me një frekuencë prej 8 MHz. Saktësia është shumë më e ulët se gjeneratori i jashtëm HSE.

Secili prej këtyre burimeve të orës mund të lidhet me PLL. Sidoqoftë, përpara se të futet në PLL, sinjali nga HSI do të reduktohet me një faktor prej 2. Sinjali HSE, nga ana tjetër, mund të aplikohet në PLL pa ndryshime, ose të reduktohet me një numër të caktuar herë, me kërkesë të përdoruesit.

PLL Ora - Sistemi i ciklit të kyçur në fazë (PLL). Ju lejon të shumëzoni sinjalin HSI ose HSE të hyrjes me numrin e kërkuar të herë.

Me PLL, sinjali mund të futet në autobusin e sistemit, frekuenca maksimale e të cilit është 72 MHz. Ose, sinjali HSE ose HSI mund të aplikohet drejtpërdrejt në autobusin e sistemit, pra pa konvertim PLL.

Ora e sistemit, SYSCLK, kontrollon të gjithë autobusët kryesorë të mikrokontrolluesit, përmes ndarësve përkatës, siç e shohim në diagramin e mësipërm. Vini re se shpejtësia maksimale e orës së disa autobusëve është nën SYSCLK. Prandaj, përpara se të aplikoni sinjalin e orës SYSCLK në autobus, duhet ta ndani atë me një ndarës të përshtatshëm. Nëse kjo nuk bëhet, mikrokontrolluesi do të ngrijë.

Për të rregulluar orën, mund të përdorni redaktimin manual të regjistrave ose të përdorni funksionet e bibliotekës. Ne do të përdorim bibliotekën.

Konfiguro bordin tonë të korrigjimit STM 32 F 3 Zbulimi për të punuar me një frekuencë të orës 72 MHz.

Le të krijojmë dhe vendosim një projekt në Keil uVision. .

Le të shtojmë kodin e mëposhtëm:

#include "stm32f30x_gpio.h" #include "stm32f30x_rcc.h" void InitRCC() ( RCC_HSEConfig(RCC_HSE_ON); //Aktivizo HSE while(RCC_GetFlagStatus(RCC_FLAG_HSERDY)/FLAGSE_HSERDY) =Blicit ->ACR |= FLASH_ACR_PRFTBE; FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); FLASH->ACR |= (uint32_t)((uint8_t)0x02); RCC_PREDIV1PRED1Config. = 1 RCC_PLLConfig(RCC_PLLSource_PREDIV1,RCC_PLLMul_9);//Cakto PREDIV1 si burim për PLL,Dhe cakto PLLMUL=9 RCC_PLLCmd(ENABLE);//Aktivizo PLL ndërsa(RCC_GetFlagStatus(RCC_FLAGIT=PRCC_FLAGS) RCC_SYSCLKSource_PLLCLK);//Cakto PLL si SYSCLK Soucre RCC_HSICmd(DISABLE);//Disable HSI ) int main(void) ( RCC_ClocksTypeDef RCC_Clocks; InitRCC(&); RCC_GetClocks (&) RCC_GetClocks (1) (1_CFlocks);

#include "stm32f30x_gpio.h"

#include "stm32f30x_rcc.h"

i pavlefshëm InitRCC()

RCC_HSEconfig(RCC_HSE_ON) ; //Aktivizo HSE

ndërsa (RCC_GetFlagStatus (RCC_FLAG_HSERDY) == RESET); //Në pritje të HSE

//Cakto vonesën e blicit

FLASH -> ACR |= FLASH_ACR_PRFTBE ;

FLASH -> ACR &= (uint32_t ) ((uint32_t ) ~ FLASH_ACR_LATENCY );

FLASH -> ACR |= (uint32_t ) ((uint8_t ) 0x02 );

RCC_PREDIV1Config (RCC_PREDIV1_Div1); //PREDIV 1 Ndarës = 1

RCC_PLLConfig(RCC_PLLSsource_PREDIV1, RCC_PLLMul_9); //Cakto PREDIV1 si burim për PLL,dhe vendos PLLMUL=9

RCC_PLLCmd(ENABLE) ; //Aktivizo PLL

ndërsa (RCC_GetFlagStatus (RCC_FLAG_PLLRDY) == RESET); //Në pritje të PLL

RCC_SYSCLKConfig(RCC_SYSCLKBurimi_PLLCLK) ; //Cakto PLL si SYSCLK Soucre

RCC_HSICmd(DISABLE) ; //Çaktivizo HSI

int main (void)

RCC_ClocksTypeDef RCC_Clocks ;

initRCC();

RCC_GetClocksFreq(&RCC_Clocks) ;

NOP () ;

ndërsa (1)

Në funksionin kryesor deklarohet struktura RCC _ ClocksTypeDef. Kjo strukturë përmban fusha që pasqyrojnë frekuencën aktuale të orës së pjesëve të caktuara të kontrolluesit.

Pastaj funksioni InitRCC thirret në funksionin kryesor, i cili vendos orën e kontrolluesit. Le ta shqyrtojmë më në detaje.

ekipi RCC _ HSEkonfig (RCC _ HSE _ AKTIV ), ne aktivizojmë HSE. Duhet kohë për ta aktivizuar, kështu që duhet të prisni derisa të vendoset flamuri RCC _ FLAMUR _ HSERDY . Ne e bëjmë atë në një lak derisa (RCC _ GetFlagStatus (RCC _ FLAMUR _ HSERDY ) == RISET ) .

Pastaj rregullojmë vonesën e blicit. Kjo duhet bërë kur përdorni autobusin e sistemit në frekuenca mbi 36 MHz!

Pas vendosjes së vonesës, zgjidhni parashkallëzuesin PLL. ekipi RCC _ PREDIV 1 Konfigurimi (RCC _ PREDIV 1_ Div 1) vendosim prescaler-in në 1. Me komandën RCC _ PLLConfig (RCC _ Burimi PLLS _ PREDIV 1, RCC _ PLLMul _9 ) zgjidhni HSE si burimin e frekuencës për PLL dhe zgjidhni një shumëzim prej 9. Mbetet vetëm për të ndezur PLL me komandën RCC _ PLLCmd (AKTIVE ), dhe prisni që të vendoset flamuri RCC _ FLAMUR _ PLLRDY, në ciklin while. Kështu, ne ofrojmë vonesën e nevojshme kohore për ndezjen e PLL. Pas kësaj, ne zgjedhim PLL si burim të frekuencës së sistemit SYSCLK me komandën RCC _ SYSCLKConfig (RCC _ Burimi SYSCLK _ PLLCLK ). Ne nuk do të prekim parakaluesit e autobusëve, kështu që autobusët AHB, APB 1, APB 2 do të funksionojnë në frekuencat përkatësisht 72.36 dhe 72 MHz.

Mbetet vetëm për të fikur zinxhirin e brendshëm RC me komandën RCC _ HSICmd (AKTIVIZOJ ).

Pas ekzekutimit të funksionit InitRCC, në ciklin kryesor të firmuerit, plotësoni strukturën RCC _ ClocksTypeDef, e cila do të na lejojë të dimë nëse e kemi konfiguruar saktë sistemin e orës. E bëjmë si ekip RCC_GetClocksFreq(&RCC_Clocks).

Ju mund të shikoni vlerat e orës së kontrolluesit në modalitetin e korrigjimit duke vendosur një pikë ndërprerjeje në komandë __ JO () që do të thotë komandë boshe. Kjo komandë shpesh shtohet për lehtësinë e korrigjimit.

Lidhja e bordit të korrigjimit STM32 F3 Zbulimi, montoni firmware-in, ndezni tabelën dhe në fund futeni në modalitetin e korrigjimit duke shtypur butonin Start / Stop debug sesion (Ctrl + F 5). Duke vendosur një pikë ndërprerjeje në një funksion __ JO, dhe duke shtuar strukturën RCC _Clocks në Watch, ne fillojmë ekzekutimin e firmuerit duke shtypur F 5. Si rezultat, shohim:

Frekuencat janë vendosur në mënyrë korrekte dhe mikrokontrolluesi tani funksionon në 72 MHz.

Pra, siç mësuat nga tutoriali i sotëm, sistemi i orës STM 32 është mjaft i fuqishëm dhe fleksibël për të përmbushur nevojat e projekteve tuaja. Duke marrë kohë për ta vendosur atë - do të arrini rezultate të shkëlqyera!

Faleminderit per vemendjen! Pyetjet tuaja si zakonisht në komente!

Çdo kopjim, riprodhim, citim i materialit ose pjesëve të tij, lejohet vetëm me pëlqimin me shkrim të administratës MKPROG .RU. Kopjimi, citimi, riprodhimi i paligjshëm dënohet me ligj!

Ky artikull, i cili është një tjetër "fillim i shpejtë" në zotërimin e kontrollorëve ARM, mund t'ju ndihmojë të hidhni hapat e parë në zotërimin e kontrollorëve ARM 32-bitësh bazuar në bërthamën Cortex-M3 - seritë STM32F1xxx. Ndoshta ky artikull (i cili shfaqet në këtë temë si kërpudhat pas shiut) do të jetë i dobishëm për dikë.

Prezantimi

Pse ARM?
1. Ka shumë për të zgjedhur (më shumë se 240 kontrollorë ARM prodhohen nga prodhues të ndryshëm sot)
2. Çmimi i ulët (për shembull, për 1$ mund të merrni 37xI/O, 16K Flash, 4K RAM, 2xUART, 10x12bitADC, 6x16bitPWM).

Dhe le të fillojmë punën tonë me kontrollorët ST Microelectronics. Kontrollorët e bazuar në bërthamën ARM Cortex-M3 karakterizohen nga një gamë e gjerë pajisjesh periferike, performancë të lartë, çmim të ulët
P.S. Që në fillim duket se ARM-të janë një lloj krijese e tmerrshme (në saldim, instalime elektrike, programim), por kjo është vetëm në shikim të parë :) dhe do ta shihni vetë.

Pra, ne do të studiojmë ARM-të duke përdorur kontrollorët STM32F1 si shembull. Në të njëjtën kohë, kjo seri ka disa rreshta:

  • Linja e vlerës STM32F100 - CPU 24 MHz, kontrolli i motorit, CEC.
  • Linja e hyrjes STM32F101 - CPU 36 MHz, deri në 1 MB Flash
  • Linja e hyrjes USB STM32F102 - CPU 48 MHz me USB FS
  • Linja e performancës STM32F103 - 72 MHz, deri në 1 MB Flash, kontrolli i motorit, USB, CAN
  • Linja e lidhjes STM32F105/107 - CPU 72 MHz, MAC Ethernet, CAN, USB 2.0 OTG

Ekziston edhe klasifikimi i mëposhtëm:

Kontrollorët STM32 mund të detyrohen të nisin nga 3 zona të memories (në varësi të gjendjes së kunjave BOOT0 dhe BOOT1 kur kontrolluesi fillon ose pasi rivendoset). Ju mund të shkruani një program në kujtesën e kontrolluesit në mënyrat e mëposhtme:

1 mënyrë:
Përdorimi i ngarkuesit (është i shkruar tashmë në kujtesën e sistemit) dhe USART1(USART2 remapeed): Përdor një orë të brendshme 8 MHz. Për të ekzekutuar ngarkuesin e integruar, të lidhur në kontrollues nga prodhuesi, mjafton vetëm të hidhni një sinjal nga konverteri RS232-3.3V (për shembull, bazuar në FT232RL) në këmbët e kontrolluesit TX1, RX1 dhe të vendosni BOOT0 = 1 dhe BOOT1 = 0 para kësaj, shtypni RESET dhe ne mund të qepim programin në kontrollues. Dhe është qepur në programin Flash Loader Demonstartor nga STM (për Windows).

PS. Nëse jeni duke ekzekutuar LINUX dhe nuk keni një tabelë korrigjimi të llojit zbulues, mund të ngarkoni firmuerin në kontrollues përmes rs-232 tuaj të preferuar (në fakt përmes konvertuesit rs-232-3.3V). Për ta bërë këtë, duhet të përdorni një skript python (Ivan A-R) (për LINUX ose MACOSX).
Për të filluar, duhet të keni të instaluar Python 2.6 dhe bibliotekën PySerial për të punuar me portën serike.
Tani, në mënyrë që të ekzekutoni skriptin stmloader.py (nga terminali, sigurisht), duhet ta rregulloni pak për kompjuterin tuaj: hapeni në një redaktues teksti.
Shkruajmë në vijën e komandës
~$dmesg | grep tty
për të parë të gjitha portet serike të PC.
dhe pas shtypjes...
~$ setserial -g /dev/ttyS
ne mësojmë rrugën për në portin tonë të 232-të. Nëse sistemi betohet në setserial, instalojeni atë
~$ sudo apt-get install setserial
ne zbulojmë rrugën drejt portit tonë fizik (për shembull, imi është /dev/ttyS0). Tani duhet të shkruani këtë shteg te skedari i skriptit stm32loader.py në vend të parazgjedhjes "/dev/tty.usbserial-...". Ne shkruajmë në terminal
~$ python stm32loader.py -h
...për të thirrur për ndihmë dhe për të ngarkuar firmuerin në kontrolluesin tonë.

2 mënyra:
Përmes USB OTG duke përdorur modalitetin DFU kërkon një kristal të jashtëm në 8 MHz, 14,7456 MHz ose 25 MHz (jo të gjithë kontrollorët me USB OTG e kanë këtë ngarkues, duhet të shikoni me kujdes etiketimin e kontrolluesit tuaj)

3 mënyra:
JTAG/SWD. Epo, për ata që kanë një tabelë demo të tipit Discovery ose një programues JTAG / SWD të bërë vetë, mund të ngarkoni kodin dhe tashmë të korrigjoni mikrokontrolluesin tuaj në këtë mënyrë. Për JTAG, mikrokontrolluesi ka 6 putra (TRST, TDI, TMS, TCK, TDO, RST) + 2 për fuqi. SWD përdor 4 sinjale (SWDIO, SWCLK SWO, RESET) dhe 2 për energji.

PS. Në mjedisin EAGLE, unë skicova disa plane për kontrollorët 48, 64 dhe 100 këmbë (dosja e shqiponjës) dhe stm32loader përmban skriptin stm32loader.py

Unë jam një tjetër i diplomuar në ndonjë universitet të Moskës (nuk do të specifikoj se cilin, por mediokër). Gjashtë muaj më parë na thanë se ishte koha për të shkruar një diplomë. Në atë kohë, unë sapo kisha filluar të zotëroja mikrokontrolluesit dhe nuk ishte aq e lehtë për mua, por me kërcitjen që prodhon frigoriferi kur ju vetëm përpiqeni ta lëvizni butësisht pa dëmtuar petëzimin e çmuar (në rastin tim, linoleumin) .

Trajnimi im filloi kur u interesova për temën e mikrokontrolluesve dy vjet më parë dhe inxhinieri që pyeti për ta më dha një pllakë 300x200 mm dhe tha që përmban një kontrollues STM32F217ZGT6 dhe kjo tabelë ka gjithçka që ju nevojitet për trajnim. "Në përgjithësi, nëse e zotëroni atë, gjithçka tjetër do të duket si mbeturina" (ai, megjithatë, nuk tha që për të ndezur LED-in, duhet të konfiguroni SPI, për të cilin në atë kohë as nuk kisha dëgjuar). Pas tre muajsh jo shumë intensive përpjekjesh eterike, duke kuptuar dobësinë e aftësive programuese dhe një numër të madh artikujsh të lexuar, më duhej të nisesha për STM32VLDISCOVERY dhe mënyrën e kopjimit të programeve dhe eksperimentimit me to, gjërat më në fund filluan, por ende ngadalë .

Për një vit e gjysmë arrita të punoja si zhvillues, kërkoja vende të lira pune ku ata punojnë me STM32 (pasi mendoj se tani këta janë mikrokontrolluesit më premtues të klasës së tyre), fitova përvojë dhe kur erdhi puna për diploma, m'u kujtua misri i lënduar. Ideja me temën erdhi menjëherë: "Bordi i korrigjimit në STM32 dhe kursi (i plotë) i trajnimit (për më të vegjlit) për të."

Prandaj desha të shkruaj një kurs të plotë dhe të plotë, që të mos e vuanin të tjerët dhe ta kuptoja vetë. Kështu që, pasi erdha në institut dhe kuptova se nevojitet një stimul për përvetësim dhe kuptim të shpejtë (ose më mirë, një majë kaq e mirë), fillova të rrah veten me thembër në gjoks (të gërmoj varrin tim), që do të jo vetëm të shkruaj një kurs trajnimi (në universitetin tonë më është dashur të thërras udhëzuesin e tij metodologjik), por gjithashtu do të siguroj një plan urbanistik. Tema u pranua, detyra u shkrua (gërmoi një varr, porositi një gur varri), i takonte të voglit, të shkruante dhe të zhvillonte gjithçka (të shtrihej në varr, të gërmonte dhe të vendoste një gur varri).

Jeta ka treguar që nuk kisha aspak gjashtë muaj, por e gjithë koha e caktuar për diplomën pothuajse kishte mbaruar, shumë shpejt mbrojtja, por çuditërisht, gjithçka është jo vetëm gati, por edhe pothuajse 100% e testuar (tek njerëzit e gjallë në përfshirë ).

Prodhimi është si më poshtë:

1. Vetë lënda (udhëzues metodologjik shkencor)

Me pak fjalë, mund të themi për të se për mendimin tim dhe sipas vlerësimeve të testuesve, është e plotë, por pak e ashpër dhe e pa finalizuar. Meqenëse vendosa që të mos shkruaj një libër për programimin C, prandaj nuk ka shpjegime të operatorëve në kurs, prandaj ata thanë se në disa vende kursi është i ashpër. Sa i përket moszhvillimit, do të jem i sinqertë, nuk arrita të korrigjoj gjithçka para dorëzimit, në mënyrë që të shkruaj për të jo vetëm këtu, por edhe në manualin metodologjik të dorëzimit. Unë gjithashtu mendoj se mund të jetë më mirë, por më shumë për këtë më vonë.

2. Bordi i korrigjimit të gabimeve në kontrolluesin STM32F103RET6

Këtu gjithçka është pak më mirë se në paragrafin e parë, bordi është projektuar, porositur (për rrethanat është dashur të porosis urgjentisht) në Rezonit, komponentët janë porositur, salduar me doreza (të them të drejtën, asnjë video nuk do të përcjellë ndjenjën i saldimit të parë LQFP64) dhe i testuar (shumica e tij funksionoi menjëherë). Por ky është një plan urbanistik dhe, natyrisht, nuk ishte pa mbivendosje: instalime elektrike, përshtatës dhe "paterica" ​​të tjera të ndryshme, por, për fat të keq, nuk do të kem kohë të porosis një rishikim të dytë, dhe ndoshta nuk do ta kisha për t'u mbrojtur një diplomë, jam i sigurt se mjafton. Pra, më poshtë do të flas më në detaje për këtë bord të korrigjimit.

Kur mora punën time të parë si dizajner elektronik, hasa në një mendim interesant dhe, siç doli, është mjaft i zakonshëm. Ky mendim dukej diçka si ky: "Këtu unë jam një programues dhe programoj mikrokontrolluesit, nuk di qarqe dhe nuk dua të di, meqë ra fjala, nuk di as të bashkoj." Pasi fola me një grup programuesish jashtë kompanisë, kuptova se personi nga puna ime nuk është aspak i vetëm për mendimin e tij, dhe megjithëse nuk e mbështes atë, ia vlen të kuptosh dhe respektosh mendimet e të tjerëve, aq më tepër. përshtaten në mënyrë të përkryer në konceptin e atëhershëm të tabelës së korrigjimit "çdo gjë në bord". Në këtë drejtim, bordi doli të ishte mjaft "i trashë", u quajt STM32SB (SB-StudyBoard) V1.0b. Le të hedhim një vështrim në atë që përfshihet më poshtë.

1. Mikrokontrollues
Bazuar në faktin se kam punuar me mikrokontrolluesin STM32F103RET6, ai u zgjodh për projektin.

2. Qarku i furnizimit me energji elektrike dhe kontrolluesi USB i harduerit
Ky mikrokontrollues ka një USB të integruar, të cilin u vendos ta sillte në një lidhës të veçantë.

3. Folës
U vendos që të prezantohej modulimi PWM për zotërimin dhe mësimin e shkrimit të melodive.

4. Treguesi dixhital dhe rezistenca e zhvendosjes
Për zhvillimin e njëkohshëm të treguesit dinamik dhe regjistrit të zhvendosjes, u vendos që të kombinohen ato.

5. LED
LED, çfarë mund të jetë më mirë? Vetëm LED me tre ngjyra, në të cilat mund të zotëroni ndryshimin e qetë të ngjyrave.

6. Ekran LCD
Ekran standard LCD me 2 rreshta me 16 karaktere për zotërimin e ndërfaqes paralele.

7. Tastierë
Tastierë matricë, ju duhet të dini dhe të jeni në gjendje.

8. Zgjeruesi i portit I/O
Nuk ka shumë porte I/O, por këtu mund të zotëroni edhe I2C.

9. Termometri elektronik
1-Sensori i temperaturës së telit, një gjë e dobishme dhe përvojë e vlefshme me të mund të vijnë në ndihmë.

10. Potenciometër elektronik
Në këtë gjë të vogël, ju mund të zotëroni një SPI të plotë dhe të përpiqeni të matni ndryshimet e tensionit përmes ADC.

11. Stafetë
Edhe pse është në nivelin e ndezjes së një LED, është ende mirë të dëgjosh një klikim të njohur, apo jo?

12. Tranzistorë kyç
Gjithashtu në nivelin e ndezjes së një LED, por papritmas dikush nuk e kupton parimin.

13. Dyfishimi i kunjave të lira në kunjat e jashtme
Epo, ky është një dizajn natyral për çdo tabelë korrigjimi, papritmas gjithçka që ishte në të nuk ishte e dobishme për askënd, por ju ende duhet të lidhni diçka tuajën.

14. Konvertuesi WIFI-UART (esp8266)
Në qark, konverteri merr pjesë si lidhës, tregohet gjithashtu këtu. Është përdorur moduli tashmë mjaft i bujshëm esp8266.

15. Konvertuesi USB në UART
USB është gjithmonë i lezetshëm, këtu përdoret çipi CP2102.

16. JTAG dhe SWD
Epo, ku pa këto gjëra.

Një gamë kaq e gjerë pajisjesh të jashtme do të bëjë të mundur zotërimin e shumicës së truket dhe përpjekjen për të punuar me shumicën e ndërfaqeve pa u shqetësuar me blerjen e elementeve dhe pa u larguar nga tabela, gjë që është në përputhje me konceptin jo vetëm "të gjitha në bord". ", por edhe "për më të vegjlit" (ata që nuk mund të bashkojnë).

Sigurisht, kishte disa mbivendosje, por, siç thotë një mik inxhinier, "aftësia e një inxhinieri matet në numrin e gjurmëve të prera në përsëritjen e parë të tabelës".

Këtu është një listë e "jambeve" të mia, ato që nuk vura re, harrova ose as nuk e dija kur zhvilloja këtë tabelë:

1. Kuptova që kunjat SWD janë të vendosura në një mënyrë të çuditshme, dhe të paktën kjo nuk ndërhyn në funksionimin e bordit. Kam dëgjuar, për mendimin tim, mendimin e saktë që ato duhet të vendosen pasi ndodhen në STM32VLDISCOVERY për të shmangur keqkuptimet me një përdorues të ri.

2. Nuk ia vlen të lidhni LED me një ngjyrë, si në këtë tabelë, për faktin se për t'i ndezur ato, duhet të rimaponi JTAG, por mora një efekt të papritur duke treguar procesin e ngarkimit të firmuerit.

3. Dizenjova logon time për këtë tabelë, të cilën doja ta përkthej në PCB dhe ta vendosja në tabelë, por e harrova.

4. Për të kursyer hapësirë ​​në rishikimin e dytë të tabelës, do të vendosja disa komponentë SMD të papërdorura në anën e poshtme të tabelës.

5. Kuptova se për një instalim më të përshtatshëm të qarqeve me rezonatorë kuarci, do të ishte e përshtatshme t'i zëvendësonim me SMD.

6. Kam harruar të nënshkruaj ku janë JTAG dhe SWD, ata gjithashtu nuk tregojnë se si t'i lidhin ato, dhe nëse gjithçka nuk është aq e vështirë për JTAG dhe lidhësin e tij BH-20, atëherë situata me SWD është disi më e rrezikshme.

7. Gjatë zhvillimit të gjurmës LCD, ndodhi një incident dhe vrimat rezultuan të ishin shumë të vogla për bulonat M3.

8. Konvertuesi CP2102 ka kunjat RX dhe TX të kthyera. Meqenëse jam mësuar me faktin që dokumentacioni ofron një shembull të lidhjes në lidhje me mikrokontrolluesin, dhe jo një pajisje të jashtme, më duhej të prisja 2 gjurmë.

9. Në këtë tabelë, distanca midis krehrave të terminalit nuk është e standardizuar në inç, dhe për këtë arsye ka një problem për t'u lidhur me një tabelë prototipi pa saldim duke u ngjitur në të.

10. Doli një mbivendosje me rezistorë kufizues të rrymës në qarkun e treguesit të stafetës, vlera doli të ishte shumë e lartë që rele të kalonte.

11. Epo, si zakonisht, "një mendim i mirë vjen pas". Kështu që, pasi mora tabelën, kuptova se ia vlente ta bëja madhësinë e saj të përshtatshme për të paktën disa raste - me sa duket do të duhet të finalizohet në rishikimin e dytë.

12. Fillimisht, u vendos një tregues i vogël dixhital, pasi zinte një zonë të vogël dhe ishte në dispozicion në dyqane, por doli që në fakt është i disponueshëm kudo kur porosisja nga 520 copë, kështu që më duhej të skali një përshtatës për një standard. tregues dixhital.

Së fundi, unë do t'ju tregoj një model 3D të këtij bordi:

Dhe për të krahasuar foton e saj, si doli "live", pamje e parë:

Dhe një pamje anësore, kështu që mund të shihni më shumë "paterica":

Na vjen keq, por nuk do të doja të parashtroja të gjithë projektin përpara se të kaloja diplomën, por pas kësaj pune, kisha një pyetje, a ia vlen të zhvillohet ky projekt? Më lindi ideja për të shkruar një seri artikujsh mbi trajnimin, ku do të prezantohej një kurs i tillë i plotë në këtë tabelë korrigjimi, ku gjithçka shkruhet me fjalë të thjeshta dhe shpjegohet në gishta. Do të doja të dëgjoja nga ju në komente se sa e dobishme dhe e nevojshme do të ishte në kohën e tanishme.

Faleminderit per vemendjen!

Artikujt kryesorë të lidhur