SVETELEKTRO

13. júla 2018   Verzia pre tlač Verzia pre tlač

STM32,  Eclipse a GCC


Tribec Zacks

Už dlhší čas sa stretávam s rozčarovaním menej skúsených elektrotechnikov pri prvých skúsenostiach s platformou ARM (Cortex-M), či už pri prechode z jednoduchších 8-bitových mikrokontrolérov, alebo so začiatkami celkovo.

Často nachádzam rôzne otázky ohľadne výberu pracovného prostredia a jeho základnej konfigurácie, ale aj prosby o rady ohľadne porozumenia zložitejšieho 32-bitového HW/SW ekosystému. Rád by som Vám preto priniesol podrobný návod v slovenskom jazyku pre správne nakonfigurovanie pracovného prostredia Eclipse s využitím definícii registrov štandardnej knižnice od STM. Výsledkom tutoriálu by malo byť pochopenie všetkých nevyhnutných krokov v nastavení open-source nástrojov, pochopenie základnej konfigurácie použitého mikrokontroléru a minimalistický “bare-metal” projekt ktorý budeme môcť použiť ako základ pre budúce projekty. Tutoriál by mal poskytnúť dobrý základ pre pochopenie a vytváranie pracovného prostredia pre akýkoľvek mikrokontrolér a s minimálnymi zmenami v konfigurácii projektu pre väčšinu Cortexov-M od STMicroelectronics.

Keďže nasledujúci tutoriál je hlavne orientovaný pre začínajúcich elektrotechnikov so základnými vedomosťami práce s mikrokontrolérmi, ktorý kladie dôraz na minimalizmus a pochopenie podstaty veci, rozhodol som sa preto vybrať čo najlacnejšie riešenie ktoré si môže vyskúšať každý. Náklady na hardvér mikrokontroléru a programátora predstavujú menej ako 5 eur, potrebný softvér a knižnice sú voľne prístupné na stiahnutie zo stránok výrobcov.

 

Použitý hardvér (zdroj ebay/aliexpress):

Cortex-M3 platforma:         STM32F103C8

  • Použitá platforma sa vyskytuje v rôznych variáciách a vyhotoveniach, jedná sa ale o ten istý mikrokontrolér s minimálnymi zmenami v zapojení regulátora napätia, filtrácie a podobne. Mikrokontrolér je trochu staršej rady F103 bežiaci na maximálnej frekvencii 72MHz, podľa platformy s 64kB alebo 128kB Flash pamäte a 20kB SRAM. Kompletnú dokumentáciu a špecifikáciu mikrokontroléru môžeme nájsť na stránke výrobcu STMicroelectronics.

 

 

 

Programátor a debuger:     "ST-Link/V2"

  • Klon SWD programátora a debugera ST-Link/V2 obsahuje “stand-alone” verziu firmvéru originálneho ST-Linku/V2 a nie je ho teda možné upgradovať na J-link od SEGGER-u ako je to možné na platformách Nucleo a Discovery, taktiež na ňom nie je prítomný výstup SWO, ten sa po jednoduchej úprave doplniť dá, jeho funkčnosť a význam ale nie je predmetom tohto návodu. Jeho výhodou je jeho cena a možnosť programovania 8 aj 32 bitových STM mikrokontrolérov.

Použitý hardvér v záverečnej demonštrácii:

 

 

 

Inštalácia programátora:

Zvolený programátor je čínska atrapa ST-Link/V2 s ktorého základnou prácou som ale nezaznamenal žiaden problém ako v Eclipse s OpenOCD, tak v Keil-e, pre serióznejšiu prácu by som ho ale neodporúčal. Pre jeho inštaláciu budeme potrebovať originálne STM ovládače, pre overenie funkčnosti môžeme použiť utilitu od STMicroelectronics, ST-LINK, alebo ktorékoľvek špecializované “IDE” ako MDK-Keil, Atollic True-Studio, DS-5 alebo iné.

 

  1. Nainštalujeme ovládače STM:

 

  1. Skontrolujeme funkčnosť ovládačov:

 

 

Po úspešnej detekcii mikrokontroléru (Menu -> Target -> Connect) môžeme mikrokontrolér odpojiť a “upgradovať” firmvér na jeho najnovšiu verziu (Menu -> ST-LINK -> Firmware update).

 

 

Inštalácia a konfigurácia pracovného prostredia:

