{{indexmenu_n>7}}
====== 7 - Úvod do Nucleo STM32F446RE ======
* pro vyučující: [[courses:b3b36prg:internal:tutorialinstruction:07|]]
==== Procvičovaná témata ====
* Prostředí ''mbed.org'' a kompilace programu pro STM32F446RE
* Křížová kompilace pro STM32F446RE a flashování
* Použítí tlačítka a LED
===== Úkoly na cvičení =====
==== Vývoj v prostředí mbed.org ====
Ve webovém vývojovém prostředí [[https://developer.mbed.org/platforms/ST-Nucleo-F446RE/]] vytvořte aplikaci pro blikání LED a vyčitání stavu tlačítka.
* Vytvořte si účet, pokud jej ještě nemáte
* Založte projekt pro STM32F446RE a pojmenujte jej ''Lab07-mbed''
* Implementujte jednoduchý program pro periodické blikání LED
=== ===
#include "mbed.h"
DigitalOut myled(LED1);
int main() {
float period = 0.3; // 300 ms
while (1) {
myled = !myled;
wait(period);
}
}
==== ====
* Implementujte jednoduchý program pro ovládání LED stiskem tlačítka
=== ===
#include "mbed.h"
DigitalOut myled(LED1);
DigitalIn mybutton(USER_BUTTON);
int main() {
while (1) {
if (mybutton == 0) {
myled = 1;
} else {
myled = 0;
}
}
}
==== ====
* Program rozšiřte tak, aby jeden stisk tlačítka střídavě LED rozsvítil nebo zhasnul
==== Křížová (cross) kompilace ====
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]]
*/
==== Integrované vývojové prostředí ====
Další alterantivou vývoje pro Nucleo STM32F446RE je využití dostupného vývojového prostředí [[courses:b3b36prg:tutorials:system_workbench|System Workbench]], které je součástí OpenSTM32 vývojových nástrojů. V zásadě vývoj odpovídá křížové kompilaci, jen je nutné si ještě nakonfigurovat vývojové prostředí, které je modifikovanou verzí IDE Eclipse.
===== Další úkoly na cvičení =====
V další části cvičení pokračujte implementací domácího úkolu [[courses:b3b36prg:hw:hw08|]].
===== Procvičování binárních výrazů =====
* Maskování bitu x
* varianta 1
bit = (number >> x) & 1;
* varianta 2
bit = (number) & (x << 1);
* jaký je rozdíl mezi variantou 1 a variantou 2? Kdy použijeme kterou z nich?
* Nastavení bitu x na ''1''
number |= 1 << x;
* Nastavení bitu x na ''0''
number &= ~(1 << x);
* Přepínání bitu
number ^= 1 << x;
* Nastavení bitu podle hodnoty proměnné
number ^= (-x ^ number) & (1 << n);