Lihtsad tasuta tarkvaraarendustööriistad STM32 jaoks

28.09.2019 Küte

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.

Mikrokontrolleri valik

Paljud võivad öelda, et parem on alustada mikrokontrollerite õppimist AVR, PIC, 8051 või millegi muuga. Küsimus on mitmetahuline ja vastuoluline. Tean piisavalt näiteid, kui inimesed, olles õppinud Cortex-M, programmeerisid AVR, ARM7 jne. Ise alustasin Cortex-M3-ga. Kui seisate silmitsi konkreetse ülesandega, on Internetis palju teavet, kus võrreldakse erinevat tüüpi mikrokontrollereid ja nende abil lahendatud ülesandeid. See küsimus tõstatati ka näiteks Habré puhul.

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.

Mida on õppimiseks vaja?

Kahjuks arvutist üksi MK programmeerimise alustamiseks ei piisa. Peate kuskilt hankima demoplaadi ja programmeerija. Kuigi see vähendab konkurentsi tööturul.

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.

Arenduskeskkond

Nagu korduvalt mainitud, on ARM-i mikrokontrollerite jaoks piisavalt palju arenduskeskkondi, nii tasulisi kui ka mitte nii palju. Ja jällegi tahan ma selle teema poleemika ära jätta. Kasutan IAR Embedded Workbenchi ARM 6.60 jaoks. Kõik näited on selles keskkonnas. Kui teile meeldib (või kasutate oma organisatsioonis) midagi muud (Keil, Eclipse, CCS, CooCoc jne), siis see ei tee teile liiga. Erilist tähelepanu pööran just arenduskeskkonnaga seotud funktsioonidele.

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.


Paigaldusprotsessi ma ei kirjelda.

Kust alustada?

Loo projekt
Alustame tühja projekti loomisega. IAR võimaldab teil luua projekte ASM-, C- ja C++-vormingus. Me kasutame C.

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).

"TK" esimese projekti jaoks
Teeme kokkuvõtte: Valitakse MK ja silumisplaat, koostatakse projekt. On aeg ülesanne enda peale võtta.

Ä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).

Enne programmeerimise alustamist ehk natuke teooriat
Enne meie TOR-i rakendamisega jätkamist on vaja mõista, kuidas MC-d hallatakse.

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.

Südamiku koostoime perifeerse seadmega
MK-südamiku interaktsioon välisseadmega toimub spetsiaalsete registrite abil (samuti on interaktsioon katkestusmehhanismi ja DMA kaudu, kuid sellest lähemalt järgmistes postitustes). Kerneli seisukohast on see vaid teatud aadressiga mälutükk, see lihtsalt pole päris nii. Andmete kirjutamine spetsiaalsesse registrisse on samaväärne käsu või andmete saatmisega välisseadmesse. Lugemine - andmete vastuvõtmine plokist või selle oleku lugemine. Välisplokkide ja nende eriregistrite kirjeldus hõivab lõviosa MK kirjeldusest.

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.

Pidage meeles C
Kui olete C-keele guru, jätke see jaotis julgelt vahele. See on mõeldud eelkõige neile, keda on õpetatud (või kes on ise õppinud) arvutile programmeerima. Kogemus näitab, et inimesed ei mäleta sageli olulisi käske. Siinkohal tuletan teile lühidalt meelde bitipõhiseid toiminguid ja otse mäluga töötamist selle aadressil.

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);