Pracovné prostredie som zvolil Eclipse OXYGEN kvôli jeho dostupnosti, otvorenosti a hlavne univerzálnosti bez akéhokoľvek naviazania toho-ktorého dodávateľa vývojového prostredia na svoju pracovnú metodológiu, dodávané knižnice alebo automatizáciu vytvorenia projektu, ktoré často stavajú dôležité základy mimo pozornosť užívateľa. Výsledkom konfigurácie bude čisté pracovné “bare-metal” prostredie a pochopenie nevyhnutných krokov, ktoré je potrebné urobiť pre základnú prácu s mikrokontrolérom, programátorom, kompilátorom a linkerom. Jednoduchou modifikáciou vzhľadu Eclipse dosiahneme kvalitné a príjemne vypadajúce pracovné prostredie, ktoré si navyše môžeme detailne upraviť podľa seba a svojich pracovných návykov (napríklad písanie kódu, debug a nahrávanie kódu do pamäti mikrokontroléra bez nutnosti prepínania viacerých okien).

 

Inštalácia a úprava Eclipse:

Po stiahnutí a spustení inštalátora, vyberieme možnosť “Eclipse IDE for C/C++ Developers”

 

 

Zvolíme cestu k pracovnému priečinku v ktorom budú uložené všetky vytvorené projekty, môžeme zvoliť možnosť predvolenia tejto cesty, aby sme neboli pýtaní pri každom štarte Eclipse:

 

 

Doinštalujeme podporu pre prácu s mikrokontrolérmi, v menu “Help” zvolíme položku “Eclipse Marketplace” v ktorom, okrem iného, nájdeme rôzne rozšírenia:

 

 

V “Markete” vyhľadáme balík “GNU MCU Eclipse”:

 

 

Nasledovne ho nainštalujeme s výberom patričnej podpory. Keďže som zvolil cestu minimálnej a nevyhnutnej inštalácii nástrojov ktorú potrebujeme, vyberieme len absolútny základ: podporu pre ARMCC, RISC-V kompilátory, OpenOCD a podporu balíčkov. Ja som vybral aj podporu pre debuger J-link ktorý používam. Bohužiaľ v prípade balíka pre Cortex-M3 nie je pribalená knižnica CMSIS a preto ju budeme musieť doinštalovať manuálne.

 

 

Keďže základný vzhľad Eclipse je pomerne strohý, rozhodol som sa doplniť návod a opísať aj inštaláciu rozšírenia “Darkest dark” ktorý upraví prvky grafického rozhrania, pridá podporu pre tmavé témy a umožní jednoducho importovať populárne farebné témy zobrazovania kódu.

V “Markete” vyhľadáme a nainštalujeme rozšírenie “Darkest dark”:

 

 

Po úspešnej inštalácii a reštarte Eclipse prejdeme sprievodcom v ktorom si môžeme vybrať predvolený vzhľad rozhrania, svetlú, alebo tmavú tému. V mojom prípade som zvolil tému tmavú:

 

 

 

 

 

 

Po vybratí témy prostredia a editora, môžeme v podrobných nastaveniach zvoliť nízko-kontrastnú farbu ikon (Menu -> Window -> Preferences -> DevStyle -> Color Themes):

 

 

 

Výsledný vzhľad prostredia:

 

 

Inštalácia nástrojov

Pre prácu s mikrokontrolérom budeme potrebovať sériu nástrojov a knižníc ktoré sú súčasťou platených prostredí ako MDK-Keil, manuálnou inštaláciou získame prehľad o týchto (open-source) nástrojoch a bližšie sa oboznámime s pracovným prostredím ktoré Eclipse ponúka. Výhodou manuálnej inštalácie je minimálny zásah do prostredia operačného systému a vytvorenie vlastného ekosystému nachádzajúceho sa na jednom mieste v jednom priečinku operačného systému.

 

Stiahneme a nainštalujeme nasledujúce nástroje a knižnicu do priečinku Eclipse:

GNU ARM Embedded Toolchain open-source nástroje a GCC kompilátor pre architektúru ARM:

 

gnu_arm_tools1 gnu_arm_tools2

 

 

Z automaticky otvoreného textového súboru si môžeme poznačiť detaily architektúry  mikrokontroléru, ktoré budeme potrebovať pri nastavovaní projektu.

 

 

 

BuildToolsWindows verzia automatizačného nástroja “Make” pre kompilátor a linker.

 

 

 

OpenOCD – “Open On-Chip Debuger”, debugovací softvér pre komunikáciu s programátorom, stiahneme a rozbalíme do priečinku “..eclipse”.

CMSISARM knižnice a nástroje pre procesory Cortex, stiahneme a rozbalíme do priečinku “..eclipse”.

 

 

Inštalácia balíku pre Cortex-M3

