První projekt na STM32
V dřívějším članku jsme si udělali teoretický úvod do světa STM32 a vybrali vhodný devkit. Dnes už ale nebudeme jen teoretizovat. Je čas na „Hello World“ každého embedded vývojáře – rozblikáme vestavěnou LED diodu na naší vývojové desce Nucleo.
Instalace STM32CubeIDE
Prvním krokem bude instalace vývojového prostředí. Budete potřebovat program STM32Cube MX ale hodit se budou i programy STM32CubeMX a STM32CubeProgrammer. Pro stažení programů této sady budete potřebovat účet na ST.com, a tento účet pak také využijete k přihlášení které bude STM32CubeIDE vyžadovat pro stažení knihoven.
Založení nového projektu
Otevřete STM32CubeIDE a v horním menu zvolte File -> New -> STM32 Project.
Teď na nás vyskočí Target Selector. Protože máme desku Nucleo, nebudeme hledat konkrétní čip v záložce MCU/MPU Selector, ale přepneme se na záložku Board Selector.
- Do vyhledávání napište název své desky (např. NUCLEO-F401RE).
- Vyberte ji v seznamu a klikněte na Next.
- Projekt pojmenujte třeba Nucleo_Blinky.
- Ostatní nastavení (Target Language: C, Binary Type: Executable) nechte tak, jak jsou, a klikněte na Finish.
Poznámka: IDE se vás zeptá, zda chcete inicializovat periferie do jejich výchozího nastavení pro danou desku. Zvolte Yes. To nám ušetří spoustu práce, protože se nám automaticky nastaví piny pro LED a tlačítko.
Konfigurace v CubeMX
Po vytvoření projektu se vám otevře soubor s příponou .ioc. To je grafické rozhraní nástroje STM32CubeMX, který je dnes již pevnou součástí IDE.
Tady vidíte čip a jeho piny. Pokud jste v předchozím kroku potvrdili inicializaci periferií, uvidíte, že jeden z pinů (obvykle PA5) svítí zeleně a má popisek LD2 [Green Led].
V tuto chvíli nemusíme nic měnit. CubeMX za nás nastavil:
- Pin PA5 jako výstupní (Output).
- System Core / RCC (zdroj hodin).
- Debug rozhraní (aby nám fungovalo nahrávání a ladění).
Stačí tedy kliknout na ikonu ozubeného kola (Device Configuration Tool Code Generation) nebo prostě projekt uložit (Ctrl + S). IDE se vás zeptá, zda chcete vygenerovat kód. Zvolte Yes.
Kde se píše kód?
V levém panelu (Project Explorer) najděte složku Core -> Src a v ní soubor main.c. Ten otevřete.
Scrollujte dolů, až narazíte na hlavní smyčku while (1). Teď pozor – tohle je nejdůležitější pravidlo pro práci se STM32CubeIDE: Svůj kód pište VŽDY mezi komentáře /* USER CODE BEGIN … */ a /* USER CODE END … */. Pokud ho napíšete jinam, CubeMX vám ho při příští změně konfigurace (při přegenerování kódu) nemilosrdně smaže!
Píšeme kód pro blikání
Najděte v main.c smyčku while (1) a upravte ji takto:
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// prepneme napetovou hodnotu na pinu PA5, pro ktery mame v CubeMX alias LD2
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
// procesor ceka 500 ms
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 *
Co ty příkazy znamenají?
- HAL_GPIO_TogglePin: Funkce z knihovny HAL (Hardware Abstraction Layer). První parametr je port (A), druhý je konkrétní pin (5).
- HAL_Delay(500): Jednoduché čekání. Číslo v závorce udává čas v milisekundách.
Tip: Pokud máte jinou desku a nevíte, na jakém pinu je LED, podívejte se do souboru main.h nebo v main.c použijte automatické doplňování (Ctrl + Mezerník) a hledejte LD2_GPIO_Port a LD2_Pin.
Sestavení a nahrání do desky
- Připojte Nucleo k počítači.
- V horní liště klikněte na ikonku kladívka (Build). V konzoli dole byste měli vidět 0 errors, 0 warnings.
- Nyní klikněte na zelenou ikonku „Play“ (Run).
- Pokud se objeví okno Edit Configuration, stačí potvrdit OK.
IDE teď přeloží kód, spojí se s programátorem ST-Link (který je přímo na desce Nucleo) a nahraje program do paměti Flash mikrokontroléru.
Výsledek
Pokud vše proběhlo v pořádku, zelená LED dioda na vaší desce by měla vesele blikat v půlvteřinových intervalech. Gratuluji, právě jste oživili svůj první STM32 projekt.
Co dál?
Blikání LEDkou je sice fajn, ale pokud jste se nezalekli, můžete se pustit do něčeho interaktivnějšího. Naučíme se používat uživatelské tlačítko a vysvětlíme si, proč není dobrý nápad používat funkci HAL_Delay() v reálných aplikacích.