Mõned MK-programmide funktsioonid
Siin püüan kirjeldada mõningaid MK-programmide omadusi, mida on oluline meeles pidada. Asjad on üsna ilmsed, kuid siiski.
Programmil pole lõppu
Erinevalt enamikust arvutiprogrammidest ei tohiks MK-programm kunagi lõppeda, MITTE KUNAGI! Ja mida täpselt peab MC pärast teie programmi lõppu tegema? Küsimus on praktiliselt retooriline. Seetõttu ärge unustage veenduda, et te ei unustaks igavest silmust. Soovi korral saate MK panna puhkerežiimi.
Kasutage täisarvulisi muutujaid
Kuigi me kasutame Cortex-M4 mikrokontrollerit, mis teeb riistvaras ujukoma toiminguid, soovitan teil nende kasutamise lõpetada. MK-s ilma selliste toimingute toetamiseta on arvutusaeg lihtsalt tohutu.
Vältige dünaamilist mälu eraldamist
See on lihtsalt nõuanne. Põhjus on lihtne – mälu pole piisavalt. Olen kohanud raamatukogusid, millel on mälu "aeglased lekked". See oli väga masendav, kui pärast mitmenädalast stabiilset töötamist rippus MK veaga. Parem on oma programmi arhitektuur eelnevalt läbi mõelda, et ei peaks kasutama dünaamilist mälujaotust.
Kui soovite seda siiski kasutada, uurige hoolikalt mäluhalduri tööd või kirjutage oma.

Asume tööle!

MK programmi kallal töötamine algab alati dokumentatsiooni lugemisest. Meie MK jaoks on saadaval tootja veebisaidil. Palju lehekülgi, aga lugege kõik läbi hüvasti pole tarvis. Nagu juba mainitud, on suurem osa dokumentatsioonist välisseadmete ja nende registrite kirjeldus. Samuti tahan juhtida teie tähelepanu asjaolule, et käesolev käsiraamat ei ole kirjutatud mitte ühe MK, vaid mitme rea jaoks. See viitab sellele, et kood on teisaldatav, kui lülituda muudele nende ridade MK-dele (välja arvatud juhul, kui proovite muidugi kasutada välisseadmeid, mida kasutatud MK-s pole).

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.

Väliskella juhtimine
MC energiatarbimise vähendamiseks lülitatakse pärast MC sisselülitamist välja peaaegu kõik välisseadmed. Seade lülitatakse sisse/välja, rakendades/peatades selle sisendisse kellasignaali. Õigeks tööks on vaja MCU kellakontroller seadistada nii, et vajalik välisseade võtab vastu kellasignaali.
Tähtis: Välisseadet ei saa käivitada kohe pärast kellasignaali sisselülitamist. On vaja oodata paar tsüklit, kuni see "käivitub". Inimesed, kes kasutavad välisseadmete jaoks teeke, pole sageli sellest funktsioonist teadlikud.

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.

Eriregistrite aadresside määramine
Eriregistrite aadresside määramist tuleb alustada jaotise lugemisest mälukaart juhendis. Näete, et igal plokil on oma aadressiruumi osa. Näiteks RCC ploki jaoks on see jaotis 0x4002 3800 - 0x4002 3BFF:

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.

GPIO plokk
GPIO-ploki üldiseks sissejuhatuseks soovitan tungivalt lugeda viitekäsiraamatu vastavat jaotist tervikuna. Kuigi te ei saa sellele palju tähelepanu pöörata Alternatiivne režiim. Jätame selle hilisemaks.

Nüüd on meie ülesandeks õppida, kuidas hallata MK-tihvtide olekut. Liigume edasi GPIO registrite kirjelduse juurde.

Töörežiim
Kõigepealt peate määrama pordi D as 13. kontakti töörežiimi Üldotstarbeline väljundrežiim, mis tähendab, et GPIO plokk juhib MK-viigu olekut. MK-tihvtide töörežiimi juhitakse registri abil GPIO pordirežiimi register (GPIOx_MODER) (x = A..I/J/K):

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.

GPIO pordi väljundtihvtide tööparameetrite konfigureerimine
GPIO plokk võimaldab pordi väljundviigudele rakendada lisaseadeid. Need seadistused tehakse registrites:
  • GPIO-pordi väljundtüübi register (GPIOx_OTYPER)- seadke väljundi tüüp push-pull või avatud äravooluga
  • GPIO-pordi väljundkiiruse register (GPIOx_OSPEEDR)- määrake väljundi kiirus
Me ei muuda neid parameetreid, kuna oleme vaikeväärtustega üsna rahul.
Pin MK väärtuse määramine
Lõpuks oleme jõudnud MK väljundseisundi juhtimise hetkeni. Väljundväärtuse määramiseks MK konkreetsele viigule on kaks meetodit.

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.