Pre prácu s mikrokontrolérom musíme doinštalovať patričné definície registrov, "štart script" a podobne, ktoré sa nachádzajú v balíku. Balík nainštalujeme z prostredia Eclipse. Otvoríme “perspektívu” (pracovné okno) balíkov (Menu -> Window -> Perspective -> Open Perspective -> Other) a vyberieme položku “Packs”.

 

 

 

 

Ak sa nám nové pracovné okno neotvorí automaticky, v menu Eclipse, v pravom hornom rohu, pribudne ikona perspektívy, do ktorej sa prepneme a obnovíme definície všetkých balíkov v repozitároch, táto akcia potrvá niekoľko minút a pri niektorých balíkoch upozorní chybovými hláseniami, tieto môžeme všetky ignorovať. Po načítaní balíkov doinštalujeme podporu pre sériu procesorov STM32F1.

 

 

Nainštalovaný balík sa bude nachádzať v priečinku “..PackagesKeilSTM32F1xx_DFP” v mojom prípade: “C:UsersTzacksPackagesKeilSTM32F1xx_DFP”.

Po inštalácii sa vrátime do perspektívy projektu (ikona, C++).

 

 

 

Vytvorenie nového projektu

V hlavnom menu vytvoríme nový “C” projekt ( Menu -> File -> New -> Project).

 

 

V nasledujúcom kroku projekt pomenujeme, zvolíme prázdny projekt a vyberieme “ARM Cross GCC” kompilátor.

 

 

 

V nasledujúcom kroku môžeme vybrať a meniť konfigurácie pre “Debug” a “Release”, nemusíme nič meniť.

 

 

 

V poslednom kroku zvolíme cestu k nástrojom ARM kompilátora.

 

 

Po správnom zadaní cesty sa v prieskumníku projektu automaticky pridá priečinok “Includes” s tromi priečinkami knižníc z “Toolchainu” (obrázok nižšie). Projekt doplníme o nasledovné priečinky: “CMSIS”, “Device”, “inc” a “src”, ktoré budú obsahovať všetky zdrojové kódy. V prieskumníku klikneme pravým tlačidlom na názov projektu, v mojom prípade “new_project_template” a z ponuky vyberieme nový priečinok.

 

 

 

Po správnom vytvorení priečinkov by mal prieskumník projektu vypadať nasledovne:

 

 

 

Potrebné súbory z balíku STM32F1xx_DPF a knižnice CMSIS skopírujeme do priečinkov projektu nasledovne:

Súbor z priečinku “..DeviceInclude” z balíka:

C:UsersTzacksPackagesKeilSTM32F1xx_DFP2.2.0DeviceIncludestm32f10x.h

Do priečinku “Device” projektu:

C:UsersTzackseclipse-workspacenew_project_templateDevice

 

Súbory "Start-up" a "Linker" z balíku:

C:UsersTzackseclipseCMSIS_5-5.3.0DeviceARMARMCM3SourceGCCgcc_arm.ld

C:UsersTzackseclipseCMSIS_5-5.3.0DeviceARMARMCM3SourceGCCstartup_ARMCM3.S

Do priečinku projektu:

C:UsersTzackseclipse-workspacenew_project_template

 

Súbory z priečinku knižnice CMSIS “..CMSISCoreInclude”:

C:UsersTzackseclipseCMSIS_5-5.3.0CMSISCoreIncludecmsis_compiler.h

C:UsersTzackseclipseCMSIS_5-5.3.0CMSISCoreIncludecmsis_gcc.h

C:UsersTzackseclipseCMSIS_5-5.3.0CMSISCoreIncludecmsis_version.h

C:UsersTzackseclipseCMSIS_5-5.3.0CMSISCoreIncludecore_cm3.h

Do priečinku CMSIS projektu:

C:UsersTzackseclipse-workspacenew_project_templateCMSIS

 

 

 

 

 

Po prekopírovaní súborov vytvoríme z prostredia Eclipse nové zdrojové súbory v priečinkoch “src” (main.c) a nový “Header File” v priečinku “inc” (main.h):

 

 

 

/*

 * main.c

 *

 *  Created on: 10 Jun 2018

 *      Author: Tzacks

 */

 

#include "stm32f10x.h"

 

int main (void){

 

       while(1){

            

       }

}

Po vytvorení zdrojových súborov zapíšeme základ kódu do súboru main.c:

 

Môžeme si všimnúť, že Eclipse nahlási chybu pri zahrnutí “header” súboru stm32f10x.h pre mikrokontrolér. Potrebujeme ešte nastaviť detaily projektu, programátora, definície registrov procesora a podobne. Nastavenie pre každý projekt si Eclipse pamätá zvlášť a je ho možné upraviť v položke (Menu -> Project -> Properties).

