====== Začátky s platformou STM32 ====== Způsobů, jak pracovat s Nucleem je několik. Pro práci můžeme použít VS Code s nainstalovaným pluginem Platformio, [[https://os.mbed.com/studio/|Mbed Studio]], nebo můžeme třeba využít online prostředí http://mbed.org ===== MBED ===== MBED je middleware pro mikrokontroléry s architekturou ARM Cortex-M, založená na principech objektového programování v C++. Pro vývoj je možné používat online editor nebo programovat offline. ==== Založení účtu a přidání platformy ==== - [[https://mbed.org]] => MBED OS developer site - Sign up / Sign in - Compiler - Přidat vývojový kit z https://os.mbed.com/platforms/ST-Nucleo-F401RE/ - Add to your Mbed Compiler - Vrátit se zpět na stránku s přidáním platformy a vybrat NUCLEO-F401RE, select platform ==== Založení a zkompilování projektu ==== - Založit nový projekt (New) - Vybrat “Blinky LED test for the ST Nucleo boards” - Definovat Digitální výstup pro zelenou ledku na semaforu jako DigitalOut myled(D13); - Compile - Nahrát do Nuclea - Vyjmout mass storage v případě, že nedojde k restartu systému Pro většinu aplikací, které mají běžet v nekonečné smyčce (nejen embedded systémy) je poté základní konstrukce programu následující: int main(){ // inicializace programu while(1){ // nekonečná smyčka, hlavní část programu } return 0; } ===== Platformio - vytvoření projektu ===== - Platformio Home - New Project - Vyber desku **ST Nucleo F401RE** - Vyber Framework **STM32Cube** (nebo **MBED**) K vytvoření programu je potřeba vytvořit alespoň jeden zdrojový soubor např. //main.c// pomocí následujícího návodu: - Vlevo kliknout na Explorer - Vyhledat adresář **src** - Kliknout pravým tlačítkem myši a vybrat **New File** - Pojmenovat soubor např. //main.c// - Začít psát vlastní kód, který může vypadat např. následovně: ==== Example - Blikání s LED ==== LEDka je umístěna na desce Nuclea uprostřed a připojena k procesoru na pin PA5 #include "stm32f4xx.h" #define setbit(reg, bit) ((reg) |= (1U << (bit))) #define clearbit(reg, bit) ((reg) &= (~(1U << (bit)))) #define togglebit(reg, bit) ((reg) ^= (1U << (bit))) int main(void) { volatile i = 0; setbit(RCC->AHB1ENR, 0); // Enable clock to GPIOA setbit(GPIOA->MODER, 10); // Set pin PA5 as output clearbit(GPIOA->MODER, 11); clearbit(GPIOA->OTYPER, 5); // Set Push-Pull output for pin PA5 setbit(GPIOA->OSPEEDR, 10); // Set GPIO speed of pin PA5 to medium clearbit(GPIOA->OSPEEDR, 11); clearbit(GPIOA->PUPDR, 10); // Disable Pull-Up/Down for pin PA5 clearbit(GPIOA->PUPDR, 11); clearbit(GPIOA->ODR, 5); // Set Logic 0 for pint PA5 while (1){ togglebit(GPIOA->ODR, 5); // Toggle the output bit for pin PA5 for(i = 0; i < 500000; i++); // Delay } } ==== Přeložit a nahrát projekt ==== Program se zkompiluje při stisknutí na ikonku na spodním stavové liště. Vedle se poté nachází tlačítko k nahrání programu. V případě problému s přístupem k USB zařízení na Linuxu (Ubuntu distribuce), je třeba povolit přístup pro non-sudo uživatele k USB zařízení (např. /dev/ttyUSB0) následujícím příkazem sudo usermod -a -G dialout $USER ==== Ladění kódu ==== Spuštění ladění kódu se provede přes nabídku **Debug** z menu **Debug** nebo stisknutím klávesy **F5** Kód se vždy zastaví na prvním řádku funkce main(), kde debugger vyčkává na další akci uživatele. V následující tabulce je poté výčet všech možných aktivit, co se mohou vykonat: ^Funkce ^Hotkey ^Význam ^ |Continue |F5 |Pokračuje v kódu dokud program nedojde k dalšímu breakpointu nebo kód není zastaven | |Pause |F6 |Pozastaví vykonávání kódu | |Step Over|F10 |Další řádek kódu v současné funkci (pokud to lze) | |Step Into|F11 |Začne se ladit kód v dané funkci (pokud to lze) | |Restart |Ctrl+Shift+F5|Restart a spuštění programu od začátku | |Stop |Shift+F5 |Zastavení ladění programu - Program začne od začátku, ale už se nebude nikde přerušovat ani ladit| Všechny tyto funkce jsou dostupné také ve vrchní stavové liště, když se ladí program. Ladění programu má výhodu v tom, že je možné si prohlédnout stav registrů v jednotlivých částech programu a podle toho např. odhalit případnou chybu programu. Vlastní hodnota se zobrazí pouze v případě zastaveného programu (některá vývojová prostředí umožňují prohlíšet i online), který můžete vyvolat buď pauznutím běhu nebo v případě, když program dojde k breakpointu. Všechny dostupné registry jsou v levém postranním panelu v sekci **Peripherals** nebo **Registers**. V sekci **Peripherals** je nastavení všech dostupných periferií, které se mohou s daným typem procesoru využít. Zejména je poté možné i za běhu tyto registry přenastavovat, ale zde je třeba dát pozor, aby se procesor nedostal do nestabilního stavu, případně si zapamatovat změnu a tu následně implementovat do programu. V sekci **Registers** se nachází jednotlivé registry **Rxx**, kde procesory STM32 jich mají celkem 32 a poté další registry pro běh procesoru. Hodnoty registrů se dají upravovat následovně: - Vyberte registr, který chcete upravit, pravým tlačítkem myši vyberte položku **Update Value** - Napište Vaší požadovanou hotnotu, zpravidla v hexadecimálním tvaru. V případě, že v registru některé hodnoty byly, bude možná třeba některé zachovat. Úpravy hotnot registrů obecně není moc doporučování provádět, jelikož neodhalíte úplně přesný chování procesoru.