==== Křížová (cross) kompilace pro STM32 Nucleo ==== Realizujte výše uvedené úlohy křížovou kompilací s využitím následujících bloků. * Základem pro práci s embedded je porozumění vnitřní struktury a memory modelu konkrétního zařízení. Potřebné údaje o daném mikrokontroléru a zařízení získáme z jeho dokumentace: [[http://www.st.com/content/ccc/resource/technical/document/user_manual/98/2e/fa/4b/e0/82/43/b7/DM00105823.pdf/files/DM00105823.pdf/jcr:content/translations/en.DM00105823.pdf|technický manuál desky Nucleo-F446RE]],[[http://www.st.com/content/ccc/resource/technical/document/datasheet/65/cb/75/50/53/d6/48/24/DM00141306.pdf/files/DM00141306.pdf/jcr:content/translations/en.DM00141306.pdf|data-brief mikrokontroléru STM32F446xC/E]], [[http://www.st.com/content/ccc/resource/technical/document/reference_manual/4d/ed/bc/89/b5/70/40/dc/DM00135183.pdf/files/DM00135183.pdf/jcr:content/translations/en.DM00135183.pdf|referenční manuál mikrokontroléru STM32F446xC/E]], [[http://www.st.com/content/ccc/resource/technical/document/programming_manual/6c/3a/cb/e7/e4/ea/44/9b/DM00046982.pdf/files/DM00046982.pdf/jcr:content/translations/en.DM00046982.pdf|programovací manuál STM32F4 series]] * Ke křížové kompilaci použijeme upravený Makefile a Hardware Abstraction Layer (HAL) knihovny zprostředkované výrobcem: {{:courses:b3b36prg:labs:nucleo_base_1_0.zip|Nucleo HAL}} * Kompilace se provádí příkazem === === make ==== ==== * Nahrání na desku lze provést nahráním binárního souboru ''.bin'' na desku, jako v případě mbed, nebo přes rozhranní st-link příkazem ''st-flash write soubor.bin 0x8000000'', který je v dodaném ''Makefile'' pod cílem ''burn'' === === make burn ==== ==== * Jednoduchý program pro periodické blikání LED === === #include "stm32f4xx_hal.h" /* method to delay by busy loop */ void ms_delay(int ms) { while (ms-- > 0) { volatile int x=5971; while (x-- > 0) __asm("nop"); //no operation } } /* main function */ int main(void) { /* Enable GPIOA Clock (to be able to program the GPIO configuration registers) */ /* RCC - real-time clock control, AHB1 - advanced high-performance bus 1, ENR - enable register */ RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOAEN); /* GPIO_INIT pin PA5 - output, fast, pull-up */ GPIOA->MODER |= ((uint32_t) 0x00000001 << 10); //set port A pin 5 output; MODER - mode setup register GPIOA->OSPEEDR |= ((uint32_t) 0x00000002 << 10); //set port A pin 5 output speed fast; OSPEEDR - output speed setup register GPIOA->PUPDR |= ((uint32_t) 0x00000001 << 10); //set port A pin 5 pull-up; PUPDR - pull-up pull-down setup register /* blinking led example */ while (1) { /* toggle LED - PA5; ODR - output data register */ GPIOA->ODR ^= ((uint32_t) 0x00000001 << 5); /* wait in busy loop */ ms_delay(50); } } ==== ==== * Implementujte jednoduchý program pro ovládání LED stiskem tlačítka === === #include "stm32f4xx_hal.h" /* main function */ int main(void) { /* Enable GPIOA Clock (to be able to program the GPIO configuration registers) */ /* RCC - real-time clock control, AHB1 - advanced high-performance bus 1, ENR - enable register */ RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOAEN); /* GPIO_INIT pin PA5 - output, fast, pull-up */ GPIOA->MODER |= ((uint32_t) 0x00000001 << 10); //set port A pin 5 output; MODER - mode setup register GPIOA->OSPEEDR |= ((uint32_t) 0x00000002 << 10); //set port A pin 5 output speed fast; OSPEEDR - output speed setup register GPIOA->PUPDR |= ((uint32_t) 0x00000001 << 10); //set port A pin 5 pull-up; PUPDR - pull-up pull-down setup register /* Enable GPIOC Clock (to be able to program the GPIO configuration registers) */ RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOCEN); /* GPIO_INIT pin PC13 - input, pull-up */ GPIOC->MODER &= ~((uint32_t) 0x00000003 << 26); //set port C pin 13 input; MODER - mode setup register GPIOA->PUPDR |= ((uint32_t) 0x00000001 << 26); //set port C pin 13 pull-up; PUPDR - pull-up pull-down setup register uint32_t btn = 0; /* Btn to led control */ while (1) { /* read the button - PC13; IDR - input data register */ btn = (GPIOC->IDR) & ((uint32_t) 0x00000001 << 13); //masking bit 13 if (btn){ /* turn on LED - PA5; ODR - output data register */ GPIOA->ODR |= ((uint32_t) 0x00000001 << 5); } else { /* turn off LED - PA5; ODR - output data register */ GPIOA->ODR &= ~((uint32_t) 0x00000001 << 5); } } } ==== ==== * HAL knihovny STM obsahují množství předpřipravených metod pro práci s periferiemi. Z výukových důvodů jsou ale v předchozích programech použity přímé zápisy hodnot do registrů. ==== ==== * Návod pro instalaci cross-kompilátoru je na stránce [[courses:b3b36prg:tutorials:st_toolchain|ST-toolchain]] /* * Návod pro debugování pomocí rozhranní ST-link - [[courses:b3b36prg:tutorials:st_debug|ST-debug]] */