Programujeme dvoujádrové kontrolery Ing. Vojtěch Skřivánek
// nastavi Master obvody pro GPIO
GPIO_setMasterCore(DEVICE_GPIO_PIN_LED2, GPIO_CORE_CPU2); cpu2Start();
// CPU1 musi inicializovat GPIO i pro CPU2
GPIO_setPadConfig(DEVICE_GPIO_PIN_LED2, GPIO_PIN_TYPE_STD);
GPIO_setDirectionMode(DEVICE_GPIO_PIN_LED2, GPIO_DIR_MODE_OUT);
nastavUart();
SCI_writeCharArray(SCIA_BASE, "Zapiste 1/0 pro zapnuti/vypnuti LED", for(;;)
{ SCI_readCharArray(SCIA_BASE, &IpcRegs.IPCSENDDATA, 1U); if((IpcRegs.IPCSENDDATA == '0') || (IpcRegs.IPCSENDDATA == '1')) {
Poděkování Děkujifirmě SIEMENS zapodporupřipsanítétoknihy.
Vydání první 2025
© Ing. Vojtěch Skřivánek
© Mgr. Tomáš Zahradníček - TZ-one
ISBN: 978-80-7539-213-8 (PDF verze)
Obsah 1Úvod 1
1.1Motivaceknihy
2STM32WL55 3
2.1Vývojovádeska
2.2Vývojovéprostředí ...........................................4
2.3Založeníprojektu
2.4MeziprocesorovákomunikacekontroleruSTM32WL55
2.4.1SdílenápaměťaIPCCkanály
2.4.1.1ProgramjádraCPU1
2.4.1.2ProgramjádraCPU2
2.4.2Hardwarovýsemafor
2.4.2.1ProgramjádraCPU1
2.4.2.2ProgramjádraCPU2
2.4.2.3Úpravaprogramů
3LPC55S69
3.1Vývojovádeska
3.2Vývojovéprostředí
3.3Založeníprojektu
3.3.1Projektprovedlejšíjádro
3.3.2Projektprohlavníjádro
3.4MeziprocesorovákomunikacekontroleruLPC55S69
3.4.1Sdílenápaměť
3.4.2Datováschránka
4CY8C6245
4.3Založeníprojektu
4.3.0.1ProjektprojádroCM0
4.3.0.2ProjektprojádroCM4
4.4MeziprocesorovákomunikacekontroleruCY8C6245
4.4.1SdílenáRAM
4.4.2IPCPřerušení
4.4.2.1OvládáníLEDpomocípříznakuapřerušení
4.4.3IPCkomunikačníkanály
4.4.3.1Mutex
4.4.3.2Poloduplexnípřenosdatpomocíjednohokomunikačníhokanáluapřerušení ..62
5dsPIC33CH512MP508
5.1Vývojovádeska
5.2Vývojovéprostředí
5.3Založeníprojektu
5.3.1Projektprovedlejšíjádro
5.3.2Projekthlavníhojádra
5.4MeziprocesorovákomunikacekontrolerudsPIC33CH512MP508
5.4.1Virtuálnípiny
5.4.1.1Napojenídigitálníkomunikacepomocívirtuálníchpinů
5.4.2Přerušení
5.4.2.1OvládáníLEDpomocípříznakuapřerušení
5.4.2.2OvládáníLEDpomocígenerátoruspouštěníperiferií
5.4.3Datovéschránky
5.4.3.1Přenosdatpomocídatovýchschránek
5.4.4MSIzásobníkovápaměťFIFO
5.4.4.1PřenosdatpomocízásobníkovépamětiFIFO
6TMS320F28379D
6.1Vývojovádeska
6.2Vývojovéprostředí ...........................................99
6.3Založeníprojektu
6.3.1ProjektproCPU1
6.3.2ProjektproCPU2
6.3.3Nahráníprogramudokontroleru
6.4MeziprocesorovákomunikacekontroleruTMS320F28379D
6.4.1Časovačasemafory
6.4.1.1Časovač
6.4.1.2SemaforpřístupukpamětiFlashanastaveníhodinovéhosignálu
6.4.2SpuštěníCPU2 .........................................109
6.4.2.1ProgramCPU1
6.4.2.2ProgramCPU2
6.4.3Příznak .............................................111
6.4.3.1BlikáníLEDsynchronizovanépomocípříznaků
6.4.4Přerušení ............................................114
6.4.4.1OvládáníLEDpomocísériovékomunikaceapřerušení ..............114
6.4.4.2OvladáníLEDpomocísériovékomunikaceapřerušeníspříznakem .......118
6.4.5Sdílenédatovéregistry .....................................121
6.4.5.1OvládáníLEDpomocísériovékomunikaceapřerušenísdatovýmregistrem ..122
6.4.6KomunikačníRAM .......................................124
6.4.6.1Přenosdatpomocíkomunikačnídatovépaměti ..................125
6.4.7SdílenáRAM ..........................................127
6.4.7.1Přenosdatpomocísdílenédatovépamětiazměnamajiteleperiferie ......127
6.4.8Příkazovýregistr ........................................130
6.4.8.1SkokCPU2naprogram ...............................131
6.4.8.2SkokCPU2nafunkci ................................134
6.4.9PoužitíkoprocesoruCLA ...................................137
6.4.9.1BlikáníLEDpomocíCLA .............................138
Kapitola1 Úvod Vdnešnímsvětětechnickéhorozmachujsoupožadavkynavýkonaenergetickoušetrnostelektronických zařízenístálevyšší.Důvodyjsounapříkladneustálesezvyšujícístandardyzákazníků,čiintegraceumělé inteligencetam,kdeještědonedávnanebyla.Ataksevpraxistává,žejednojádrovémikrokontroleryjiž nejsoudostatečněvýkonné.Ztohotodůvodusenatrhustálečastějiobjevujíkontrolery,kteréobsahujívíce nežjednuprocesorovoujednotku.
Výhodyvícejádrovýchkontrolerůjsouzřejmé.
• Prvnívýhodoujepoměrcenyavýkonu.Jedenvícejádrovýkontrolerjelevnějšívariantanežvícejednojádrových.Důvodemje,žejsouobějádranajednomčipu,nezabírajítedytolikmístanaplošnémspoji, kterýtedymůžebýtmenší.Komunikacemeziprocesoryjerychlejší.Jádrasdílejípamětiaperiferie, kterýchjezpravidladostnato,abypokrylynašepožadavky,takženeplýtvámezdrojijakovpřípadě víceplněvybavenýchjednojádrovýchkontrolerů.
• Druhouvýhodoujepoměrvýkonuaspotřebyenergie.Efektivitakontrolerusesnižuje,čímvícesejeho taktovacíkmitočetblížíjehomaximálníhranici.Řešenímjetedyvícejádrovýkontroler,jehožprocesorové jednotkypracujínanižšíchkmitočtech,kdejejejichefektivitavysoká.Totořešeníjeenergetickyvýhodnějšínežnáhradakontroleremsvyššímmaximálnímkmitočtem,nebovíceseparovanýmikontrolery.
• Dalšívýhodoujelepšíseparaceprogramu.Vícejaderposkytujemožnostrozdělitprogramnapříklad načasověkritickoučást,vyžadujícívyššívýkon,audržovací"pomalý"program.Takéjemožnépoužít kombinacivíceoperačníchsystémů.Programjemožnérozdělitnačásti,kterémusíčinemusísplňovat požadavkynabezpečnost.Vícejaderumožňujerychlejizpracovávatvětšímnožstvípřerušení.Víceseparovanýchprogramůjesnazšíladit.Všechnytytovýhodymajíioddělenémikrokontrolery,avšak,jak jižbylořečeno,vícejádrovýkontrolertotodokážeefektivněji.
Častýmvyužitímdruhéhojádrakontrolerujejehopoužitíkimplementacikomunikačníchprotokolů,jako jsounapříkladBluetooth,WifineboModbuskomunikace.
Abychomnebylijednostranní,prácesvícejádrovýmikontrolerymáisvéneduhy.
• Pokudnejsoujádradobřespravována,můžebýtjichenergetickáspotřebavyšší.
• Pokudnenípotenciáljadernaplnovyužit,jdeodražšířešení,nežjepoužitívýkonnéhojednojádrového kontroleru.
• Laděníprogramumůžebýtvpřípaděmeziprocesorovékomunikacenáročnější.
• Správapamětianávrhprogramumůžebýtkomplikovanější.
Jakjevidět,vícejádrovékontrolerynabízívýhodyinevýhody.Velmizáležínajejichpoužitíprodanýúčel. Jednojealejisté-vdnešnímsvětěkladoucímstálevětšídůraznavýkon,budoutytokontrolerystálečastěji používányvevestavěnýchsystémech.
1.1Motivaceknihy Tatoknihasezabývádvoujádrovýmikontrolory,atopředevšímproto,žesevevestavěnýchsystémech, hnedpojednojádrových,vyskytujínejčastěji.
Knihasikladezacílčtenářeseznámitsběžnýmidvoujádrovýmimikrokontrolery,kteréjsoudostupnéna trhu.Knihazdalekanepokrývávšechnyvariantykontrolerů,alezaměřujesenacenovědostupnékontroleryk běžnémuvyužitídodávanénejvětšímivýrobcikontrolerů.
Čtenářseokaždémvtétoknizeuvedenémkontrolerudozví,jakoumáarchitekturu,jakémožnostimeziprocesorovékomunikacenabízí,jakjevyužívatajakézdrojemumohoupomocipřitvorběvlastníhoprogramu.
Knihasezabývápředevšímspecifickýminástrojimeziprocesorovékomunikacekaždéhokontroleru.Obecné radyapostupyprogramováníaplikacíprovícejádrovékontrolerynejsounáplnítétoknihy.
1.2Strukturaknihy Knihaobsahujecelkempěthlavníchkapitol.
Každáznichsezabývájednímdvoujádrovýmkontrolerem.Každýkontrolerjevyráběnjinoufirmou,aby bylyvidětrozdílyvarchitektuřekontrolerů,vývojovýchprostředích,založeníprojektu,psaníprogramua hlavněmožnostechmeziprocesorovékomunikace.
Vkaždéztétokapitoljenejprvepopsánkontroleravývojovádeska,sekterousepracujevpříkladech. Všechnyvývojovédeskyjemožnéběžnězakoupitnainternetovýchobchodechprodávajícíelektrotechnické součástky.Bylyvybíránytak,abybylycenovědostupné.Kontrolerybylyvolenynazákladědostupnostia výbavymeziprocesorovékomunikace.
Dálejepopsánainstalaceapoužitívývojovéhoprostředí,kteréjevyužitoprotvorbupříkladů.
Samostatnápodkapitolajevěnovánazaloženíprojektuprodvoujádrovýkontrolervdanémvývojovém prostředí.Jakzjistíme,nevždyjetakovávěcjednoduchá.
Poslednínejobsáhlejšípodkapitolasejižzabývánástrojimeziprocesorovékomunikacedanéhokontroleru. Povýčtuvšechnástrojůjsoutytonástrojeblížepopsányaprácesnimijenásledněukázánanapříkladech. Všechnypříkladyaerratajemožnéstáhnoutnawebovéstránce 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é,nebopouze anglickénázvosloví,existuje-ličeskýekvivalent(např.názvuregistru),jepoužit,jelikožlépezapadnedověty, kterájepaksrozumitelnější.
Odkazynapoužitézdrojejsouuvedenyčíslemvhranatýchzávorkách–např.[1].
Odkazynabodyvobrázcíchagrafechbudoupopsánytučnýmpísmemvzávorce-např. (3).
Kapitola2 STM32WL55 32bitovýmikrokontroler STM32WL55 odfirmy STMicroelectronics jekontrolersedvěmajádry ARM .Jádra Cortex-M4 (označovánojako CPU1 nebo M4 )a Cortex-M0+ (označovánojako CPU2 nebo M0P)pracujínamaximálnífrekvenci48MHz.
Obějádrasdílejíveškerouprogramovouadatovoupaměť.Sdílejísetedyivšechnyspeciálnífunkčníregistry, zčehožvyplývásdílenéužíváníperiferií.Obějádramohoubezjakéhokolivpřiřazenívyužívatjakoukoliv periferii.Tomůžebýtvněkterýchpřípadechvelicevýhodné,jindynaopak.
Periferietohotokontrolerunijaknevybočujízestandardnívýbavykontrolerůurčenýchproběžnépoužití. Jehospecialitoujezabudovanýmodulprobezdrátovoukomunikaci LoRa.Tentomodulumožňujesnadnýa energetickýúspornýbezdrátovýpřenosdat.Díkytétokombinaciperiferiíjekontrolervhodnýpropoužitív oblasti IoT .
2.1Vývojovádeska Vtétokapitolebudemepoužívatvývojovoudesku NUCLEO-WL55JC1
Deskaobsahujeprogramátora debugger sintegrovanýmpřevodníkemsériovékomunikace UART na USB (1) (spodnístranavývojovédesky).
Mimokontroleru (2) avelkéhomnožstvíkonektorů(včetněmožnostipřipojeníantényproBluetooth komunikaci)senadescenacházítřiuživatelské LED (3),třiuživatelská (4) ajednoresetovacítlačítko (5)
2.2Vývojovéprostředí
Výrobcečipuposkytujezdarmavývojovéprostředí STM32CubeIDE,vekterémjsouvytvořenyvšechny příkladytétočásti.
Totoprostředízaloženénaprostředí Eclipse vsoběobsahujekonfigurátorperiferiíčipu,programovánía správuprojektu,nahráníprogramudomikrokontroleruamožnostjeholadění.
Sinstalacívývojovéhoprostředníseautomatickynainstalujeiovladačprogramátoru,kterýjeumístěnýna vývojovédescedesce,apřekladačzezdrojovéhokódunastrojový.
STM32CubeIDE jemožnéporegistracinawebovýchstránkáchfirmySTMicroelectronics www.st.com stáhnoutzcelazdarma.Nejsnazšímzpůsobemnalezeníodkazukestaženíjezadatdointernetovéhovyhledávače heslo„STM32CubeIDE“apravděpodobněhnedprvníodkazbudemířitnasprávnoustránku,kdenajdetetaké návodnainstalaciamanuálkpoužití.
Věřím,ženenínutnépopisovatinstalacivývojovéhoprostředí,kterájeplněautomatickáaintuitivnía nainstalujeivšechnynutnéovladače.
2.3Založeníprojektu Pospuštěnívývojovéhoprostředívyberemezhornínabídkymožnost File->New->STM32project.Po chvíliseotevřeoknosnabídkouvšechkontrolerů,kteréfirma STM vyrábí.Mysevšakpřepnemedokarty svýčtemvšechvyráběnýchvývojovýchdesek.Vtétonabídcedovyhledávacíhofiltrunapíšemenázevnámi používanévývojovédeskyazvolímejivevýčtudesek.
Povýběrudeskyuvidímenovédialogovéokno,vněmžurčímenázevaumístěníprojektu.Nastavení nechámevevýchozímstavuastisknemetlačítko Finish
Popotvrzenínastaveníperiferiídojejichvýchozírežimusevytvoříprojekt,kterýnaleznemevlevéčásti prostředí.Hlavníprojektobsahujekonfiguračnísoubor(spříponou .ioc)advavnořenéprojektystotožnou strukturou.Každýzvnořenýchprojektůpatříjednomujádru.Vevnořenýchprojektechnaleznemeovladače, knihovny,alepředevšímsouborsuživatelskýmprogramem main.c.Takézdenaleznemespojovacíprogramy těchtoprojektů(spříponou .ld).
Kdyždospojovacíchprogramůnahlédneme,uvidíme,žekaždéjádrovyužívájinoučástprogramovéa datovépaměti.Díkytomusevpamětíchprogramyanidatajednotlivýchjadernepřekrývají.
SpojovacíprogramjádraCPU1
SpojovacíprogramjádraCPU2
Adresaprogramu,kamjádroporesetuskočí,jepředemdánahodnotouregistru FLASH_SRRVR (FLASHSecureSRAMstartaddressandCPU2ResetVectorRegister).Nižších16bitůtohoto registrunazvaných SBRV (CPU2BootResetVector)obsahujeadresovýposunprogramovépaměti.Hodnotajedánavpočtuslov(4bajtů).Výchozíhodnotaadresovéhoposunuporesetukontroleruje 0x8000. Vynásobeno4bajtyjdeoposun 0x20000,cožodpovídáhodnotěvespojovacímprogramujádra CPU20x08020000.Natétoadresesenacházífunkce,kterápoprovedenínezbytnýchinicializačníchoperacískočído hlavníhoprogramu.Tatofunkcesenacházívsouboru(spříponou .s)vesložce Startup.Programjepsánv jazyce assembler
Pokudotevřemesouborsnastavenímkontroleru(spříponou .ioc),spustísegrafickýkonfigurátor.Vněm naleznememimorozloženípinůkontrolerutakéseznamdostupnýchperiferií.
Vevýchozímnastaveníjevětšinapinůpřipravenapronastavení,ukteréhovýrobcepředpokládá,žejej budemechtít.Tosetýkánapříkladipinů,nakteréjsoupřipojenéuživatelské LED asériovákomunikace.
Abychommohlisériovoukomunikacipoužívatoběmajádry,jetřebavseznamuperiferiíaktivovat USART2 proobějádra.Inicializacipřenechámejádru CPU1 -tedy CM4 .Toznamená,ževevygenerovanémprogramu jádra CPU1 budevolánainicializačnífunkcetétoperiferie.
Piny(PA2 a PA3 )aparametrysériovékomunikaceužjsounastaveny,anemusímetedynicměnit. Rychlostpřenosujenastavenana115200bitůzasekundu.
Pinyprouživatelské LED (PB9 , PB11 a PB15 )jsoujižtaképřipraveny.Vnašichpříkladechbudeme využívatalevyužívatpouze LED1 připojenounapin PB15 .Využívatjibudejádro CPU1 .Abybylpinve vygenerovanémprogramujádra CPU1 inicializovánknihovnífunkcí,jetřebatentopindanémujádrupřiřadit. (Pinmůžebýtpoužívánoběmajádry,aleinicializaceproběhnepouzevjednomznich.)Toprovedemekliknutím pravéhotlačítkamyšinadanýpinavýběremjádra,kterésipinrezervuje.
Abychommohlivpřerušenípoužívatknihovnífunkciprozpoždění HAL_Delay(),musímenastavit vysokouprioritupřerušenísystémovéhočasovače(systick).Toudělámevnabídkách NVIC1 a NVIC2 tak, žeprioritutohotopřerušenínastavímenanulu.
Kdyžnyníkonfiguraciuložíme,dialogovéoknonámnabídnevygenerováníkódu,kterépřijmeme.Soubory main.c vobouprojektechnyníobsahujíinicializačnífunkce,kteréodpovídajínastavenívgrafickém konfigurátoru.
Pokudsepodívámedohlavníhoprogramujádra CPU1 ,uvidímevněmknihovnífunkcepronastavení hodinovéhosignáluaperiferií.Dálevnívidímefunkcinaspuštěnídruhéhojádra.Tuvnašemukázkovém projektu,kterýbudemepoužívatjakošablonu,zakomentujemeanahradímevlastnímpříkazemsestejnou funkcionalitou.
/*Initializeallconfiguredperipherals*/ MX_GPIO_Init();
MX_USART2_UART_Init(); /*USERCODEBEGIN2*/
/*USERCODEEND2*/
/*BootCPU2*/ //HAL_PWREx_ReleaseCore(PWR_CORE_CPU2);
/*Infiniteloop*/ /*USERCODEBEGINWHILE*/
//zapnejadroCPU2 PWR->CR4 |= PWR_CR4_C2BOOT; while (1) { /*USERCODEENDWHILE*/ /*USERCODEBEGIN3*/ } /*USERCODEEND3*/ }
Jedůležité,abychomuživatelskýkódvždyumisťovalimezikomentáře /*USERCODEBEGIN*/ a /*USERCODEEND*/ .Pokudtakneuděláme,změnímenastavenívgrafickémkonfigurátoruavygenerujemenovýkód,onášuživatelskýkódpřijdeme.
Nynísepodívejmedohlavníhoprogramujádra CPU2 (CM0 ).Vněmchybívolánívygenerovanéfunkce proinicializacisériovékomunikace.Inicializaceperiferiejeprovedenavjádru CPU1 ,anenítuprotonutná.
Periferiimůžemebezproblémůpoužívatpomocízápisůačteníregistrů.Pokudalechcemepoužívatknihovní funkcenajejíovládání,musímeizdemanuálněpřidatjejívolání.Kinicializaciperiferietedydojdedvakrát, alejelikožjdeostejnénastavení,nevadíto.
/*Initializeallconfiguredperipherals*/ MX_GPIO_Init(); /*USERCODEBEGIN2*/ /*USERCODEEND2*/
/*Infiniteloop*/ /*USERCODEBEGINWHILE*/ MX_USART2_UART_Init();
while (1)
{ /*USERCODEENDWHILE*/ /*USERCODEBEGIN3*/ }
/*USERCODEEND3*/ }
Šablonyobouprojektůjsouhotové.Nynínastavímeprojekttak,abypřeložilanahrálobaprogramy zároveň.
Vnabídceprojektůvlevéčástiobrazovkyvyberemeprojekt,kterýmápříponu CM4 .Tojeprojekt hlavníhojádrakontroleru(CPU1 ).Nahornílistěkliknemenatlačítkoladění,kterémáobrázekzeleného brouka.Tímseotevřenabídkavytvořenínovéhoprofiluladěníprogramu.(Pokudjižprofilexistuje,jemožné jejupravitkliknutímnadolusměřujícíšipkuvedletlačítkaladěníaotevřenímnastaveníprofilu.)
Vtétonabídceotevřemekartu Debugger,vekterénastavímechováníporesetu.Zvolíme Connectunder reset azaškrtnememožnost Haltallcores
Vespodníčástitétokartyověříme,žejezaškrtnutamožnost SharedST-LINK .