Tento díl je návodem pro začátečníky, jak začít s STM32 VL Discovery kitem a TrueSTUDIEM od Atollic. Díl je věnován vytvoření nového projektu, jeho přeložení a spuštění na VL Discovery kitu.

Úvod

Používat budeme Atollic TrueSTUDIO ve verzi Lite. O produktu TrueSTUDIO jsme si již napsali minule (kde jej stáhnout, jak nainstalovat). Předcházející díly naleznete dle odkazů na konci článku.

Začínáme tedy s čistým štítem, vlevo v Project Exploreru bychom neměli mít žádný projekt. Pokud tam nějaký svůj máte, tak proveďte "Close Project" výběrem z menu. Dostal jsem vynadáno, za to, že by jste měli mít nějak změněné TrueSTUDIO - takže začínáme s takovým stavem, jako je po nové korektní instalaci. Pokud někoho přeci jen otravuje to vyskakovací okno s návrhem na Upgrade, ať se na mě obrátí mailem.


Založíme si první projekt

Začneme tím, že z menu vybereme File, pak New a nakonec C Project. Situace je znázorněna na obrázku.




Otevře se nám okno, kde napíšeme název projektu, zde je "První projekt" a v dolním okně vybereme STM32 C Project a pak budeme pokračovat přes tlačítko Next.





Dostaneme se do dalšího okna, kde musíme nastavit jaké hardware máme. Zvolíme tedy v řádce Evaluation board místo hodnoty None aprávnou hodnotu STM32_Discovery, ostatní ponecháme a pokračujeme rovnou kliknutím na Finish (nikoliv Next).





Studio nám projekt založí, zapíše jej do Project Exploreru a rovnou přeloží. Situace je znázorněna na dalším obrázku (klikněte na Console vlevo dole, aby jste viděli co se děje - uvidíte zprávy z překladu projektu). Jako jedno z posledních je tam:
arm-atollic-eabi-objcopy -O ihex Prvníprojekt.elf Prvníprojekt.hex
Flash Converter only available in TrueSTUDIO Professional
To prostě znamená, že bin soubor objcopy si muste nahrát jiný místo toho co je součástí Studia, pokud chcete mít hex nebo bin soubory





Nyní se na to nadělení co nám vizard připravil podíváme. Klikneme na ten čtvereček s plusem vedle názvu projektu v Projekt Exploreru a projekt se rozbalí do více řádek (Binaries až k stm32_flash.ld).

Binaries
V Binaries by jste měli najít Prvniprojekt.elf, to je přeložený výsledný kód, který lze nahrát do mcu. Když elf soubor rozkliknete, tak v něm naleznete všechny soubory, které se podílejí na výsledném kódu.


Includes
Zde naleznete všechny vkládané soubory - kromě ale souborů vkládaných překladačem pro arm jádro by tam žádné jiné neměly být.


src
Zde naleznete main.c (hlavní program), stm32f10x_conf.h (odkaz na všechny hlavičkové soubory ke všem periferiím mcu), stm32f10x_it.c (obsahuje obsluhu přerušení) a jako poslední stm32f10x_it.h (hlavičkový soubor k obsluze přerušení).
Termíny hlavičkový soubor bude vysvětlen v dalším dílu na příkladu.


STM32_EVAL
V tomto adresáři toho mnoho není, měly by tu být hardverově závislé části projektu. Proto také v podadresáři Board jsou soubory STM32_Discovery (.c + .h), které popisují, kde je připojeno tlačítko a LEDky na VL Discovery kitu.


firmware
Obsahuje knihovnu pro ovládání všech periférií mcu, a knihovnu CMSIS (viz náš článek zde).


Debug
Obsahuje všechny překladačem přeložené a linkerem vytvořené soubory pro mód překladu Debug.


stm32_flash.ld
Tohle není adresář, ale soubor který obsahuje startovací a nastavovací část, která je nutná aby C program fungoval. Nedoporučuji měnit!


Program

podívejme se dvojklikem na main.c (je v src). Po dvojkliku by se nám měl soubor otevřít v okně, které je v pravé části (kurzor tam bude také). Situace je vidět na dalším obrázku. Pochopitelně že ty červené čísla jsou tam navíc!





1 - vidíte nápis Writable, tj. soubor po změně můžete zapsat. Pokud budete mít otevřený soubor třeba z CD disku, tak tam uvidíte Read Only.
2 - Smart Insert označuje, že se text vkládá. Pokud stisknete na klávesnici Insert, tak uvidíte nápis Overwrite - text se vám bude přepisovat. Další stisk klávesy Insert režim opět přepne.
3 - 10:22 označuje že kurzor máte na řádce 10 a sloupci 22.
4 - aktuální pozice kurzoru, řádek je bleděmodře vysvícený.
5 - vidíte seznam všechny elementy daného programového souboru. Pokud kliknete na ten černý křížek nad tím číslem 5, tak se skryjí neaktivní elementy.


Řízení překladu pomocí direktiv

Program může obsahovat různé varianty kódu - a ten váš main.c, co máte, jich obsahuje opravdu hodně. Pomocí definování různě nazvaných symbolů je možné řídit, co se přeloží a co ne. Na příklad pro kit Discovery je definováno USE_STM32_DISCOVERY, proto kód, který bude za #ifdef USE_STM32_DISCOVERY a před #endif bude platný. Podmínka else if se zapíše pomocí #elif.

Takže z té dlouhé konstrukce od řádku 32 do řádku 60 platí pro naše překlady jen jediný řádek a to řádek č. 53 obsahující #include "STM32_Discovery.h". Všechny ostaní řádky bychom mohli smazat a výsledek překladu by byl stejný. TrueSTUDIO nám pomáhá tak, že neplatné části programu ukazuje šedivě.