Lülitame LED sisse!
Olles leidnud kõigi vajalike registrite aadressid, saate kirjutada programmi, mis lülitab LED-i sisse:
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 *(allkirjata pikk*)(0x40020C00) = (*(tähiseta pikk*)(0x40020C00)& (~0x0C000000)) |(0x04000000); //Lülita LED SISSE!*(märgita pikk*) (0x40020C14) |= 0x2000; samas (1); )
oskab kompileerida ( Projekt->Koosta) ja täitke ( Projekt->Laadi alla->Laadi alla aktiivne rakendus). Või alustage silumist ( Projekt-> Dpwnload ja silumine) ja käivitage täitmine (F5).
LED põleb!
Vilkuv LED
LED-tule vilkumine pole midagi muud kui vahelduv sisse- ja väljalülitamine nende toimingute vahelise viivitusega. Lihtsaim viis on sisse- ja väljalülitamine igavesse ahelasse ning nende vahele viivitus sisestada.
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) ( //Lülita LED sisse *( märgita pikk*)(0x40020C14) |= 0x2000; //Viide for(i=0; i<1000000 ;++i); //Turn LED OFF *(unsigned long*)(0x40020C14) &= ~0x2000; //Delay for(i=0; i<1000000 ;++i); } }
Viivituse väärtus 1000000 valiti eksperimentaalselt nii, et LED-i vilkumise periood oleks silmaga nähtav, kuid mitte liiga pikk.
Algoritmi optimeerimine
Valitud LED-i vilgutamise miinuseks on see, et MK tuum veedab suurema osa oma ajast tühjade tsüklitega, kuigi see võiks midagi kasulikku teha (meie näites muid ülesandeid pole, kuid need ilmuvad tulevikus).

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.

Natuke silumisest
IAR võimaldab teil rakendusi otse riistvaras siluda. Kõik näeb välja peaaegu sama, mis arvutirakenduse silumine. Seal on samm-sammult täitmisrežiim, funktsiooni sisestamine, muutujate väärtuste vaatamine (silumisrežiimis Vaade->Kell->Vaata 1/4).

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.

Paar sõna lõpetuseks

Võib-olla ütlevad paljud, et aadresside käsitsi kirjutamine programmis pole õige, kuna tootja pakub faile registrite ja bitiväljade määratlustega, välisseadmetega töötamise teeke ja muid arendaja elu hõlbustavaid tööriistu. Olen sellega täiesti nõus, kuid arvan siiski, et esimesed sammud MK programmeerimisel tuleb teha käsitsi dokumentatsiooni süvenedes, iseseisvalt määrates kindlaks vajalikud registrid ja bitiväljad. Tulevikus ei saa te seda kasutada, kuid peate suutma seda kasutada.
Siin on vaid mõned selle väite põhjused:
  • Mõnikord on teekides tootja vigu! Kunagi jäin seetõttu projekti tähtajast peaaegu mööda. Kiipi jootsin mitu korda, arvates, et olen jootmisel kristalli kahjustanud (seda juhtus varem). Ja probleem oli selles, et raamatukogus oli eriregistri aadress valesti registreeritud. Tavaliselt juhtub see äsja turule lastud MK- või MK-liinidega.
  • Mõne tootja välisseadmetega töötamiseks mõeldud teegid ei rakenda kõiki välisseadmete võimalusi. Eriti patustasin sellega Valgusti mikro, mille TI hiljem ostis. Perifeeria lähtestamise pidin käsitsi kirjutama.
  • Paljud inimesed harjuvad MK-programmeerimise alustamisega näiteid uurides. Usun, et kõigepealt peate otsustama, mis võimaldab teil MK-d rakendada. Sellest saab aru vaid dokumentatsiooni lugedes. Kui näidetes midagi pole, ei tähenda see, et riistvara seda ei toeta. Viimane näide- riistvara tugi PTP STM32 jaoks. Muidugi võib netist midagi leida, aga see ei kuulu tootja standardkomplekti.
  • Mõnede tootjate välisseadmete draiverid on nii optimeerimata, et teegi abil viigu oleku vahetamiseks kulub kuni 20 tsüklit. See on mõne töö jaoks taskukohane luksus.

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:

  • Arduinol on 14 digitaalset I/O-porti ja 6 analoogsisendit. STM32VL-Discoveryl on 45 digitaalset sisendit/väljundit, millest 10 saab soovi korral analoogsisendiks muuta.
  • Arduinol on 32 KB programmide salvestusruumi ja 2 KB muutmälu. STM32VL-Discoveryl on 64 KB programmide salvestusruumi ja 8 KB muutmälu.
  • Arduino taktsagedus on 16 MHz, STM32VL-Discovery aga 24 MHz.
  • Mis tahes STM32 mikrokontrolleri saab asendada teise STM32-ga, kuid koos parim esitus, ilma skeemi muutmata
  • STM32 saab programmeerida ilma programmeerijata COM-pordi kaudu (sellest lähemalt hiljem)
  • Arduino hind selle kirjutamise ajal on ~ 1300 rubla, STM32VL-Discovery ~ 600 rubla. See on rohkem kui kahekordne hind!

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:

  • Digitaalne sisend - sisend, mille väärtust (loogika 1 või 0) saab programm lugeda. Kui pinge sisendis on 0, siis väärtus on 0, kui pinge sisendis on võrdne toitepingega, siis on sisendi väärtus 1. Kolmandat ei anta. Saab teha tõmbetakistiga kas toite või maanduse külge
  • Analoogsisend - sisend, mille väärtust saab programm lugeda, kuid väärtusi võib olla palju - kuni 4096. Täpsemalt, alates 0-st, kui sisendpinge on 0 miinus toiteallika suhtes. mikrokontroller väärtusele 4095, kui sisendpinge on võrdne toitepingega. Kõiki neid teisendusi teeb ADC – analoog-digitaalmuundur, millega saab näiteks mõõta termistori pinget ja teada saada temperatuuri või mõõta fototakisti pinget ja teada saada termistori heledust. sellele langeb valgus... Noh, fantaasia korral võib palju asju välja mõelda :) Kui toita mikrokontrollerit 3V-st, siis 0V = 0, ja 3V = 4096, mis tähendab 3/4096=0,000732421, st. kui pinge sisendis muutub 0,000732421V võrra, muutub programmis sisendi väärtus 1-ks. See pole ju nii keeruline, eks? Liigu edasi
  • Digitaalne sisend alternatiivse funktsiooni režiimis - sisend välisseadmetega töötamiseks. Näiteks taimeri sisend või mõne liidese sisend. Selle sisendi väärtust ei saa programmist välja lugeda. Näiteks saate programmis arvestada mõne liidese poolt sellel väljundil saadud andmeid.

