Warning
This page is located in archive.

7 - Úvod do Nucleo STM32F446RE

* pro vyučující: 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ů.

  • Ke křížové kompilaci použijeme upravený Makefile a Hardware Abstraction Layer (HAL) knihovny zprostředkované výrobcem: 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 ST-toolchain

Integrované vývojové prostředí

Další alterantivou vývoje pro Nucleo STM32F446RE je využití dostupného vývojového prostředí 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 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);
courses/b3b36prg/labs/lab07.txt · Last modified: 2018/02/06 17:18 (external edit)