Ako prvé si nastavíme cesty k ostatným priečinkom so zdrojovými kódmi (Menu -> Project -> Properties -> C/C++ Build -> Settings -> GNU ARM Cross C Compiler -> Includes), pridáme cesty k priečinkom z projektu, “CMSIS”, “Device” a “inc”:

 

 

Aby sme nemuseli upravovať dodávané súbory z knižníc, zapíšeme definíciu mikrokontroléru do "pre-procesora" kompilátora (Menu -> Project -> Properties -> C/C++ Build -> Settings -> GNU ARM Cross C Compiler -> Preprocessor):

 

 

V nastavení projektu vyberieme zo zoznamu zariadení použitý mikrokontrolér (Menu -> Project -> Properties -> C/C++ Build -> Settings -> Devices):

 

 

Skontrolujeme jeho nastavenie, na začiatok môžeme ponechať predvolené nastavenia, alebo sa riadiť z textového súboru otvorenom počas inštalácie “Toolchainu”:

 

 

 

 

Nastavíme cestu k skriptu "linkeru":

 

 

/* Linker script to configure memory regions. */

MEMORY

{

  FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 128K

  RAM   (rwx) : ORIGIN = 0x20000000, LENGTH = 20K

}

Po pridaní skriptu sa môžeme pokúsiť projekt skompilovať (Menu -> Project -> Build Project). Kompilácia by mala prebehnúť úspešne, keďže ale používame univerzálny linker skript “gcc_arm.ld”, tento budeme musieť editovať a upraviť veľkosť a adresy pamätí procesora nasledovne:

 

 

 

#include "stm32f10x.h"

 

int main (void){

 

       SystemInit();

 

       while(1){

 

       }

}

Ak si spomenieme na predchádzajúcu definíciu makra “STM32F10X_MD” vo vstupe pre-procesoru v nastavení projektu, tak nám nezostáva už nič iné ako volanie funkcie “SystemInit()” pre správne nastavenie PLL a systémových hodín procesoru:

 

 

 

 

 

 

 

Konfigurácia programátora:

Posledným krokom v nastavení zostáva nakonfigurovať cesty k programu OpenOCD ktorý zabezpečí komunikáciu s programátorom a nahrávanie programu, vytvoríme nové “Debug” nastavenie:

 

 

 

Pravým tlačidlom na položku “GDB OpenOCD Debugging” pridáme novú konfiguráciu:

 

 

 

 

 

 

V konfigurácii nastavenia debugeru zvolíme cestu k programu OpenOCD a dopíšeme načítanie konfiguračných skriptov pre zariadenia ktoré používame. V pod-menu “SVD Path“ zvolíme cestu k “.svd“ súboru mikrokontroléra, ktorý obsahuje všetky názvy a popisy registrov procesoru nevyhnutné pre debugovanie. Súbor je súčasťou doinštalovaného balíka.

 

 

 

J HOTOVO J

 

#include "stm32f10x.h"

 

void SW_Delay(int time){

       while(time);

}

 

int main (void){

 

       SystemInit();

 

       /* Enable clocks for GPIO C */

       RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;

 

       /* GPIOC 13 – output – push-pull */

       GPIOC->CRH &= ~GPIO_CRH_MODE13;

       GPIOC->CRH = GPIO_CRH_MODE13_1;

 

       while(1){

 

             GPIOC->ODR ^= GPIO_ODR_ODR13;

             SW_Delay(1000000);

       }

}

Pre overenie funkčnosti a nastavenia celého projektu môžeme vytvoriť mikrokontrolérový “hello world” program a rozblikať LED nachádzajúcu sa na platforme. Nastavovanie registrov je vďaka rovnakým názvom v “datasheete” a “header” súbore mikrokontroléra “system_stm32f10x.h” veľmi pohodlné a intuitívne.

 

 

Kompilácia programu (Menu -> Project -> Build Project) a jeho nahratie do Flash pamäti (ikona “Debug”) by v tomto kroku mali prebehnúť úspešne a debuger by mal automaticky zastaviť program pred volaním funkcie “SystemInit()”. Pri prepnutí Eclipse, do “debug” perspektívy, môžeme uložiť toto nastavenie prepínania perspektív a skontrolovať prípadný “breakpoint”. Pre spustenie programu, klikneme ikonu “Resume”, program by mal začať bežať a na platforme by sme mali vidieť blikajúcu LED. Pre skontrolovanie nastavenia registrov hodín a PLL otvoríme okno “Peripherals” (Menu -> Window -> Show View) a vyberieme RCC.

 

 

 

 

 

 