Ja väljundiks konfigureeritud pordil võivad olla väljundid järgmistes režiimides:

  • Välju. Lihtsalt väljapääs. Tavaline digitaalne väljund. Kas toitepinge on viigul (loogika 1) või pole kontaktil pinget (loogika 0). Kõik on lihtne.
  • Väljund alternatiivse funktsiooni režiimis – välisseadmetega juhitav väljund. Seda väljundit ei saa programmist juhtida, kuid programmi saab panna seda väljundit juhtima näiteks liidese kaudu.

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:

  1. Kontrolli kas nupuga sisendis on pinge? (nupp sulgeb mikrokontrolleri väljundi + toitele)
  2. Kui pinget pole, siis süttib punane tuli 5 sekundiks, roheline kustub, kui pinge on, siis alustame otsast peale
  3. Kontrolli uuesti
  4. Kui pinget pole, süttib roheline tuli 5 sekundiks, punane kustub, kui pinge on, siis alustame otsast peale
  5. Alustades otsast

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:

  • Esiteks on see tasuta tarkvara. Ja see tähendab, et teie karma on puhas
  • Minu (ja mitte ainult minu) arvates on see arenduskeskkond mugavam kui ülejäänud
  • Võimaldab kasutada silumist
  • Palju näiteid, mida saab arenduskeskkonda laadida (kasulikud kassipoegadele ja mitte ainult)

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.

  1. Lähme siia
  2. torkima Laadige alla CoCenteri kaudu (soovitatav)
  3. Sisestage e-posti aadress (saate buldooserist, see on seal "näitamiseks")
  4. Pärast allalaadimist installige see CoCenter
  5. Esimesel real, kus on kirjas CooCox CoIDE torkima Lae alla
  6. Pärast allalaadimise lõpetamist, selle asemel Lae alla saab Installige. Siin ja klõpsake
  7. Lähme siia
  8. parem veerg Lae alla laadige alla fail, mis .exe. Paigaldame selle.
  9. Avame end CooCox CoIDE, vahekaart projekt, Valige Tööriistaahela tee.
  10. Määrake faili arm-none-eabi-gcc.exe tee (paigaldasime selle sammus 8, tee on ligikaudu järgmine: D: Programmifailid (x86) GNU Tools ARM Embedded4.7 2013q1bin)
  11. Ava uuesti COIDE, vajutage vaade -> Seadistamine, avage vahekaart Siluja ja tee seda [foto]
  12. Oleme rõõmsad, sest nüüd saame kirjutada programmi ja selle mikrokontrollerisse vilkuma! Mida me hakkame tegema.

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:

  • INT – seda tüüpi muutuja saab olla ainult täisarv vahemikus -2147483648 kuni 2147483647
  • FLOAT - seda tüüpi muutuja, 7-kohalise täpsusega arv vahemikus ±1,5*10-45 kuni ±3,4*1033
  • DOUBLE – 16-kohalise täpsusega number ±5*10-324 kuni ±1,7*10306
  • ULONG on samuti täisarv, kuid vahemikus 0 kuni 18446744073709551615
  • LONG – täisarv vahemikus -9223372036854775808 kuni 9223372036854775807
  • CHAR – üks märk
  • BOOL on tõeväärtus muutuja. Sellel võib olla ainult 2 väärtust: true (true) või false (false)

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)

  • + - lisamine.
  • - - lahutamine.
  • * - korrutamine.
  • / - jagunemine.
  • = - muutujale väärtuse määramine.