Symboly pro překlad se definují tak, že klikneme pravým tlačítkem na Prvni Project,vybereme Properties, tam C/C++ General, tam Paths and Symbols a pak druhou záložku Symbols - je to vidět na dalším obrázku.





Protože Atollic zakazuje šíření jejich kódu, tak si raději nahradíme celý main.c následujícím obsahem (abychom pak o něm v dalším dílu mohli diskutovat).

/*
* GPIO 1. dil LED blink/main.c
* <a href="http://mcu.cz"  rel="external">odkaz</a>
* Mard 2010/10/08 ver. 1.0
*/


/* Includes ------------------------------------------------------------------*/
#include <stddef.h> // komentar jen aby zobrazeni v prohlizeci bylo OK

#include "stm32f10x.h"

#include "STM32_Discovery.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/

void GPIO_Inicializace(void); // nastavení vstupne/vystupnich pinu na kitu
void Delay(__IO uint32_t nTick);

/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Main program.
  * @param  None
  * @retval : None
  */

int main(void)
{
  GPIO_Inicializace();
  while (1)
  {
    STM32_Discovery_LEDOff(LED4);        // vypnem LED4 - modra
    Delay(0x55555);
    STM32_Discovery_LEDToggle(LED4); // zapnem LED4 - modra
    Delay(0x55555);

    if(0 == STM32_Discovery_PBGetState(BUTTON_USER))
    {
      // tj. když je stisknuto tlacitko
      STM32_Discovery_LEDToggle(LED3); // zapnem LED3 - zelena
    }
    else
    {
          // tj. když není stisknuto tlacitko
      STM32_Discovery_LEDOff(LED3);   // vypnem LED3 - zelena
    }

  }
}

/**
  * @brief  Configure the GPIO Pins.
  * @param  None
  * @retval : None
  */

void GPIO_Inicializace(void)
{
  STM32_Discovery_LEDInit(LED3);
  STM32_Discovery_LEDInit(LED4);
  STM32_Discovery_PBInit(BUTTON_USER, BUTTON_MODE_GPIO);
  STM32_Discovery_LEDOff(LED3);
  STM32_Discovery_LEDOff(LED4);
}

/**
  * @brief  Cekani
  * @param nTick: delka cekaci smycky
  * @retval : None
  */

void Delay(__IO uint32_t nTick)
{
  for(; nTick != 0; nTick--);
}



Nyní kliknete na Build All (to je třetí ikonka nahoře zleva pod textem menu Refactor) - pokud na ní necháte chvíli kurzor myši, tak se vypíše název ikony. Program by se měl přeložit bez chyb.

Nyní připojíme VL Discovery kit, a mělo by se nám vypsat připojení nového hardware (pokud jej př připojujeme poprvé) a pak by se mělo otevřít okno s obsahem nového disku, který kit vytvoří (a na kitu se rozsvítí červená dioda). Okno disku zavřeme a vrátíme se zpět ke TrueSTUDIO. Klikneme na ikonu zeleného broučka (Debug).

Otevře se okno jak je znázorněno na dalším obrázku.





Nic nebudeme měnit, jen zkontrolujeme zda na druhé záložce (Debugger) je nastaven Autostart local GDB server a hlavně SWD a nikoliv JTAG! Po odkliknutí OK (pozor na firewall, musí být povolen pro GDB server, jinak z ladění nebude nic ) uvidíme situaci jako na následujícím obrázku (a druhá červená dioda na kitu začne blikat).



(po kliknutí na obrázek se zvětší)



Nyní pokud kliknete na ikonku (Resume) , co jsem tak hezky zakroužkoval a která se nachází vlevo nahoře (zelená šipka), tak se nám program rozběhne na VL Discovery kitu. Modrá LED (což je LED4) bliká stále a zelená LED (což je LED3) bliká jen když není stisknuto modré USER tlačítko. Ladění ukončíme tak, že klikneme na ikonu co vypadá jako červený čtvereček - Stop. Ladicí pohled se nám pak zavře a dostaneme se zpět do editační části IDE, ze které jsme začali ladit. Program ukončíme snadno (ale předem si nahrajeme změněný soubor - main.c).

Nyní se představme, že jsme chtěli, aby modrá LED blikala stále a zelená LED měla svítit jen při stisku tlačítka. Takže program nyní funguje špatně a musíme zjistit proč. Jak na to si ale ukážeme až v dalším dílu. Prosím zkušenější čtenáře, aby tolerovali, že program je schválně trochu špatně (přesněji, že některé věci neodpovídají komentářům), aby bylo co ladit a opravovat v dalším dílu, který bude hned následovat. Tento a příští díl (věnovaný ladění a rozdělení programu do částí) jsou dost podrobné, aby pomohly i začátečníkům a neodradily je. Další díly už budou vycházet ze skutečnosti, že podrobnosti byly zde a kdokoliv se k nim může vrátit a proto se budou věnovat spíše programování než na jaké tlačítko kliknout.


Odkazy

STM32-VL DISCOVERY popis je zde.
STM32-VL Discovery 2. (další popis, osobní poznatky) je zde.
Začínáme s STM32 VL Discovery kitem naleznete zde.
Začínáme s STM32 VL Discovery kitem 2. naleznete zde.
Začínáme s STM32 VL Discovery kitem 3. naleznete zde.
Začínáme s STM32 VL Discovery kitem 4. naleznete zde.
Začínáme s STM32 VL Discovery kitem 5. naleznete zde.
Zdrojový kód pro tento díl main.zip.

Doporučuji se rovněž podívat na QuickStart Guide k TrueSTUDIO (pdf), které najdete zde.