Programujeme STM32
zdolejte jednočipy profesionálů
Ing. Vojtěch Skřivánek
2. vydání{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Configure the main internal regulator output voltage
/** Initializes the CPU, AHB and APB busses clocks
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSI
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
/** Initializes the CPU, AHB and APB busses c
podpory firem
Programujeme STM32
zdolejte jednočipy profesionálů
Ing. Vojtěch Skřivánek
2.vydání
Poděkování
Děkujifirmám SIEMENS
zapodporupřipsanítétoknihy.
Vydání první 2022
© Ing. Vojtěch Skřivánek
© Mgr. Tomáš Zahradníček - TZ-one
ISBN: 978-80-7539-131-5 (PDF verze)
ISBN: 978-80-7539-132-2 (ePub verze)
ISBN: 978-80-7539-133-9 (mobi verze)
Obsah
1Úvod
1.1Motivaceknihy
2Vývojovénástroje
2.1Vývojovádeska
2.2Vývojovéprostředí
2.3Dokumentace
4Vstupně/výstupnípiny
4.1.1Frekvencevýstupníhopinu
4.1.2Napěťovéúrovněsignálů
4.2Praktickéukázky
4.2.1TlačítkemrozsvícenáLED
4.2.1.1Založenínovéhoprojektu
4.2.1.2Konfigurátor
4.2.1.3Nastaveníperiferií
4.2.1.4Strukturaprojektu
4.2.1.5Tvorbaprogramu
4.2.1.6Spuštěníprogramu
4.2.1.7Ladění(debuggování)programu
5Přerušení
5.1Nezbytnáteorie
5.1.1Softwarovéahardwarovépřerušení
5.1.2Maskovánípřerušení
5.1.2.1Maskováníglobálníhopřerušení
5.1.2.2Maskováníspecifickéhopřerušení
5.1.3Příznakpřerušení
5.1.4Prioritapřerušení
5.1.5Vektorpřerušení
5.1.6Obsluhapřerušení(ISR)
5.2Praktickéukázky
5.2.1TlačítkemrozsvícenáLEDpomocípřerušení
5.2.1.1Nataveníperiferií
5.2.1.2Tvorbaprogramu
5.2.1.3Zapojení
5.2.1.4Rozborprogramu
5.2.1.5Callbackfunkcepřerušení
6.1Nezbytnáteorie
6.1.1Protokolkomunikace
6.1.2UARTuSTM32
6.2.1Příjemaodeslánídatbezknihoven
6.2.1.1Převodníksériovékomunikace
6.2.1.2Nastaveníperiferií
6.2.1.3Tvorbaprogramu
6.2.2LEDrozsvícenápovelemzpočítače
6.2.2.1Nastaveníperiferií
7.1.1.2Outputcompare(OC)
7.1.1.3InputCapture(IC)
7.1.1.4PWM-pulzněšířkovámodulace
7.2.1Blikánípomocíčasovačespřerušením
7.2.1.1Nastaveníhodinovéhosignálu
7.2.1.2nastaveníperiferií
7.2.1.3Tvorbaprogramu
7.2.2BlikánípomocíOCrežimu
7.2.2.1Nastaveníhodinovéhosignálu
7.2.2.2Nastaveníperiferií
7.2.2.3Tvorbaprogramu
7.2.3BlikánísnastavenímdélkypomocíICrežimu
7.2.3.1Nastaveníhodinovéhosignálu
7.2.3.2Nastaveníperiferií
7.2.3.3Tvorbaprogramu
7.2.3.4Zapojení
7.2.4NastaveníjasuLEDpomocíPWMrežimu
7.2.4.1Nastaveníhodinovéhosignálu
7.2.4.2Nastaveníperiferií
7.2.4.3Tvorbaprogramu
7.2.5Časovačspuštěnýčítačemvnějšíchudálostí
7.2.5.1Nastavenihodinovéhosignálu
7.2.5.2Nastaveníperiferií
7.2.5.3Tvorbaprogramu
7.2.5.4Zapojení
8.1.1Režimyměření
8.1.1.1Režimjednotlivéhoměřenísekvencekanálů ....................
8.1.1.2Režimnepřetržitéhoměřenísekvencekanálů
8.1.1.3Režimpřerušovanéhoměřenísekvencekanálů
8.2.1Přerušovanéměřenídvoukanálů
8.2.1.1Nastaveníperiferií
8.2.1.2Tvorbaprogramu
8.2.1.3Zapojení
8.2.2Jednotlivéměřenídvoukanálůsexternímspouštěním
8.2.2.1Nastaveníperiferií
8.2.2.2Tvorbaprogramu
9.2.1NastaveníjasuLEDpomocíDAC
10.1.3SPIuSTM32
10.2.1JednosměrnáSPIkomunikaceMaster->Slave
10.2.1.1Nastaveníperiferií
10.2.1.2Tvorbaprogramu
10.2.1.3Zapojení
10.2.2JednosměrnáSPIkomunikaceSlave->Master
10.2.2.1Nastaveníperiferií
10.2.2.2Tvorbaprogramu
10.2.2.3Zapojení
10.2.2.4Rozborprogramu
10.2.3ObousměrnáSPIkomunikaceMaster<->Slave
10.2.3.1Nastaveníperiferií
10.2.3.2Tvorbaprogramu
10.2.3.3Zapojení
10.2.3.4Rozborprogramu
10.3Kvíz
11.1.1Protokolkomunikace
11.1.1.1Startovacíaukončovacísignál
11.1.1.2Adresovýbajt ....................................
11.1.1.3Potvrzovacíbit
11.1.1.4Zpomaleníhodinovéhosignálu
11.1.2I2CuSTM32
11.2.1JednosměrnákomunikaceMaster->SlaveaMaster<-Slave
11.2.1.1Nastaveníperiferií
11.2.1.2Tvorbaprogramu ..................................
11.2.1.3Zapojení .......................................
11.2.1.4Rozborprogramu
12.3.1DMApřenoszpamětidopaměti
12.3.1.1Nastaveníperiferií
12.3.1.2Tvorbaprogramu
12.3.1.3Rozborprogramu ..................................
12.3.2DMApřenoszperiferiedopaměti
12.3.2.1Nastaveníperiferií ..................................
12.3.2.2Tvorbaprogramu
12.3.3DMApřenoszperiferiedoperiferie
12.3.3.1Nastaveníperiferií
12.3.3.2Tvorbaprogramu
12.3.3.3Zapojení
12.4Kvíz
Kapitola1
Úvod
Milý(budoucí)programátoremikrokontrolerů,takéužseTistalo,žeseschtělnaučitprogramovatnový typmikrokontroleru,alenevěděljsi,jakzačít?Netušiljsi,jakévývojovéplatformyanástrojejsoukdispozici, jakéjsoumožnostimikrokontroleruajakjejnastavitapoužívattak,abydělal,coodnějchceš?
Pokudano,jistějsivyužilinternetukhledánínepřebernéhomnožstvídokumentů,doporučení,návodů, tipů,příkladů,diskuzíafór.Vtompřípadějsitakéčastozjistil,ževelkáčástznalezenýchinformacíje oduživatelskékomunity,tvořenamnohdydomněnkami,fámami,bájemi.Apokudužjsinějakéřešenínašel, většinouneposkytloodpověďnaTvojiotázku.
Ztohodůvodujezdetatokniha,kteráTěprovedevšímzákladním,copotřebuješvědětoprogramování mikrokontrolerůSTM32.
1.1Motivaceknihy
Původnímdůvodemknapsánítétoknihybylovytvořitstudijnípodkladyprostudentypředmětu„Laboratořeaplikovanéelektroniky“(neoficiálněSiemensEmbeddedAcademy)naČVUT.Tentopředmětvedený zaměstnancifirmySiemenssijižněkolikletdávázacílnaučitstudenty,jakprogramovatmikrokontrolery STM32.Poté,cojsemsepsalkapitolykjednotlivýmpřednáškám,midošlo,žebybylaškodatytomateriály omezitpouzekúčeluvýukystudentů.Jednotlivédokumentyjsemspojilvjedencelek–knihu,kterouprávě držítevruce.
Tatoknihajeurčenapředevšímprogramátorůmmikrokontrolerů,aťužúplnýmnováčkůmčinadšencům. Takétěm,kteříjižmajínějakézkušenostismikrokontroleryjinýchznaček(PIC,AVR,MSP430)anyníby rádipracovalismikrokontrolerySTM32,alenevědí,jakzačít.Ovšemiprofesionálovétutoknihuvyužijípro rychlýpřechodzjinýchkontrolerůnaSTM32.
Avšakzřejměnejvětšímotivacíknihyjeukázatvšem,žeprogramováníprofesionálypoužívanýchčipů STM32nenítakobtížné,jaksemůžepootevřenítisícistránkovéhoreferenčníhomanuáluzdát.
Jepravda,žejižexistujípublikace,kteréoprácisSTM32pojednávají.Tytoknihyalemajímimopředností isvénedostatky.Praktickyvšechnyjsoucizojazyčné,cožsamoosoběmůžebýtnapříkladprostředoškolského studentaproblémem.OdbornécizojazyčnéknihyjsouvČRšpatnědostupnéajejichcenanebývápříznivá. Nahlédneme-lidoněkterýchznich,zjistíme,žemnohdyaninepokrývajívšechnyzákladníperiferiekontroleru. Případněsenaopakzbytečnědetailnězabývajítěmi,ježvpraxinejsoupříliščastopoužívané.Ukázkové příkladybývajízbytečněsložitéamatoucí,jeknimpotřebadalšíhardware,nebovyužívajíneoficiálníči zastaraléknihovnífunkce.
Všemtěmtonedostatkůmsesnažítatoknihavyhnout.Postupnědleobtížnostialogickénávaznostijsou popsányvšechnyzákladníperiferievjejichnejpoužívanějšíchrežimech.Příkladyjsouvelmijednoduchékpochopení,praktické,psanézapoužitíoficiálníchvývojovýchprostředkůaknihoven,ježudržujevýrobcečipů STMicroelectronics.Kevšempříkladůmstačípouzejednavývojovádeska,nenítedynutné,mimopropojovacíchdrátků,dokupovatčisnadsestavovatžádnýdodatečnýhardware.
1.2Strukturaknihy
Knihavesvýchdevítikapitoláchpopisujenejdůležitějšíperiferie,kterémajítéměřvšechnyřadymikrokontrolerůSTM32.
Každáztěchtokapitolmástejnoustrukturu.Poúvodnímslovu,kčemudanáperiferieobecněslouží, následujepodkapitolasnezbytnouteorií.Tajeurčenápředevšímtěmčtenářům,kteřískontroleryještěmoc velkézkušenostinemají.Vtétopodkapitolesezpravidlanacházíblokovýdiagramdanéperiferieajehopopis zaúčelemsnadnéhopochopeníjejíhořešeníafunkce.
Následujícípodkapitolapojednáváomožnostech,režimechčidalšíchfunkcíchdanéperiferie.Jevníblíže popsáno,couživatelimůžedanáperiferienabídnoutktomu,abysnadnodosáhlkýženéhovýsledku.Poslední podkapitoloujsouprakticképříklady,vnichžjenázorněukázáno,jakperiferiinastavitdodanéhorežimua jakjipoužívattak,abyplnilaočekávánoufunkci.
Nakoncikaždékapitolysenacházíkrátkýkvíz,kterýotestuje,zdasičtenářzdanékapitolyodnesldůležité poznatky.Kvízjeopěturčenýpředevšímpronováčky.
Každákapitolapředpokládáznalostizkapitolpředchozích,atopředevšímupříkladů.Nenítedydoporučenokapitolypřeskakovat,zvláštěpakvpřípadě,kdyčtenářnemápředchozízkušenostisžádnýmikontrolery.
Zdrojovýkódpříkladůjezdeveforměobrázků.Důvodyjsoudva.Prvníjeedukativní–čtenářtaknemůže textzkopírovatdovývojovéhoprostředí,alemusíjejskutečněnapsat.Tímtozpůsobemsičlověkspíšeuvědomí, covlastněprogramuje.Druhýmdůvodemjeto,žečtenářnaobrázkuvidí,sjakýmsouboremprojektua knihapracujejakémřádkukódudanéhosouborusenacházíme.(Našifunkcionalitutotižbudemevždypouze doplňovatdopředemvygenerovanéhokódu.)
Errataaprojektypříkladůztétoknihyjemožnénajítna www.programujemekontrolery.cz.
1.3Fontytextu
Anglickézkratky,názvynabídekapolíčekvývojovéhoprostředíanázvyregistrůjsouvždynapsánytučnou kurzívou-např. AutoReload registr.Ačbybylokonzistentnějšípoužívatvknizebuďpouzečeské,nebo anglickénázvosloví,existuje-ličeskýekvivalent(např.názvuregistru),jepoužit,jelikožlépezapadnedověty, kterájepaksrozumitelnější.
Vknizesenacházíobrázkynejčastějivpodoběblokovýchdiagramů.Vnichjsouněkteréčástizvýrazněny případněičíselněoznačeny.Natatooznačeníjevtextuodkazovánotučněpsanýmčíslemvzávorce–např. (1).
Matematickévýrazyčivzorcejsouvždynapsánykurzívou–např. (početpulzů+1)
Odkazynapoužitézdrojejsouuvedenyčíslemvhranatýchzávorkách–např.[1].
Kapitola2
Vývojovénástroje
Kprogramovánímikrokontrolerůjsouzapotřebítřizákladnínástroje.
Prvnímznichjesamozřejměsamotnýmikrokontroler.Nejsnazšímzpůsobem,jakmítkdispozicifunkční mikrokontrolerpřipravenýkprogramováníapoužíváníjehoperiferií,jeopatřitsivývojovoudesku.Firma STMicroelectronicsnabízíširokouškálucenověpříznivýchvývojovýchdesek.Mezinejznámějšípatřířadydesek Nucleo a Discovery.Tyseodsebelišítím,žezatímco Nucleo obsahujepřevážněpouzemikrokontrolera konektory, Discovery dostčastoskýtátakérozličnésenzory,tlačítka,LED,displejeajinéprvkypřipojené přímokekontroleruapřipravenékokamžitémupoužití.
Druhýmpotřebnýmnástrojemjeprogramátormikrokontroleru,kterýdokáženahrátbinárníkódzPCdo pamětiprogramučipu.Tentoprogramátorjemožnékoupitsamostatně,alevýhodouvšechvývojovýchdesek firmySTMicroelectronicsje,žekaždáznichmávsoběprogramátoradebugger(používanýkladěníprogramu) jižintegrovaný.
Zbýváposlednínástroj,ačkolivjdevlastněodva,kteréjevšakmožnoopětzískatvjednombalíčku.Prvnímjevývojovéprostředí,vekterémjemožnésnadnopsátkódaspravovatprojektprogramu.Druhýmje překladačzdrojovéhokódu,psanéhovjazyceC,dostrojovéhobinárníhokódu,kterémurozumídanýkontroler.FirmaSTMicroelectronicsnabízízdarmasvévývojovéprostředí STM32CubeIDE,vekterémjemožné napsatzdrojovýkód,přeložitjejdostrojovéhoapomocíprogramátorujejnahrátdoprogramovépaměti mikrokontroleru.
2.1Vývojovádeska
Vývojovádeska,kterájepoužitanavšechnypříkladyvtétoknize,jezřadydesek Nucleo snázvem NUCLEO-L073RZ .
VývojovádeskaNUCLEO-L073RZ[2]
Deskaobsahuje,mimomikrokontroleru STM32L073RZ ,takéjižzmíněnýprogramátoradebuggersloužícíkladěníprogramu (1).Programátorsenacházívhorníčástidesky,kteroujemožnéodspodníodlomit. KprogramováníkontrolerůmimovývojovoudeskusloužíkonektorCN4vlevéčásti (2).HorníčásttakéobsahujepřevodníkzUSBkomunikacena UART (kteréjevěnovánacelákapitolatétoknihy),jehožvývody CN3 jsouvpravoodprogramovacíhokonektoru (3).Anijedenztěchtokonektorůnenítřebapoužívat,jelikož programátoripřevodníkjsouskontroleremspojenymůstkymezihorníadolníčástídesky.
Nadolníčástideskysenacházídvětlačítka,jednoznich- B2 -sloužíkresetováníprogramumikrokontroleru (4),druhé- B1 -jeuživatelské (5),kteréjepřipojenénapinmikrokontroleruaježbudečastovyužívané vnašichpříkladech.
KroměLEDsignalizujícíchfunkciprogramátoruasprávnénapájení,jenadesceumístěnatakéjedna uživatelskáLED LD2 (6),kteroulzepinemmikrokontroleruovládat.
Nakrajíchdeskypaknelzepřehlédnoutdvatypykonektorů.VnitřnítvořenédutinkamijsoukompatibilnísevšemirozšiřujícímideskamiproplatformuArduino.Vnějšíhřebínkovéjsoupřivedenykevšempinům kontroleru.
POZOR!! Nevšechnykonektoryjsouskutečněpřipojenykpinůmkontroleru.Někdyjenutnénapříslušné místonadescepřipájetnulovýrezistor,abydošlokpropojení.Důvodemje,žedanýpinjejižpoužitnapříklad programátorem.Detailyjemožnénajítvdokumentaci Nucleo desky[2].
Kroměvýšezmíněnéhodeskaještěnabízímožnostpřipájenívlastníhopřesnéhooscilátoru,místonaměření proudovéspotřebyapřepnutínaexternínapájení.Nicztohoalevtétoknizenenívyužito.
Pokuddisponujetejinouvývojovoudeskou,snejvětšípravděpodobnostíbudetemocivětšinupříkladůtéto knihyvyzkoušettaké.Jedinývelkýrozdílbudespočívatvjinýchpinech,kteréprojednotlivéperiferiepoužijete.
2.2Vývojovéprostředí
Jakjižbylozmíněno,výrobcečipuposkytujezdarmavývojovéprostředí STM32CubeIDE,vekterém jsouvytvořenyvšechnypříkladytétoknihy.
Totoprostředívsoběobsahujekonfigurátorperiferiíčipu,programováníasprávuprojektu,nahráníprogramudomikrokontroleruamožnostjeholadění(debuggování).
Sinstalacívývojovéhoprostředníseautomatickynainstalujeiovladačprogramátoru,kterýjeumístěnýna Nucleodesce,apřekladačzezdrojovéhokódunastrojový.
STM32CubeIDE jemožnéporegistracinawebovýchstránkáchfirmySTMicroelectronicsstáhnout zcelazdarma.Nejsnazšímzpůsobemnalezeníodkazukestaženíjezadatdointernetovéhovyhledávačeheslo „STM32CubeIDE“apravděpodobněhnedprvníodkazbudemířitnasprávnoustránku,kdenajdetetaké návodnainstalaciamanuálkpoužití.
Věřím,ženenínutnépopisovatinstalacivývojovéhoprostředí,kterájeplněautomatickáanainstalujei všechnynutnéovladače.
2.3Dokumentace
Kprácismikrokontroleremavývojovoudeskoupřijdouvhodčtyřidokumenty.
Prvnímanejdůležitějšímjereferenčnímanuálmikrokontroleru[1].Tentodokumentobsahujekompletní popiskontroleru,jehofunkcíaperiferií.Pojehootevřeníjenutnénezaleknoutsepočtustránek,jelikožne všechnyjsoustejnědůležité.Veškerékapitolyoperiferiíchkontroleru,majístejnoustrukturu.Poobecném úvoduavýpisufunkcíperiferienásledujeblokovýdiagramperiferie,nakterýbudetatoknihačastoodkazovat. Kapitolapokračujepopisemjednotlivýchfunkcíarežimůperiferie.Itytoinformacejsoučastozmíněnyvtéto knize.Posledníčástíkapitolyvreferenčnímmanuálujsoupopisyregistrůspjatýchsdanouperiferií.Funkce některýchzregistrůjsouopětpopsányvtétoknize,alevětšinaznichmůžebýtspravovánaknihovními funkcemi.Tyjsoupoužityvpříkladech,aprotovětšinounenídůležitésejednotlivýmiregistryzabývat.
Druhýmdokumentemjeuživatelskýmanuálvývojovédesky Nucelo [2].Vněmlzemimojinénajít,jaké pinykontrolerujsoupřipojenykdutinkovýmahřebínkovýmkonektorůmdeskyčinakterýchpinechjepřipojenouživatelskétlačítkoauživatelskáLED.Takésevněmnacházíinformace,kterépinynejsouskonektory spojenyvůbecazdajemožnétododatečněudělatpřipájenímnulovéhorezistorunakonkrétnípájicíplošky nadesce.
Dalšímdůležitýmdokumentemjemanuál HAL knihoven[3](HardwareAbstractionLayer),kteréjsou použityvpříkladechtétoknihy.JdeooficiálníknihovnyvytvořenéaudržovanéfirmouSTMicroelectronics. Vtomtodokumentusenacházívýčetapopisvšechknihovníchfunkcíkovládáníperiferiímikrokontroleru. Jsouzdeknalezenívstupníavýstupníparametryfunkcíajejichvýznam.Obdobnýpopisjeivkomentářích souborůimplementacefunkcí.Nenítedynutnémítpřiprácinaprogramutentodokumentotevřený,stačímít vevývojovémprostředízobrazenýdanýsoubor.
Poslední,spíšedoplňkovýdokument,jekatalogovýlist(datasheet)[4]rodinymikrokontroleru.Vdokumentujsouuvedenaobecnádataomikrokontroleru,jakodruhy,početastručnýpopisvšechperiferií,velikosti pamětí,dostupnápouzdra,statickéadynamickécharakteristiky(napájeníaspotřebačipu,teplotnícharakteristiky,chybypřevodníků...),názvypinůpouzder,informaceonapájeníčipu,informacepronávrhplošného spojeaproosazení.Tentodokumentjezdeuvedenpředevšímkvůlidůležitétabulcepopisujícíjednotlivépiny kontroleru,kterájezmíněnavkapitoleovstupně/výstupníchpinech.
Všechnytytodokumentysehodívmomentě,kdysechystámepracovatsjehoperiferiínebojepotřebak mikrokontrolerupřipojitexterníperiferii.
2.4Shrnutí
Popřečtenítétokapitolybymělmítčtenářkúspěšnémunaprogramovánípříkladůuvedenýchvtétoknize připravenynásledujícínejnutnějšívěci:
• vývojovoudesku NUCLEO-L073RZ,
• USB kabelkpřipojenídeskykpočítači,
• počítačsnainstalovanýmvývojovýmprostředím STM32CubeIDE,
• a několikdrátků kvzájemnémupropojenívnějšíchkonektorůvývojovédesky.
Stoutonezbytnouvýbavou,knížjedoporučenomítkdispozicizmíněnoudokumentaci,jemožnésesměle pustitdočtenínásledujícíchkapitol,kteréodhalujíprogramovánímikrokontrolerůSTM32.
Kapitola3
Mikrokontroler
Naúvodjevhodnévestručnostiříci,cojemikrokontroler,zčehosenutněskládáajakémůžeobsahovat periferie.
Mikrokontroler(jinakmikrořadič,jednočipovýpočítaččimikropočítač)jeprogramovatelnáelektronická součástka,jejížchováníjedefinovánoprogramemuloženýmvprogramovépaměti.
Základníčástikaždéhomikrokontrolerujsou:
• Mikroprocesorovájednotka(protojeoznačenímikrokontrolerujakoprocesornebomikroprocesornepřesné,procesorjetotižpouzesoučástmikrokontroleru),
• paměťprogramu,
• operačnípaměťdat,
• vstupně/výstupníperiferie,
• asběrnicepropojujícívšechnybloky.
Beztěchtočástínemůžekontrolerfungovat.
Jakozákladníčástkontrolerubysedalnazvatizdrojhodinovýchsignálůpohánějícíprocesorovoujednotku, aletentozdrojmůžebýtiexterní(byťdnesjižkaždýkontrolermáminimálnějedenzdrojintegrovaný).
Všechnytytozákladníblokysesvýmivlastnostmilišívzávislostinavýrobciaceně.Kmitočet,naněmž pracujeprocesor,semůžepohybovatoddesítekkHzdostovekMHz,pamětiprogramuadatmohounabývat velikostiodněkolikakBdojednotekMB,avstupně/výstupníchpinůmůžebýtpouzeněkolikpárů,čipřes stovku.