Pár slov na záver:

Snažil som sa, aby bol návod dostatočne detailný a zvládol ho každý, kto má záujem či už prejsť na architektúru ARM, alebo potrebu zmeniť doterajšie pracovné prostredie na univerzálne akým je Eclipse. Minimálnymi zmenami v dodávaných zdrojových súboroch by sa dala docieliť ešte lepšia nezávislosť na štandardnej knižnici, ale myslím, že kreatívny užívateľ toho bude schopný docieliť aj sám. Postup úloh pri nastavovaní prostredia pre akýkoľvek mikrokontrolér a od akéhokoľvek výrobcu bude veľmi podobný, alebo úplne totožný s rozdielom inštalácie a nastavení podpory pre programátor, výber “Toolchainu” a podobne. Na záver už len dodám, Eclipse je nesmierne univerzálne a flexibilné, po jeho prispôsobení podľa osobných preferencií, upravenia klávesových skratiek, doplnenia ikon pre rôzne úlohy, a modifikovanie celých perspektív z neho robia veľmi silného konkurenta aj iným a plateným nást

Ako sa vám páčil tento článok?
  • Páči sa mi (0)
  • Súhlasím (0)
  • Zábavné (0)
  • Informatívne (0)

Komentáre (7)

  1. jirka.jirka. píše:

    Toto nastavení ještě s nějakýma úpravama používám ke své spokojenosti. Jediný velký rozdíl je ten, že používám makefile k sestavení projektů. Možná se dokopu k tomu, že bych sem přidal návod jak na něj. Když už tu vznikl tento tutoriál. No nic, zkusím něco napsat a přepošlu jej autorovi tohoto článku, abych mu to moc nenaboural. Nebo má v plánu aj toto?? 🙂

    • Tribec Zacks píše:

      Zdar Jirka, eclipse ti ho vygeneruje pri prvej kompilacii, pak staci len edit, ale ak sa dokopes niekedy k tutorialu tak zahrn aj ako posielat parametre a phony na generovanie helpu nech je to zaujimavejsie 😉 btw k svojim projektom nepouzivam defaultnu config pll a systimeru, vsetko riesim manualne so zbytkom hw konfiguracie atd, ak bude cas a dokoncim co mam rozrobene tak mozno zosmolim nieco viac, ale to bude skor 2-3 dielny serial…

      • jirka.jirka. píše:

        Ano vím, že eclipse vygeneruje aj makefile, ale někdy (např. u nás ve firmě je tabu programovat s automat. generovaným makefilem). Vše musí být řízeno skrze něj, však všichni víme proč.
        To PHONY už u nás ve firmě taky zaznělo, tak to omrknu a uvidím co se s tím dá všechno dělat a trošku to nastudovat. Stejně mě to za chvilku dožene. 🙂

  2. bobo87 píše:

    Ahoj, pekne. Osobne pouzivam nie ciste eclipse, ale atollic TrueStudio – STM ich odkupilo a uz je to free. 🙂

    • Tribec Zacks píše:

      Zdar bobo87, viem ze je atollic free uz nejaku dobu, ale je to znacne okresane oproti celemu eclipse a stm strasne tlaci na pouzivanie hal, stmcube vsetko generuje automaticky a cloveku co zacina su tie stm prikladove projekty dost zlozite, preto tutorial k eclipsu a uplnym zakladom ako zacat… Ale inak suhlasim, ide to aj na jeden click bez inych vedomosti…

  3. Petus píše:

    No nevím… každému podle jeho chuti, ale tuhle celou proceduru si člověk ušetří použitím např. AC6 (openstm32.org) nebo zmíněného Atollic TrueStudio.

    • Tribec Zacks píše:

      Zdar Petus, samozrejme ze to ide bez toho a na jeden klik. Motivacia za tym navodom je napisana aj v clanku. Kazdopadne ak raz budes kodit pre Soc v ktorom su rozdielne cpu jadra vyzadujuce ine kompilery, alebo budes chcet kodit aj doma pre rozne mcu, tak mas moznost bud pouzivat nastroje a cele ide od kazdeho mcu/vyrobcu zvlast, alebo si nakonfigurovat prostredie ako je eclipse a mat vsetko pod jednou strechou. Vtedy sa clovek nevyhne vediet kazdy jeden krok co je v tom clanku opisany. Takze presne ako pises, kazdemu podla chuti.

Pridaj komentár