Viimastel aastatel on elektroonikamaailma kiiresti vallutamas ARM-protsessoritel põhinevad 32-bitised mikrokontrollerid (MC). See läbimurre on tingitud nende suurest jõudlusest, täiuslikust arhitektuurist, madalast energiatarbimisest, madalatest kuludest ja täiustatud programmeerimistööriistadest.
NOVELL
Nimi ARM on akronüüm sõnadest Advanced RISC Machines, kus RISC tähistab lühendatud juhiste komplekti arvuti arhitektuuri. Valdav enamus populaarsetest MK-dest ja näiteks PIC- ja AVR-perekondadest omavad ka RISC-arhitektuuri, mis võimaldas jõudlust suurendada, lihtsustades käskude dekodeerimist ja kiirendades nende täitmist. Täiustatud ja tootlike 32-bitiste ARM-mikrokontrollerite tulek võimaldab teil liikuda lahenduse juurde väljakutseid pakkuvad ülesanded, millega 8- ja 16-bitised MK-d enam hakkama ei saa. 32-bitise tuuma ja RISC-juhiste komplektiga ARM-i mikroprotsessori arhitektuuri töötas välja Briti ettevõte ARM Ltd, mis tegeleb eranditult tuumade, kompilaatorite ja silumistööriistade arendamisega. Ettevõte MK-d ei tooda, vaid müüb nende tootmiseks litsentse. MK ARM on MK turu üks kiiremini kasvavaid segmente. Need seadmed kasutavad energiasäästlikke tehnoloogiaid, seetõttu kasutatakse neid laialdaselt manussüsteemides ja domineerivad mobiilseadmete turul, mille jaoks on oluline madal energiatarve. Lisaks kasutatakse ARM-i mikrokontrollereid aktiivselt side-, kaasaskantavates ja sisseehitatud seadmetes, kus on vaja suurt jõudlust. ARM-i arhitektuuri tunnuseks on protsessori arvutustuum, mis pole sellega varustatud täiendavad elemendid. Iga protsessori disainer peab selle tuuma iseseisvalt varustama vajalikud plokid nende all konkreetsed ülesanded. See lähenemine on end hästi tõestanud suurte kiibitootjate jaoks, kuigi algselt keskenduti klassikalistele protsessorilahendustele. ARM-protsessorid on juba läbinud mitu arenguetappi ja on hästi tuntud ARM7, ARM9, ARM11 ja Cortexi perekondadest. Viimane jaguneb klassikaliste CortexA protsessorite, CortexR reaalajaprotsessorite ja CortexM mikroprotsessori tuumade alamperekondadeks. Just CortexM-i tuumad said suure 32-bitiste MCU-de klassi arendamise aluseks. Need erinevad teistest Cortexi arhitektuuri variantidest peamiselt 16-bitise Thumb2 käsukomplekti kasutamise poolest. See komplekt ühendas "klassikaliste" ARM ja Thumb juhiste jõudluse ja kompaktsuse ning töötati välja spetsiaalselt C ja C ++ keeltega töötamiseks, mis parandab oluliselt koodi kvaliteeti. CortexM-i tuumale ehitatud MC-de suureks eeliseks on nende tarkvaraline ühilduvus, mis teoreetiliselt võimaldab programmikoodi kasutada keeles kõrge tase erinevate tootjate mudelid. Lisaks tuuma ulatuse määramisele näitavad MK arendajad CortexM-i tuuma jõudlust kümne palli skaala. Praeguseks on kõige populaarsemad valikud CortexM3 ja CortexM4. ARM-arhitektuuriga MC-sid toodavad sellised ettevõtted nagu Analog Devices, Atmel, Xilinx, Altera, Cirrus Logic, Intel, Marvell, NXP, STMicroelectronics, Samsung, LG, MediaTek, MStar, Qualcomm, SonyEricsson, Texas Instruments, nVidia, Freescale, Milandr, HiSilicon ja teised.
Tänu optimeeritud arhitektuurile on CortexM-i tuumal põhinevate MCU-de maksumus mõnel juhul isegi madalam kui paljudel 8-bitistel seadmetel. "Nooremaid" mudeleid saab praegu osta 30 rubla eest. kehale, mis loob konkurentsi eelmiste põlvkondade MK-le. STM32 MIKROKONTROLLERID Mõelge STM32F100 perekonna kõige soodsamale ja levinumale MK-le ettevõttelt STMicroelectronics, mis on üks maailma juhtivaid MK-tootjaid. Ettevõte teatas hiljuti 32-bitise MK tootmise alustamisest, kasutades ära tööstuslikku
STM32 südamikud madalate kuludega rakendustes. STM32F100 Value line MCU-d on mõeldud seadmetele, kus 16-bitiste MCU-de jõudlusest ei piisa ning “tavaliste” 32-bitiste seadmete rikkalik funktsionaalsus on üleliigne. STM32F100 MCU-de sari põhineb tipptasemel ARM CortexM3 tuumal koos välisseadmetega, mis on optimeeritud kasutamiseks tüüpilistes rakendustes, kus kasutati 16-bitisi MCU-sid. STM32F100 MCU jõudlus 24 MHz juures on parem kui enamikul 16-bitistel MCU-del. See valik hõlmab seadmeid, millel on erinevaid parameetreid:
● 16–128 kb programmi välkmälu;
● 4–8 kb RAM-i;
● kuni 80 GPIO sisend/väljundporti;
● kuni üheksa täiustatud funktsioonidega 16-bitist taimerit;
● kaks valvekoera taimerit;
● 16-kanaliline kiire 12-bitine ADC;
● kaks 12-bitist DAC-i sisseehitatud signaaligeneraatoritega;
● kuni kolm UART-liidest, mis toetavad IrDA, LIN ja ISO7816 režiime;
● kuni kaks SPI-liidest;
● kuni kaks SMBus ja PMBus režiimi toetavat I2C liidest;
● 7-kanaliline otsejuurdepääsu blokk mälule (DMA);
● HDMI standardis sisalduv CEC (Consumer Electronics Control) liides;
● reaalajakell (RTC);
● NVIC-pesastatud katkestuste kontroller.
STM32F100 funktsionaalne skeem on näidatud joonisel 1.
Riis. 1. STM32F100 liini MK arhitektuur
Täiendavaks mugavuseks on seadmete ühilduvus kontaktide abil, mis võimaldab vajadusel kasutada mis tahes suurema funktsionaalsuse ja mäluga perekonna MK-d ilma trükkplaati töötlemata. Kontrolleri sari STM32F100 on toodetud aastal kolme tüüpi LQFP48, LQFP64 ja LQFP100 paketid vastavalt 48, 64 ja 100 kontaktiga. Tihvtide otstarve on näidatud joonistel 2, 3 ja 4. Selliseid korpuseid saab paigaldada trükkplaatidele ilma eriseadmeid kasutamata, mis on väiketootmise puhul oluline tegur.
Riis. Joonis 2. MK STM32 LQFP48 pakendis 3. MK STM32 LQFP64 pakendis
Riis. 4. MK STM32 LQFP100 pakendis
STM32F100 on CortexM3 tuumal põhinev taskukohane ja optimeeritud seade, mida toetab täiustatud arenduskeskkond STM32 perekonna MCU-de jaoks, mis sisaldab
tasuta raamatukogud kõigile välisseadmetele, sealhulgas mootori juhtimine ja puutetundlikud klaviatuurid.
KÜHENDUSskeem STM32F100C4
Mõelge MK praktilisele kasutamisele, kasutades näitena kõige lihtsamat seadet STM32F100C4, mis sellegipoolest sisaldab kõiki STM32F100 rea põhiplokke. STM32F100C4 sisselülitamise skemaatiline diagramm on näidatud joonisel 5.
Riis. 5. MK STM32F100C4 sisselülitamise skeem
Kondensaator C1 tagab MK lähtestamise, kui toide on sisse lülitatud, ja kondensaatorid C2-C6 filtreerivad toitepinget. Takistid R1 ja R2 piiravad MK-väljundite signaalivoolu. Kella allikana kasutatakse sisemist ostsillaatorit, seega pole välist kristallostsillaatorit vaja kasutada.
BOOT0 ja BOOT1 sisendid võimaldavad teil vastavalt tabelile valida MK laadimise meetodi, kui toide on sisse lülitatud. BOOT0 sisend on ühendatud nullpotentsiaali siiniga läbi takisti R2, mis hoiab ära BOOT0 viigu lühise, kui seda kasutatakse PB2 väljundpordina. Pistiku J1 ja ühe hüppaja abil saate muuta BOOT0-sisendi potentsiaali, määrates sellega, kuidas MK laaditakse - välkmälust või sisseehitatud alglaadurist. Kui on vaja MK-d RAM-ist laadida, saab BOOT1 sisendiga ühendada sarnase hüppajaga pistiku.
MK programmeerimine toimub UART1 jadapordi või spetsiaalsete programmeerijate - JTAG või STLinki silurite kaudu. Viimane on osa populaarsest silumisseadmest STM32VLDISCOVERY, mis on näidatud joonisel 6. STM32VLDIS COVERY plaadil on STLinki programmeerija 4-kontaktiline pistik tähistatud SWD-ga. Artikli autor soovitab MK programmeerida UART1 jadapordi kaudu, kuna see on palju lihtsam, ei vaja erivarustust ega jää kiiruselt alla JTAG-ile või ST Linkile. Juhtseadmena, mis on võimeline genereerima käske ja kuvama MK-programmi tulemusi, samuti programmeerijana saate kasutada mis tahes Personaalarvuti(PC), millel on jada-COM-port või USB-port koos USBRS232-muunduriga.
PC COM-pordi sidumiseks MC-ga sobivad kõik RS232-signaalide muundurid loogikasignaalide tasemele 0–3,3 V, näiteks ADM3232 kiip. Arvuti jadapordi TXD ülekandeliin pärast tasememuundurit tuleb ühendada mikrokontrolleri PA10 sisendiga ja RXD vastuvõtja liin läbi sarnase muunduri PA9 väljundiga.
Kui on vaja kasutada mittelenduvat MK-kella, tuleks sellega ühendada CR2032 tüüpi patarei pingega 3 V ja kvartsresonaator sagedusel 32768 Hz. Selleks on MK varustatud Vbat / GND ja OSC32_IN / OSC32_OUT kontaktidega. Esmalt tuleb Vbat väljund 3,3 V toiteliini küljest lahti ühendada.
Ülejäänud vabasid MK järeldusi saab kasutada vastavalt vajadusele. Selleks tuleks need ühendada pistikutega, mis asuvad MK trükkplaadi perimeetri ümber, analoogselt populaarsete Arduino seadmete ja silumisplaadiga STM32VLDISCOVERY.
Riis. 6. STM32VLDISCOVERY silur
Elektriskeem STM32VLDISCOVERY.
Seega olenevalt MC kasutuse eesmärgist ja meetodist on võimalik sellega ühendada vajalikud elemendid, et kasutada muid funktsionaalplokke ja porte, näiteks ADC, DAC, SPI, I2C jne. Järgnevalt käsitletakse neid seadmeid üksikasjalikumalt.
PROGRAMMEERIMINE
Tänapäeval pakuvad paljud ettevõtted tööriistu STM32 mikrokontrolleri programmide loomiseks ja silumiseks. Nende hulka kuuluvad Keil by ARM Ltd, IAR Embedded Workbench for ARM, Atol lic TrueStudio, CooCox IDE, GCC ja Eclipse IDE. Arendaja saab valida enda valitud tarkvara. Allpool kirjeldatakse Keil ettevõtte Keil uVision 4 tööriistakomplekti, mis toetab tohutul hulgal mikrokontrollerite tüüpe, millel on välja töötatud silumistööriistade süsteem ja mida saab tasuta kasutada genereeritud koodi suuruse piiranguga 32 kb (mis, tegelikult on vaadeldavate mikrokontrollerite maksimum).
lihtne ja kiire algus CooCox CoIDE-ga.
Nii et alustame. Minge CooCoxi ametlikule veebisaidile ja laadige alla CooCox CoIDE uusim versioon. Allalaadimiseks peate registreeruma, registreerimine on lihtne ja tasuta. Seejärel installige allalaaditud fail ja käivitage.
CooCox CoIDE- Eclipse'il põhinev arenduskeskkond, mis lisaks STM32-le toetab ka hunnikut teisi mikrokontrollerite perekondi: Freescale, Holtek, NXP, Nuvoton, TI, Atmel SAM, Energy Micro jne. uus versioon MK CoIDE nimekirja uuendatakse pidevalt. Pärast CoIDE edukat installimist käivitage:
Ilmub Step 1 stardiaken, kus peate valima meie mikrokontrolleri tootja. Vajutage ST ja minge 2. sammu juurde (mikrokontrolleri valik), mille käigus peate valima konkreetse mudeli. Meil on STM32F100RBT6B, nii et klõpsake sobival mudelil:
Parempoolses aknas Abi kuvatakse iga kiibi lühiomadused. Pärast vajaliku mikrokontrolleri valimist jätkame 3. sammu kolmanda sammuga - tööks vajalike teekide valimiseks:
Loome lihtsa projekti LED-i vilkumiseks, nagu mikrokontrollerite uurimisel kombeks.
Selleks vajame GPIO teeki, kui see on lubatud, palub CoIDE teil luua uus projekt. Sellel ettepanekul klõpsake nuppu Jah, määrake kaust, kuhu meie projekt salvestatakse, ja selle nimi. Samal ajal ühendab CoIDE projektiga veel 3 raamatukogu tööks vajalikku teeki ning loob ka kogu vajaliku projektistruktuuri:
Teine hea asi CoIDE juures on see, et sellel on võimalus näiteid otse arenduskeskkonda üles laadida. Vahekaardil Komponendid näete, et peaaegu iga teegi jaoks on näiteid, klõpsake GPIO-l (4 näitega) ja vaadake neid:
Saate sinna lisada oma näiteid. Nagu näete ülaltoodud ekraanipildil, on GPIO_Blink LED-i vilkumise kood näidetes juba olemas. Võite klõpsata lisamisnupul ja see lisatakse projekti, kuid kaasasoleva failina, seega teeme seda erinevalt, lihtsalt kopeerige kogu näidiskood faili main.c. Ainus asi on asendada tühine GPIO_Blink(void) rida int main(void). Niisiis, me vajutame F7 (või valime menüüst Project-> Build), et projekt koostada ja ... seda polnud!
Keskkond vajab GCC kompilaatorit ja meil seda pole. Seetõttu läheme lehele GNU Tools for ARM Embedded Processors, valime paremalt teie operatsioonisüsteemi tüübi ja laadime alla tööriistaahela uusima versiooni. Seejärel käivitame faili ja installime gcc tööriistaahela. Järgmisena määrake CoIDE seadetes tööriistaahela õige tee:
Vajutage uuesti F7 (Project->Build) ja vaadake, kas kompileerimine õnnestus:
Jääb üle mikrokontrolleri vilkuma. Selleks ühendame oma tahvli USB abil arvutiga. Seejärel tuleb siluri seadetes panna ST-Linki, selleks vali menüüst Projekt-> Konfiguratsioon ja ava vahekaart Silur. Valige rippmenüüst ST-Link ja sulgege aken:
Proovime MK-d välgutada. Valige menüüst Flash-> Programmi allalaadimine (või klõpsake tööriistaribal vastavat ikooni) ja vaadake, et MK on edukalt vilkunud:
Jälgime tahvlil vilkuvat LED-i, ma arvan, et pole mõtet videot ega fotot anda, sest kõik nägid seda.
Samuti töötavad CoIDE-s erinevad silumisrežiimid, selleks vajutame klahvikombinatsiooni CTRL + F5 (või menüüs Silumine-> Silumine):
See on kõik. Nagu näete, on CoIDE seadistamine ja sellega töötamine väga lihtne. Loodan, et see artikkel julgustab teid uurima väga paljutõotavaid ja odavaid STM32 mikrokontrollereid.
Ootan kõiki programmeerimise, mikrokontrollerite ja üldiselt elektroonika austajaid meie veebisaidil! Selles artiklis räägin veidi sellest, mida me siin tegema hakkame, nimelt ARM-i mikrokontrollerite koolituskursusest.
Nii et kõigepealt selgitame välja, mida peate teadma ja suutma alustada ARM-ide õppimist. Ja põhimõtteliselt ei midagi ülikeerulist ja lummavat 😉 ARM-kontrolleritele minnakse loomulikult üle pärast piisavat PIC-ide ja AVR-idega mängimist ehk enamus on kogenud arendajad. Kuid püüan kirjeldada kõike, mida analüüsime kõige üksikasjalikumalt ja arusaadavamal viisil, et need, kes otsustasid esmakordselt mikrokontrollerite programmeerimisel kätt proovida, saaksid materjalist hõlpsasti aru. Muide, kui teil on küsimusi või lihtsalt midagi ei tööta nii, nagu ette nähtud, kirjutage kommentaaridesse, proovin selle välja mõelda ja aidata.
Liigume nüüd tehniliste küsimuste juurde) Olen mitu korda juba maininud nime "ARM Training Course", kuid üldiselt pole see täiesti tõsi. Sellist asja nagu ARM mikrokontroller pole olemas. Seal on südamikuga (!) ARM-iga kontroller ja see, näete, pole ikka sama asi. Nii et selliseid seadmeid toodavad mitmed ettevõtted, mille hulgas paistavad silma STMicroelectronics ja NXP Semiconductors. Sellest lähtuvalt vabastavad nad STM- ja LPC-kontrollerid. Valisin STM32 kasuks, need meeldisid mulle lihtsalt rohkem =) STM on väga kütkestav, et olles tegelenud mis tahes STM32F10x liini MK-ga, siis ühegi teisega probleeme ei teki. Üks joonlaud - üks andmeleht. Muide, STM32 kontrolleritega on tohutul hulgal nii kalleid kui ka mitte väga kalleid silumisplaate, mis on väga meeldiv, kuigi esialgu silume oma programme simulaatoris, et enne riistvara ostmist kontrolleri võimalusi hinnata. . Siin on igaks juhuks STMicroelectronicsi ametlik veebisait -.
Kuidagi sujuvalt lahkusime koostaja teemast, nii et räägin sellest paar sõna. Ilma kaks korda mõtlemata valisin Keili, seda ka võimsa sisseehitatud simulaatori tõttu. Seal saab vaadata UART-i ja igast registrist ja isegi loogikaanalüsaator on olemas. Ühesõnaga, Keil jättis mulle enamasti vaid meeldivad muljed, kuigi miinuseid on muidugi ka, aga mitte katastroofilisi. Nii saate Keil uvision4 turvaliselt alla laadida. sait (). Tõsi, on üks AGA - IDE on tasuline, kuid saadaval on demorežiim koodipiiranguga 32kB, mis on meile seni enam kui piisav. Kellele sellest väheks jääb, siis Keil on tohutult pragusid 😉 Kõik on ilma probleemideta paigaldatud - paar korda torkame edasi ja kõik on ideaalselt seadistatud ja töötab ilma lisatantsudeta tamburiiniga.
Tegelikult on see kõik, mida ma tahtsin siin öelda, on aeg liikuda sõnadelt tegudele, kuid see on juba järgmises artiklis. Õpime STM32 mikrokontrollerite programmeerimist nullist!
See artikkel on esimene kavandatavast artiklite sarjast, mis käsitleb mikrokontrollerite programmeerimise uurimist. Erinevaid materjale uurides märkasin, et peaaegu kõik saavad alguse sellest, et algaja kutsutakse välisseadmetega töötamiseks alla laadima (või kasutama arenduskeskkonnaga kaasasolevat teeki) ja kasutama seda oma esimese programmi kirjutamiseks (tavaliselt vilkudes). LED).
See üllatas mind tõesti. Nende artiklite kohaselt pole programmeerimine vajalik isegi programmeeritava kontrolleri dokumentatsiooni lugemiseks. Mulle õpetati tarkust "riistvara programmeerimine" täiesti erinev.
Selles artiklis on tee lausest "Jah, ma tahan proovida!" kuni LED-i rõõmsa pilgutamiseni on teiste autorite omast palju pikem. Püüan paljastada mikrokontrollerite programmeerimise aspekte, mis peituvad raamatukogu funktsioonide kasutamise ja valmisnäidete taga.
Kui kavatsete tõsiselt uurida mikrokontrolleri programmeerimist, on see artikkel teie jaoks. Võib-olla võib see huvi pakkuda ka neile, kes on Arduinoga piisavalt mänginud ja tahavad raudselt kõiki riistvaralisi võimalusi käsile võtta.
Eeldame, et oleme välja mõelnud mikrokontrolleri tüübi. Kuid turul on suur valik erinevaid modifikatsioone erinevatelt tootjatelt. Need erinevad mitmel viisil, alates välkmälu suurusest kuni analoogsisendite arvuni. Iga ülesande puhul tuleks valik teha individuaalselt. Siin ei ole üldisi soovitusi ega saa olla. Märgin vaid, et uuringut tasub alustada võimalikult suure valikuga MK tootjatega. Siis, kui valite MC jaoks konkreetne ülesanne on suur võimalus, et midagi pakutavast sortimendist teile sobib.
Mina valisin STM32(kuigi ma arvan, et parem on alustada MK-ga Texas Instrumentsist - dokumentatsioon on väga hästi kirjutatud), sest need on vene elektroonika arendajate seas laialt levinud. Kui teil on probleeme või küsimusi, saate foorumitest hõlpsasti lahendusi leida. Teine pluss on rikkalik demoplaatide valik nii tootjatelt kui ka kolmandatelt osapooltelt.
Ise kasutan demoplaati STM3220G-EVAL ja programmeerija J-Link PRO. Alustuseks aga piisab STM32F4DISCOVERY, mida saab ilma probleemideta osta väikese summa eest.
Kõik näited on silumisplaadi jaoks STM32F4DISCOVERY. Praegusel etapil pole meie jaoks üldse oluline, et sellel plaadil on Cortex-M4 tuumal põhinev MK. Lähitulevikus me selle funktsioone ja eeliseid Cortex-M3 ees ei kasuta. Ja kuidas edasi saab - eks me näe.
Kui teil on mõni muu STM32F2xx/STM32F4xx põhinev plaat, saate sellega töötada. Materjali esitlusel püüan kirjeldada võimalikult detailselt. miks me teeme seda nii ja mitte teisiti. Loodan, et kellelgi ei teki probleeme näidete teisaldamisega muule riistvarale.
Miks tasuline arenduskeskkond?
Võib-olla pole keegi täiesti rahul sellega, et soovitan kasutada tasulist arenduskeskkonda, kuid IAR-is on võimalus hankida ajutine litsents ilma funktsionaalsete piiranguteta või piiramatu litsents koodi suuruse piiranguga (32KB MK jaoks on palju).
Lisaks märgin kohe ära, et mõne MK jaoks pole tasuta arenduskeskkondi. Ja kahjuks on need MK-d mõnes valdkonnas asendamatud.
Näeme tühja projekti koos põhifailiga.
Nüüd peate projekti seadistama, et alustada tööd "meie" MK ja siluriga. MK paigaldatud STM32F4DISCOVERY plaadile STM32F407VG. See tuleb valida projekti atribuutides (Üldised suvandid->Siht->Seade):
Sihtprogrammeeritava protsessori valimisel laaditakse selle kirjeldus, mis pakub palju võimalusi silumiseks (seda käsitletakse allpool). Lisaks lisatakse automaatselt konfiguratsioonifail, mis kirjeldab linkeri jaoks saadaolevat aadressiruumi. Vajadusel puudutame linkeri konfiguratsioonifaili teemat järgmistes artiklites.
Pärast seda peate konfigureerima siluri. Programmi silumine toimub otse "riistvaras". Seda tehakse JTAG siluri abil. Lisateavet selle kohta, kuidas see juhtub, saate Wikipediast. ST-LINK/V2 silur on integreeritud STM32F4DISCOVERY plaadile. Siluriga töötamiseks peate menüüst valima selle draiveri Silur-> Seadistamine-> Draiver. Samuti on vaja märkida, et silumine peaks toimuma otse riistvaras. Selleks seadke lipp Siluja->Laadi alla->Kasuta flash-laadurit
Neile, kes nägid sõna Simulaator
Teoreetiliselt võimaldab IAR simulaatori abil programme siluda. Kuid ma pole seda kunagi praktikas kasutanud.
Nüüd on projekt tööks valmis (programmeerimine, valamine ja silumine).
Ärgem kaldugem klassikast kõrvale. Esimene projekt on vilkuv LED. Õnneks on neid laual palju Mida see programmeerimise mõttes tähendab? Esimene samm on tutvuda demoplaadi skeemiga ja mõista, kuidas LED "käivitub".
saadaval tootja veebisaidil. Selles kirjelduses on isegi eraldi jaotis tahvli LED-ide kohta - 4,4 LED-i. Näiteks kasutame Kasutaja LD3. Leiame selle diagrammil:
Ahela lihtsaim analüüs viitab sellele, et LED-i "süttimiseks" on vaja MK-tihvti rakendada "1" (mis selle MK jaoks vastab 3,3 V). Väljalülitamine toimub, lisades sellele kontaktile "0". Diagrammil on see tihvt näidatud PD13(see on ilmselt kõige rohkem oluline teave sellest dokumendist).
Selle tulemusena saame oma esimese programmi jaoks kirjutada "TOR":
MK programm peaks teatud inimsilma jaoks eristatava perioodilisusega üle kandma MK PD13 viigu oleku olekust "0" olekusse "1" ja vastupidi (oluline märkus, kui vilgutate ka LED-i sageli ei pruugi silm seda eristada).
Alustame sellest, et iga MK sisaldab südamikku, mälu ja välisseadmeid. Arvan, et mäluga on kõik selge. Mainin vaid ära, et STM32-l on välkmälu, kuhu on salvestatud MK programm (üldjuhul pole see tõene väide, programmi saab salvestada välisesse püsimällu, aga praegu jätame selle ära ) ja muud andmed, sealhulgas kasutajaandmed. Samuti on olemas SRAM - muutmälu.
Tuum on mikrokontrolleri osa, mis täidab ühte käsuvoogu. Meie MK-s on südamiku tüüp Cortex-M4. MK-tuuma saab võrrelda arvuti protsessoriga. See suudab täita ainult käske ja edastada andmeid teistele plokkidele (see võrdlus ei võta arvesse integreeritud graafikakiirendiga protsessoreid).
Samal ajal ei arenda MK tootja tuuma. Tuum ostetakse ettevõttelt ARM Limited. Peamine erinevus erinevate MK-de vahel on perifeerias.
Välisplokid - plokid, mis suhtlevad "välismaailmaga" või täidavad spetsiifilisi funktsioone, mis pole MK tuumale kättesaadavad. Kaasaegsed MK-d (sh STM32) sisaldavad tohutul hulgal välisseadmeid. Välisseadmete plokid on mõeldud erinevate probleemide lahendamiseks alates pinge väärtuse lugemisest MK analoogsisendist kuni andmete edastamiseni välisseadmetesse SPI siini kaudu.
Erinevalt MK tuumast ei täida välisseadmed käske. Nad täidavad ainult kerneli käske. Sel juhul ei ole kerneli osalemine käsu täitmisel vajalik.
Näide
Näiteks on UART-plokk, mis on mõeldud andmete vastuvõtmiseks ja edastamiseks MK-st välisseadmetesse. Kernelist on vaja ainult plokk konfigureerida ja anda sellele edastamiseks andmed. Pärast seda saab kernel jätkata juhiste täitmist. Välisseadme õlgadel lasub MK vastava väljundi juhtimine andmeedastuseks vastavalt protokollile. Välisseade ise tõlgib MK väljundi õigel ajal vajalikku olekusse "0" või "1", teostades ülekande.
TÄHTIS: Pärast andmete kirjutamist spetsiaalsesse registrisse ja hilisemat lugemist saate täiesti erinevaid andmeid. Näiteks andmete edastamine UART-plokile saatmiseks ja ploki poolt vastuvõetud andmete lugemine väline seade, viiakse läbi sama registri abil.
Eriregistrid jagunevad tavaliselt bitiväljadeks. Üks (või mitu) bitti juhib teatud perifeerse ploki parameetrit, tavaliselt sõltumatult. Näiteks sama registri erinevad bitid juhivad erinevate MK-väljundite olekut.
Andmete kirjutamine mällu olevale aadressile
Oletame, et välisseadme kirjeldust lugedes saime aru, et selle õigeks tööks on vaja sinna kirjutada arv 0x3B. Registri eriaadress 0x60004012. Register on 32-bitine.
Kui te kohe ei tea, kuidas seda teha, proovin õige käsu saamiseks kirjeldada arutlusahelat.
Väärtus 0x60004012 ei ole midagi muud kui mälukoha kursori väärtus. See on täpselt see, mida peame oma programmis määrama, st tegema tüübiteisendust vastavalt C-keele süntaksile:
(allkirjata pikk*) (0x60004012)
Seega on meil kursor elemendile. Nüüd peate sellele elemendile kirjutama vajaliku väärtuse. Seda tehakse kursori viitamise tühistamisega. Nii saame õige käsu:
*(märgita pikk*)(0x60004012) = 0x3B;
Suvaliste bittide määramine väärtusele 1
Oletame, et tahame määrata bitid 7 ja 1 aadressi 0x60004012 väärtuseks "1", muutmata kõigi teiste registris olevate bittide väärtust. Selleks peate kasutama kahendtehteid |. Ma annan teile õige vastuse:
*(märgita pikk*)(0x60004012) |= 0x82;
Pöörake tähelepanu 2 faktile. Bite loetakse nullist, mitte esimesest. See toiming võtab tegelikult vähemalt 3 tsüklit – väärtuse lugemine, muutmine, kirjutamine. Mõnikord pole see lubatud, sest lugemise ja kirjutamise vahel võib välisseade muuta ühe biti väärtust, mida meil on keelatud muuta. Ärge unustage seda funktsiooni, vastasel juhul võivad sisse sattuda vead, mida on äärmiselt raske tabada.
Suvaliste bittide määramine 0-ks
Oletame, et tahame määrata bitid 7 ja 1 aadressi 0x60004012 väärtuseks "0", muutmata kõigi teiste registris olevate bittide väärtust. Selleks peate kasutama kahendtehteid &. Ma annan teile õige vastuse:
*(allkirjata pikk*)(0x60004012) &= 0xFFFFFF7D;
Või selle lihtsam tähistus (ärge muretsege lisatoimingu pärast, kompilaator arvutab kõik ette isegi minimaalse optimeerimisega):
*(märgita pikk*)(0x60004012) &= (~0x82);
Kõigepealt peate otsustama, milliste plokkidega töötada. Selleks piisab lõikude uurimisest Sissejuhatus ja põhijooned.
MK-tihvtide oleku otsene juhtimine toimub GPIO-ploki abil. Nagu dokumentatsioonis öeldud, võib STM32 MK-l olla kuni 11 sõltumatut GPIO-plokki. Erinevaid välisseadmete GPIO plokke nimetatakse portideks. Pordid on tähistatud A kuni K. Iga port võib sisaldada kuni 16 kontakti. Nagu me varem märkisime, on LED ühendatud PD13 viiguga. See tähendab, et seda kontakti juhib välisseadme GPIO port D. Pin number 13.
Seekord ei vaja me muid välisseadmeid.
Registrid vastutavad välisseadmete kellastamise võimaldamise eest RCC XXX välisseadmete kella lubamise register.Asendis XXX saab kasutada rehve AHB1, AHB2, AHB3, APB1 ja APB2. Pärast vastavate registrite kirjelduse hoolikat uurimist võime järeldada, et perifeerse GPIOD-seadme taktimine on lubatud, kui seada registri kolmandaks bitiks "1" RCC AHB1 välisseadmete kella lubamise register (RCC_AHB1ENR):
Nüüd peate välja mõtlema, kuidas registri enda aadressi teada saada RCC_AHB1ENR.
Kommentaar: STM32 MK kellasüsteemi kirjeldus väärib eraldi artiklit. Kui lugejatel on soovi, käsitlen seda osa üksikasjalikumalt ühes järgmistest artiklitest.
Registri aadressi saamiseks on vaja lisada RCC ploki aadressiruumi algväärtus adr. nihe soovitud register. Aadressi nihe märgitud registri kirjelduses (vt ülaltoodud ekraanipilti).
Selle tulemusena määrasime registri aadressi RCC_AHB1ENR- 0x4002 3830.
Nüüd on meie ülesandeks õppida, kuidas hallata MK-tihvtide olekut. Liigume edasi GPIO registrite kirjelduse juurde.
Nagu kirjeldusest näha, on meile vajalike seadistuste tegemiseks vaja registri 26-27 bitile kirjutada väärtus 01b GPIOx_MODER. Registri aadressi saab määrata ülalkirjeldatud meetodiga.
Kasutage GPIO pordi bittide seadmise/lähtestamise registrit (GPIOx_BSRR)
"0" või "1" kirjutamine bittidesse 0-16 toob kaasa vastava muutuse pordi kontaktide olekus. Selleks, et seada MK ühe või mitme tihvti väljundisse teatud väärtus ja mitte muuta ülejäänud olekut, on vaja kasutada üksikute bittide muutmise toimingut. Selline operatsioon viiakse läbi vähemalt 3 tsüklina. Kui mõnele bitile on vaja kirjutada 1 ja teistele 0, siis on vaja vähemalt 4 tsüklit. Seda meetodit on kõige parem kasutada väljundi oleku muutmiseks, kui selle algne olek pole teada.
GPIO pordi bittide seadistamise/lähtestamise register (GPIOx_BSRR)
Erinevalt eelmisest meetodist ei anna selle registri ühelegi bitile 0 kirjutamine midagi (ja tõepoolest, kõik bitid on ainult kirjutatavad!). Kui kirjutate 1 bittidesse 0-15, määratakse MK vastavas väljundis "1". Kirjutades 1 bittidesse 16-31, seatakse MK vastavasse väljundisse "0". See meetod on eelmisest eelistatum, kui on vaja MK-tihvtile määrata teatud väärtus ja seda mitte muuta.
Selle vältimiseks kasutatakse tavaliselt tsükliloendurit ja MK-viigu olekut lülitatakse siis, kui programm läbib teatud arvu tsükleid.
void main() ( //Luba pordi D clocking *(signed long*)(0x40023830) |= 0x8; //väike viivitus GPIOD jaoks valmisolekuks volatile unsigned long i=0; i++; i++; i++; i=0; / /Määrake PD13 üldotstarbeliseks väljundiks *(märgita pikk*)(0x40020C00) = (*(märgita pikk*)(0x40020C00)& (~0x0C000000)) | (0x04000000); while(1) ( i++; if(!(i) %2000000)) ( //Lülita LED SISSE *(märgita pikk*)(0x40020С14) |= 0x2020; ) else if(!(i%1000000)) ( //Lülita LED VÄLJA *(märgita pikk*)(0x40020С14) & = ~0x2000; ) ) )
Kuid isegi siin ei lähe see probleemideta, kui tsükli sees täidetavate käskude arv muutub, muutub LED-i vilkumise periood (või tsükli muude käskude täitmise periood). Kuid praeguses etapis ei saa me sellega võidelda.
Kuid lisaks sellele on võimalus vaadata kerneli registrite väärtusi, välisseadmete spetsiaalseid registreid (View-> Register) jne.
Soovitan soojalt tutvuda siluri funktsioonidega MK-programmeerimise õppimise ajal.
Aitäh kõigile, kes mu postitust lugesid, see tuli palju rohkem välja, kui alguses ootasin.
Ootan teie kommentaare ja põhjendatud kriitikat. Kui lugejatel on soov, siis püüan artiklite sarja jätkata. Võib-olla on kellelgi ideid teemade kohta, mida võiks käsitleda – mulle meeldiks neid kuulda.
Mikrokontrollerid kassipoegadele
Kõik Mjäu, kassid :)
Kord lahkus minust kass: (Noh, mida palderjani süüa, otsustasin nii-öelda "kodumaa hüvanguks" asja kallale asuda. Tahtsin juba pikka aega digiseadmeid teha, aga polnud. aeg (teate küll, siis magama, siis katustel kassikõnniga) ja siis ilmus just kellaaeg. No alustame..)
Kõik, nagu tavaliselt, algab valikust. Noh, nagu väikese PIC-i valik, jah AVR. Viimased on mulle köitvamad. Vajasin ka arvuti muude portide puudumise tõttu USB programmeerijat, mille hinnast oleks mul saba peaaegu ära kukkunud. On ka Arduino – selline metsaline. Seda saab programmeerida ka USB kaudu. Noh, ma arvan, et see on just see, mida arst käskis. Meie külas saab selle kätte ainult veebipoe kaudu. Leidsin, kus oli tulusam, ostsin peaaegu ära ja ... OPA! Otsin - STM32VL-Discovery. Mis loom see on? Hmm, STM32 .. ma kuulsin midagi kõrvanurgast.. Ja vuntside omadustest ausalt!
Ja kui palju käppasid tal on!
Niisiis, järjekorras:
Mis järgmiseks? STM32VL-Discovery'l on sisseehitatud programmeerija/siluja, mis kerge käpa liigutusega (eemaldades hüppajad) saab programmeerida ja siluda (silumine on väga kasulik asi, aga sellest hiljem) STM32 mikrokontrollereid väljaspool plaati. Arduino puhul see ei tööta. See tähendab, et STM32VL-Discovery abil säästame raha ning saavutame suurema jõudluse ja loomingulise vabaduse :)
Ja STM32 mikrokontrollerid ise näevad atraktiivsemad kui ülejäänud:
STM32F100C4T6B | ATtiny24A-SSU | PIC16F688-I/SL | STM32F103RET6 | ATmega1284P-PU | PIC18F4550-I/PT | |
Keskmine hind, hõõruda | 60 | 65 | 60 | 240 | 330 | 220 |
Kellasagedus, MHz | 24 | 20 | 20 | 72 | 20 | 48 |
Välkmälu, KB | 16 | 2 | 4 | 512 | 128 | 16 |
RAM, bait | 4096 | 128 | 256 | 65536 | 16384 | 2048 |
USART, tk | 2 | 0 | 0 | 5 | 2 | 0 |
SPI, tk | 1 | 1 | 0 | 3 | 1 | 1 |
ADC, tk | 16x12 bitti | 8x10 bitine | 8x10 bitine | 16x12 bitti | 8x10 bitine | 13x10 bitti |
DAC, tk | 1x12 bitti | 0 | 0 | 2x12 bitti | 0 | 0 |
I/O liinide arv, tk | 37 | 12 | 12 | 51 | 32 | 35 |
Ja STM32 on 32-bitine, mis tähendab võimalust töötada ühe tsükli jooksul 32-bitiste andmetega. AVR ja PIC sellega ei kiidelda.
Noh, kassid, kas olete veendunud? Alustame siis noore digivõitleja kursusega!)
Kuidas see töötab? Millest see koosneb? Mida saab?
Nagu teate, on kõik kassid väga uudishimulikud ja eriti raadiokassid!
Mikrokontroller on mikroskeem, mis ühendab endas protsessori, välisseadmete, RAM-i ja välkmälu funktsioone. Nagu arvuti, ainult väiksem!
Toome analoogia: arvutit juhib operatsioonisüsteem ja mikrokontroller on teie kirjutatav püsivara; arvuti operatsioonisüsteem on salvestatud kõvakettale, mikrokontrolleri "püsivara" selle välkmällu; RAM-i funktsioonid on sarnased - muutuvate andmete salvestamine programmi täitmise ajal. Ja MK-l on ka erinevaid välisseadmeid, nagu näiteks ADC ja DAC.
MK suhtleb välismaailmaga oma kehal olevate käppade abil (muidugi mitte nagu kassid, vaid metallist). Kuid mitte kõiki neid programm ei juhi, on toitepistik, lähtestusviik, välisseadmete toiteviigud, varutoide. Ja need, mida programm juhib, on jagatud rühmadesse, mida nimetatakse "pordideks". Kõiki neid juhitavaid väljundeid nimetatakse kaheks täheks ja numbriks. Näiteks PA1: P - port, A - port "A", 1 - selle pordi pin number.
Programmis konfigureeritakse pordid vastavalt soovile kas sisendiks või väljundiks.
Sisendiks konfigureeritud pordi tihvtid võivad olla sees erinevad režiimid, iga väljundi puhul võib see olla erinev:
Ja väljundiks konfigureeritud pordil võivad olla väljundid järgmistes režiimides:
Kuid kõiki järeldusi ei saa määrata "nagu soovite". Selleks, et teada saada, mis on võimalik ja mis mitte, tuleb tutvuda dokumentatsiooniga (tabel 4) või kasutada programmi MicroXplorer.
Enne pordi kasutamist peate selle esmalt kella panema - rakendama sellele kella impulsse, sest. esialgu neid energia säästmiseks ei tarnita. Saate valida erineva taktsageduse - rohkem sagedust - selle pordi sisendid või väljundid töötavad kiiremini, aga ka rohkem energiat.
Järeldusi on veelgi BOOT 0 ja BOOT 1. Need kontaktid ei ole pordid, neid kasutatakse mikrokontrolleri koormuse juhtimiseks. Kui sisselülitamisel on BOOT 0 viik loogiliselt null (viik on ühendatud ühispunktiga), siis mikrokontroller täidab välkmällu laetud programmi, s.t. teie püsivara. Kui sisselülitamise ajal on BOOT 0 viik loogiline (viik on ühendatud mikrokontrolleri toiteallikaga) ja BOOT 1 viik on loogiline null, siis mikrokontroller ei käivita teie püsivara, vaid tehases kirjutatud alglaadur. Mäleta seda! Kasutate seda sageli STM32 mikrokontrolleritega töötades! Mõnikord on tehases salvestatud alglaaduri laadimine ainus viis mikrokontrolleri püsivara vilkumiseks/muutmiseks. See juhtub näiteks püsivaras konfigureerides väljundeid, millega programmeerija on ühendatud, või mikrokontrolleri vilkumisel ilma programmeerijat kasutamata. Nii et väga soovitada trükkplaadi projekteerimisel peaksid need kontaktid (või vähemalt BOOT 0) asuma sobivas kohas.
Mõtlesime selle välja :) Nüüd teame, mis on mikrokontroller, millest see koosneb. Nüüd õpime mõne tarkuse kohta rohkem teada ja liigume edasi kõige huvitavama asja – harjutamise juurde!
Programm mikrokontrolleris täidetakse samm-sammult. Protsessori üks tsükkel - programmi üks etapp.
Näiteks laske punasel ja rohelisel tulel vilkuda, kuni nuppu vajutatakse. Iga lambi kestus on 5 sekundit. Siin on algoritm:
STOP! Mis siis, kui vajutan nuppu, kui tuli põleb? Siis ei juhtu midagi! Sest programm täidetakse samm-sammult ja nupu kontrollimise samm vajutatakse lambipirnide vahetamise hetkel.
See selleks sellisteks puhkudeks, on olemas selline asi nagu katkestab
Katkestused annavad võimaluse katkestada põhiprogrammi täitmine. Seda saab teha kas välise sündmuse (nupu vajutamine, nupu vabastamine, andmete vastuvõtmine jne) või sisemise (taimeri abil või on aeg näiteks kassi toita). Kui see katkestus toimub, hakkab alamprogramm täitma. alamprogrammid võivad olla erinevad erinevad tüübid katkestusi, nimetatakse neid rutiine katkestada käitlejad.
Kui see sama katkestuse töötleja oma töö lõpetab, hakkab põhiprogramm jooksma kohast, kus see katkestati.
Tõuseme jalule!
Noh, kassipojad, on aeg käppadele tõusta! Loodan, et teil on silumisplaat juba olemas? Või isegi mikrokontroller? Loodan, et on :) Ja kui ei, siis jookseme poodi! (ja soovitavalt mitte üle vorsti siiski...) Mis õpetus see ilma harjutamiseta on?
Algul on tore, kui on silumisplaat, näiteks STM32VL-Discovery, aga kui kärnkonn lämbub või vorstiks ikka ei piisa, siis saab hakkama ühe mikrokontrolleri ja RS-232 -> UART liidese muunduriga (näiteks MAX3232) või USB -> UART (nt FT232RL). Sel juhul saab 100 rubla täielikult täita, kuid peate valmistama trükkplaadi ja jootma vähemalt 48 0,3 mm laiust juhet 0,2 mm vahega. hoiatasin.
Kõigepealt peate loomulikult arvuti külge kinnitama silumisplaadi või kontrolleri.
Kui teil on silumisplaat:
Silumisplaadiga on see muidugi lihtsam. Võtame Mini-USB kaabli ja ühendame plaadi arvutiga, kõik draiverid peaksid olema automaatselt installitud. Vaata STMicroelectronics STLink dongle seadmehalduris - hea märk! Noh, kui midagi läks valesti ja midagi ei juhtunud - pole vaja diivanit kriimustada, peate lihtsalt minema siia ja installima Utiliit STM32 ST-LINK.
Noh, kui olete all oleva arvuti õnnelik omanik Windowsi juhtimine 8, siis peate enne ülaltoodud toimingute tegemist tegema järgmist: Valikud -> Arvuti sätete muutmine -> Kindral -> Erilised allalaadimisvalikud ja valige suvand Keela draiveri allkirja kinnitamine.
Kui teil on mikrokontroller:
Kui teil on üks mikrokontroller, peaksid teil olema sirged käpad. Aga ma ei kahtle sinus!
Enne mikrokontrolleri ühendamist arvutiga tuleb see trükkplaadi külge joota. Selleks on lisaks mikrokontrollerile ja sirgetele käppadele vaja vähemalt trükkplaati. Ja siis on teie loovus.
Töömiinimum alloleval diagrammil:
Kuid see on ebahuvitav miinimum.
Lisage LED-id ja nupud (ärge unustage BOOT-tihvte) niimoodi
Kuid selle kirbu jootmisega võib probleeme tekkida. Aga ma loodan, et nad seda ei tee. Jõudsin selle jootma oma lemmik Nõukogude 25W jootekolbiga, mille otsa laius oli 3/4 kontrolleri laiusest. mul on rohkem probleeme trükkplaadi valmistamisega ... eks igaühel on oma tehnoloogia.
Ja adapter tuleb teha UART-i vastavalt ostetud kiibi dokumentatsioonile.
Ühendame trükkplaadi tihvtid TxD ja RxD vastavalt adapteri RxD ja TxD tihvtidega. Ärge unustage selle kõige ühist mõtet ja toitumist.
Tarkvara valimine ja installimine
Kasutame arenduskeskkonda CooCox IDE, kuid see pole nii lihtsalt, vaid mitmel põhjusel:
Arenduskeskkond on programm koodi kirjutamiseks, kompilaator, silur ühes. Mugav :) Aga kui mõnel karmil tšeljabinski kassil on mugavam koodi kirjutada (näiteks märkmikusse), kompileerida ja erinevate programmidega flashida - ei viitsi, siis tuleb allalaadimisel kasuks STM32 ST-LINK utilit püsivara mikrokontrollerile. Omanik on härrasmees, nagu öeldakse.
See arenduskeskkond põhineb paljudel kuulsatel Eclipse'il.
Kui teil on võimalus ilma silumisplaadi / programmeerijata, vajate programmi laadimiseks MK-sse Flash Loader demonstraator mis asub
Leiame vastastikune keel
Enne esimese programmi kirjutamist peate leidma MK-ga ühise keele. On ebatõenäoline, et ta meie keelt ära õpib, nii et ta peab õppima (või võib-olla lihtsalt meeles pidama) keele, milles me MK-ga suhtleme, see on C. Vajame ainult põhitõdesid (programmi koostis, funktsioonid, operaatorid). Kui teate seda keelt, võite kohe minna jaotisse "Esimene programm", kuid neile, kes ei tea, värskendan seda.
Projekt koosneb laienditega failidest .c ja .h. Esimeses on funktsioonid, teises näiteks kasutatavate funktsioonide nimed ja konstandid. Nii see on tehtud. Peamine fail, mis sisaldab programmi koodi peamine.c. Erinevate funktsioonide kasutamiseks peate nende funktsioonidega kaasama teeke. Nad ühendavad salvestamise teel #include "teegi_nimi" No raamatukogud peaksid loomulikult projektis olema. Ühendage need faili alguses.
Funktsioonid on programmi omapärane osa. Üldiselt koosneb programm ühest või mitmest funktsioonist. Funktsioon näeb välja selline:
tagastamise_muutuja_tüüp funktsiooni_nimi (muutuja_tüüp)
{
Funktsiooni keha
}
Funktsioonile saab saata mis tahes muutuja, funktsioon töötleb seda ja tagastab mingi väärtuse. Funktsiooni on väga mugav kasutada korduvate toimingute jaoks, selle asemel, et kogu aeg sama koodijuppi kirjutada, saate lihtsalt funktsioonile muutuja saata ja töödeldud väärtuse tagasi saada.
Enne funktsiooni kasutamist tuleb see deklareerida faili alguses. Nad teevad seda nii:
tagastamise_muutuja_tüüp funktsiooni_nimi (muutuja_tüüp);
Oh jah, ma unustasin kõige tähtsama! Iga rea lõpus peab olema semikoolon!
Kui funktsioon midagi ei tagasta (näiteks viivitus, tõmbab lihtsalt kassi sabast kinni), siis näidatakse tüüp tühine.
Käivitamisel käivitatakse funktsioon alati esimesena. peamine ().
Noh, me mõtlesime funktsioonid välja, mõistmine tuleb alles harjutades.
Mainisin eespool muutuv tüüp. Kõik muutujad võivad olla erinevat tüüpi, siin on peamised:
Stringi (sõna, lause) saab esitada char tüüpi märkide massiivina. Näiteks:
char string = "Sõna";
Siin on nurksulud stringi märkide arv, "stroka" on massiivi nimi.
Enne muutuja kasutamist tuleb see deklareerida. (lihtsalt määrake muutuja tüüp ja nimi)
Näiteks väljend a=b+c tähendab muutujale määramist a muutujate väärtuste summa väärtus b ja c.
Näiteks väljend a++ tähendab muutuja väärtuse suurendamist a 1 võrra (sama mis a=a+1)
Näiteks väljend a muutub tõeseks, kui muutuja väärtus a väiksem kui muutuja väärtus b ja väär, kui väärtused on võrdsed või a rohkem b. Väljendus a==b tõsi, kui a võrdub b ja vale, kui a pole võrdne b, AGA väljend a=b tõsi alati sest see ei ole võrdlus, see on muutujale omistamine a muutuvad väärtused b.
Näiteks kui a = 5,b = 3, siis avaldise väärtus a%b on võrdne 2-ga (kuna 5/3 = 1 (ülejäänud 2))
Ma peaaegu unustasin teile tsiklitest rääkida. Peamine:
samas (seisund) (
silmuse korpus
Silmuse keha (kõik lokkis sulgudes) täidetakse, kui tingimus on tõene (kuni tingimus muutub vääraks).
for (algusväärtus; loop_run_to, samm) (
silmuse korpus
Algne väärtus- loenduri algväärtus
Loop_run_to - kuni millise väärtuse saavutamiseni teostatakse tsükkel
samm - millise sammuga loendur loeb
Näiteks
jaoks (i=0; i<10, i++) {
silmuse korpus
Siin on muutuja algväärtus i on 0, tsükkel käivitatakse muutuja väärtuse ajal i vähem kui 10, iga kord, kui tsükkel muutujale i Lisatakse 1. Muutuja väärtust saab muuta ka otse tsüklis.
kui (tingimus)(
keha 1
) muidu (
keha 2
Tingimusliku hüppe korral täidetakse "keha 1", kui tingimus on tõene, ja "keha 2", kui tingimus on väär. Samuti on see valik:
kui (tingimus 1) (
) muidu kui (tingimus 2) (
Sel juhul täidetakse "keha 1", kui "tingimus 1" on tõene, "keha 2" täidetakse, kui "tingimus 2" on tõene. Selliseid tingimusi võib olla suvaline arv, võib olla ka üks muu.
Tingimused võivad olla lihtsad ja liit: liht - üks loogiline avaldis ja liit - mitu loogilist avaldist, mis on ühendatud märgiga & (tingimused on tõesed, kui kõik selle märgiga ühendatud tingimused on tõesed) või | (tingimus on tõene, kui vähemalt üks selle märgiga ühendatud tingimus on tõene).
Veel üks kasulik asi on kommentaarid. Need aitavad unustatud projektist aru saada :) või lihtsalt mitte midagi unustada. Võite kommenteerida kas pärast märke // ja rea lõppu või alustage tähemärkidega /* ja lõpp */ , sel juhul võib kommentaar koosneda suvalisest arvust ridadest. Kommentaarid ei mõjuta programmi mahtu.
Noh, põhiliselt tundub kõik. Esimeseks korraks piisab (kuni artikli järgmine osa on kirjutatud)
Esimene programm
Me ei kaldu traditsioonidest kõrvale (või ei tea kunagi) ja alustame Hello Worldiga. Ja teel jätkame mikrokontrolleriga tutvumist ja nii-öelda kogemuste omandamist.
Ava arenduskeskkond:
Klõpsake Sirvige hoidlas
Vali ST
Seejärel näeme kaasatud raamatukogude loendit.
Meie lihtsa programmi jaoks vajame: CMSIS tuum, CMSIS alglaadimine, RCC, GPIO.
raamatukogud CMSIS tuum ja CMSIS-i alglaadimine- süsteemi, peavad need olema ühendatud
Raamatukogu RCC töötada kellasüsteemiga
Raamatukogu GPIO sisend-väljundportidega töötamiseks
Nüüd aknas vasakul projekt avatud fail peamine.c.
Kõigepealt peate ühendama meie teegid (CMSIS-i pole vaja ühendada).
Läheme programmi algusesse ja lisame read:
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
tühine viivitus(int i) (
jaoks (; i != 0; i--);
}
Niisiis. Siin järjekorras ei tagasta funktsioon midagi, seega tühine, funktsiooni nimi Viivitus, deklareerige kohe muutuja i tüüp int. Lokkis klambrites on funktsiooni keha silmus jaoks. See on tema rea sissekanne. Algne väärtus i me ei muuda, tsükkel kestab kuni i ei ole võrdne nulliga (as i muutub võrdseks nulliga, tsükkel peatub, funktsioon "lülitatakse välja"). Silmuskeha (tsükli) iga täitmisega muutub muutuja i väheneb 1. St. tsükli olemus - lihtsalt korrake kordade arvu, mis on võrdne i. Kui silmus töötab, aeg hakkab otsa saama, on viivitus.
Milline port millise väljundi eest vastutab, leiate MK dokumentatsioonist:
Kellapordi C jaoks lisage rida:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , LUBATA);
Lisage programmi järgmine rida:
GPIO_InitTypeDef GPIO_Init1;
Selle reaga deklareerisime struktuuri GPIO_InitTypeDef- andis sellele nime GPIO_Init kasutamiseks meie allolevas programmis.
Milliseid parameetreid saab selles struktuuris konfigureerida ja mis kujul need on, vaatame kõike ühtemoodi stm32f10x_gpio.h:
Nüüd peate väljundparameetrite struktuuri abil konfigureerimiseks kirjutama selle nime, panema punkti ja ilmub aken, milles need parameetrid on näidatud
Topeltklõpsake ühel neist ja see ilmub reale, seejärel pange = (määrake) ja kirjutage väärtus alates stm32f10x_gpio.h
Teeme sama kõigi parameetritega. Ärge unustage semikoolonit iga rea lõpus!
GPIO_Init(GPIOC , &GPIO_Init);
Nüüd pilgutame! Vilgutame tsükliliselt, teeme tsüklit samas. Silmuse tingimus on 1. Üks on alati tõene, null on alati vale .. selline on kõik la vi ..
Väljundile voolu rakendamiseks tuleb bitti määrata, väljundi väljalülitamiseks biti tühjendada. Kuidas seda teha – kõik ühes stm32f10x_gpio.h:
Teeme seda:
samas (1)(
GPIO_SetBits(GPIOC, GPIO_Pin_9);
viivitus(200000);
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
viivitus(200000);
1 on alati tõene, mis tähendab, et silmus loob tsükli.
GPIO_SetBits – bittide seadmise funktsioon
GPIO_ResetBits – biti lähtestamise funktsioon
Viivitus (200000) - sellel real läheb programmi täitmine funktsiooni Viivitus, just sellele, milles tsükkel jaoks. Sellele funktsioonile antakse muutujana edasi sulgudes olev arv 200000 i. (pidage meeles rida tühine viivitus (int i)?) ja selles funktsioonis käivitatakse sama tsükkel, kõik 200 000 korda. Kiire on :) peale tsükli lõppu jaoks funktsiooni DElay lõpetab oma töö, sest ta on tühine, siis see ei tagasta midagi ja programm jätkab töötamist.
Sest samal ajal on tsükliga, siis LED sees, viivitus, LED väljas, viivitus lülitub lõputult. Kuni toite väljalülitamiseni või katkestuseni (sellest lähemalt järgmises artiklis).
Noh, esimene programm on valmis. Nüüd vajutame F7, programm on koostatud.
Kui teil on silumisplaat, ühendage see USB-kaabli abil ja vajutage Laadige Flashi kood alla. Oleme rahul tehtud töö ja omandatud teadmiste üle :)
Ja kui teil silumisplaati pole, ühendage varem tehtud adapter oma plaadiga ja adapter arvuti COM-porti. Järgmisena ühendage väljund BOOT 0 c pluss mikrokontrolleri toide ja lülitage mikrokontrolleri toide sisse. Seega lülitub mikrokontroller püsivara režiimi. Üldiselt pole püsivara protseduur keeruline. Peate lihtsalt järgima rakenduse juhiseid Flash Loader demonstraator. Esmalt määrake COM-pordi number, mille kaudu teie mikrokontroller on ühendatud, ja kiirus. Avariide vältimiseks on parem valida väiksem kiirus
Kui programm nägi teie mikrokontrollerit, ilmub aken, kuhu kirjutatakse, kui palju mälu sellel on
Pärast nupu "Järgmine" klõpsamist näete mäluaadressiga lehte. Meil pole seda vaja.
Järgmine samm on kõige vastutustundlikum. Saate valida, kas tühjendada mälu või välklamp
Püsivara jaoks valige Laadige alla seadmesse ja põllul Laadige failist alla valige kaustas asuv kompileeritud hex-fail CooCox -> CooIDE -> tööruum -> projekti_nimi -> projekti_nimi -> Silumine -> salv. Seejärel klõpsake uuesti nuppu "Järgmine".
Kui näeme seda akent:
Lülitage mikrokontrolleri toide välja, sulgege Flash Loader demonstraator, lülitage adapter välja ja lülitage mikrokontroller sisse tavarežiimis (kui sisselülitamisel BOOT 0 viik on ühendatud mikrokontrolleri toiteallika miinusega). Me rõõmustame!
Niisiis, nüüd teame, miks STM-i mikrokontrollerid on teistest paremad, me teame, kuidas mikrokontroller töötab, teame, kuidas silumisplaadil ja oma plaadil mikrokontrollerit vilkuda, teame C-keele põhitõdesid, mida on vaja programmi programmeerimiseks. STM32, saime kogemuse mikrokontrolleriga (loodetavasti positiivsed) ja mis kõige tähtsam, nüüd saate oma ideid digiseadmetest ellu viia (ja rääkida neist meie lemmik RadioKatis)! Olgu see ikka tagasihoidlik, aga kõik korvab kogemuse. Ja järgmistes artiklites proovin rääkida ADC-st, DAC-st, katkestustest, silumisest ja muust kasulikust.
Kuidas teile see artikkel meeldib? |
Kõik selle artikli pildid on klõpsatavad.
Mikrokontrollerid sisaldavad ARM mikroprotsessori südamikku, täpsemalt ARM Cortex-M. See tuum on omane mitte ainult STM32 mikrokontrolleritele, see eksisteerib iseseisvalt ja selle alusel toodetakse palju erinevate tootjate mikrokontrollereid.
Seejärel leiame vasakpoolsest loendist selle mikrokontrolleri ja installime vastava DFP paketi:
On näha, et seas installitud paketid seal on CMSIS. CMSIS on Cortex-M tuuma teek, mis on ühine kõikidele mikrokontrolleritele. Raamatukogu on välja töötanud ARM ja see on pärast registreerimist ametlikult veebisaidilt allalaadimiseks saadaval. Seda paketti oleks võimalik mitte installida, vaid kasutada teegi ametlikku väljalaset, kuid see on täiendav keerukus.
Sulgege paketihaldur ja käivitage Keil uVision5 (hääldatakse mu-vision):
Keil uVision5 on osa MDK-ARM-ist, GUI keskkonnast, mis sisaldab koodiredaktorit:
Need seaded on üsna vastuolulised. Igal arendajal on oma eelistused.
Nüüd loome projekti. Selleks valige menüü "Projekt -> Uus uVision Project ...". Avanevas aknas valige projekti asukoht ja nimi. Projekti jaoks on parem luua eraldi kaust ja salvestada projekt sinna.
Pärast salvestamist ilmub seadme valiku aken. Valige soovitud mikrokontroller ja klõpsake nuppu OK. Kui me ei installiks vajalikku paketti, poleks mikrokontrollerit loendis:
Järgmises aknas tuleb valida projektis kasutatavad komponendid. Peate valima "CMSIS:CORE" ja "Seade:Startup":
Pärast nuppu OK on projekti loomise protsess lõpule viidud.
Edaspidi saate komponentide lisamiseks või eemaldamiseks alati käivitada komponentide valimise akna. Selleks valige menüü "Projekt -> Halda -> Run-Time Evironment ...".
Komponentide valimisel võite avastada, et komponent sõltub teistest komponentidest, mida te ei valinud. Selle kohta saate teada akna allosas olevatest sõnumitest. Peate valima sõltuvad komponendid.
Pärast projekti kirjeldatud viisil loomist näete parempoolses aknas järgmist projekti struktuuri:
Siin näeme projekti nime "näide", projekti sihtmärki "Target 1", tühja failirühma "Source Group 1", komponente CMSIS ja Device.
Projekti eesmärke võib olla suvaline arv. Eesmärk sisaldab kõige olulisemaid projekti seadistusi, sealhulgas mikrokontrolleri valikut. Programmi koostamiseks on vaja eesmärke erinevatel viisidel samade lähtekoodifailide jaoks. Näiteks võite soovida, et projekt hõlmaks mitut mikrokontrollerit.
Lähtekoodifailide kenasti rühmitamiseks on vaja failide rühmi. Grupid aitavad teil hõlpsalt failide vahel navigeerida suur projekt. Näiteks võib teil olla failide rühm, mis vastutab LED-ide eest, ja eraldi rühm failidega USB-ga suhtlemiseks.
Struktuuris näeme kahte faili. Üks "s" laiendiga. See sisaldab assemblerkeele lähtekoodi. Teine laiendiga "s". See sisaldab C-keeles lähtekoodi.
Saate luua projekti ja hankida püsivara faili, vajutades klahvi F7. Kuid sellisel kujul projekti ei ehitata ja saate veateate, kuna funktsioon "peamine ()" puudub.
Funktsioon "main()" on teie programmi sisenemispunkt, kust programm algab. Selle olemasolu on kohustuslik, kui kirjutate programmi C-keeles.
Loome selle funktsiooni. Paremklõpsake rühmal „Source Group 1” ja valige „Add New Item to Source Group 1”…” (tõlge: lisage gruppi „Source Group 1” uus üksus). Loome faili "main.c":
Lisage loodud failile järgmine kood:
int main() (tagasi 0; )
Faili lõppu tuleks lisada tühi rida, vastasel juhul kuvatakse ehitamisel hoiatus "hoiatus: #1-D: faili viimane rida lõpeb ilma reavahetuseta".
Nüüd saab projekti üles ehitada klahviga F7. Selle tulemusena saate faili "Objects\example.axf" (vaikimisi on faili nimi sama, mis projekti nimi). Fail asub projekti kaustas.
Tavaliselt vajab arendaja püsivara faili Intel HEX-vormingus. Selle saavutamiseks peate püstitama eesmärgi. Sihtseadete vaatamiseks vajutage Alt-F7, minge vahekaardile "Väljund" ja valige "Loo HEX-fail".
Pärast järgmist ehitamist saate faili "Objects\example.hex".
Nüüd ei tee programm midagi ja seda on mõttetu vilkutada. Kirjutame programmi, mis kontrollib mikrokontrolleri tihvtide olekut.
Alustame komponentide valimist kasutades menüüd "Project -> Manage -> Run-Time Evironment ..." ja valige komponent "Seade: STM32Cube Hal: GPIO".
Akna allosas näeme rahulolematut sõltuvust "Seade: STM32Cube Hal: Common". Valige see komponent ja vaadake veelgi suuremat sõltuvuste loendit. Kõik vajalikud sõltuvused tuleb valida:
STM32Cube on STMicroelectronicsi pakutav teek.
Komponentide valimisel valime, milliseid selle teegi funktsioone kasutada.
Mikrokontroller sisaldab lisaks tuumale suur hulk välisseadmed: ADC, DAC, taimerid, erinevad liidesed ja palju muud. Igal välisseadmel on oma nimi. Näiteks mikrokontrolleri portidega töötamiseks mõeldud seadet nimetatakse GPIO-ks, selle kohta saate teada mikrokontrolleri dokumentatsioonist.
STM32Cube'i teek on mitmetasandiline, see tähendab, et see sisaldab palju vahepealseid teeke. Üks vahepealsetest raamatukogudest kannab nime STM32Cube HAL või lihtsalt HAL. See on jagatud mooduliteks ja iga moodul vastab mõnele välisseadmele. Mooduli nimi on sama, mis seadme nimi, näiteks on olemas GPIO moodul.
STM32Cube'i kohta on palju dokumentatsiooni. Kuid välisseadmetega töötamise peamine kirjeldus sisaldub selles. Seda juhendit kasutab arendaja enamasti. Pöördume selle poole, et mikrokontrolleri jalad liiguksid.
Esiteks lubame oma programmis HAL-i, lisades funktsiooni "main()" määratluse ette rea:
#include "stm32f4xx_hal.h"
Funktsiooni "main()" alguses kutsume välja funktsiooni "HAL_Init()", mis initsialiseerib teegi.
Seega saame faili "main.c" järgmise koodi:
#include "stm32f4xx_hal.h" int main() ( HAL_Init(); return 0; )
Siinkohal pean oma artikli katkestama, sest in Sel hetkel Mul pole midagi programmi silumiseks, see tähendab, et silumisplaati pole käepärast.
Olen kirjutanud programmi, mis ehitab ja peaks teoreetiliselt töötama, kuid ma ei taha lugejat eksitada. Pean ülaltoodud materjali kasulikuks ja ilma lõpptulemuseta.
#include "stm32f4xx_hal.h" int main() ( HAL_Init(); // Luba pordi A takt. __HAL_RCC_GPIOA_CLK_ENABLE(); // Pordi seaded. GPIO_InitTypeDef s; s.Pin = GPIO_PIN_0.s; //.PinMo GPIO_MODE_OUTPUT_PP; // Digitaalne väljund s.Pull = GPIO_NOPULL; // Pullup puudub s.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // Maksimaalne kiirus. // Määra viik 0 Port A. HAL_GPIO_Init); while(1) ( HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0); ) //return 0; ) void SysTick_Handler(void) ( HAL_IncTick(); )