Näiteks väljend a=b+c tähendab muutujale määramist a muutujate väärtuste summa väärtus b ja c.

  • ++ - juurdekasv. Muutuja väärtuse suurendamine 1 võrra
  • -- - vähenemine. Muutuja väärtuse vähendamine 1 võrra

Näiteks väljend a++ tähendab muutuja väärtuse suurendamist a 1 võrra (sama mis a=a+1)

  • == võrdlus, võrdusmärk. (ÄRGE SEEGAGE ÜLESANNEGA)
  • != - võrdlus, "mitte võrdne" märk.
  • < võrdlus, vähem kui märk.
  • <= - võrdlus, märk "vähem või võrdne".
  • > - võrdlus, suurem kui märk.
  • >= - võrdlus, märk "suurem või võrdne".

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.

  • % - ülejäänud osa

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))

  • << - biti nihe vasakule. Detailidesse laskumata väljendi tähendus a< C-keeles on võrdne avaldisega a*2 b
  • >> - bitipõhine nihe paremale. Väljendus a >> b programmis on samaväärne väljendiga a/2b
  • & - loogiline Ja.
  • | - loogiline VÕI.
  • ~ - inversioon.

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:

  1. UTF-8 kodeering.
  2. Koodi parempoolses servas on 80 tähemärki.
  3. 4 tühikuga taane.

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:

  • Seade: STM32Cube Hal: tavaline
  • Seade: STM32Cube Hal: RCC
  • Seade: STM32Cube Hal: PWR
  • Seade: STM32Cube Hal: Cortex
  • Seade: STM32Cube Framework: klassikaline

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; )

Jätkub…

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(); )

Lingid

  1. Ekraanisaade" Eclipse ja GNU tööriistad ARM-i mikrokontrolleri arendamiseks «.
  2. Mikrokontroller STM32F407VG.
  3. STM32F4-Discovery silumisplaat.
  4. STM32CubeF4 teek.