wtorek, 29 września 2015

[0] STM32 Nucleo - STM32F411RE Cortex M4 - Opis płyki

Tym razem chciałem zaprezentować mój nowy nabytek, którym jest płytka ewaluacyjna z mikrokontolerem STM32F411RET6. Zdecydowałem się na jej zakup ponieważ posiada bardzo duże możliwości w relatywnie niskiej cenie. Planuje poświęcić trochę czasu na naukę programowania tego rodzaju układów.

Wstęp


Głównym parametrem z jakiego zdecydowałem się na tą płytkę była jej cena (55zł), która jak na możliwości jakie zapewnia jest dosyć niska. Więc w związku z tym, że jestem osobą początkującą, takie rozwiązanie jak najbardziej mi wystarcza.


Rys. 1.1. STM32 NucleoF411RE - Wygląd zewnętrzny

Minusem tego układu jest brak już wlutowanego oscylatora zewnętrznego (kwarcu - HSE). Nie stanowi to większego problemu ponieważ można korzystać z wbudowanego oscylatora wewnętrznego. Jeśli natomiast zależy nam na większej precyzji generacji sygnału (dla wbudowanego źródła taktującego w normalnych warunkach temperaturowych błąd generacji sygnału wynosi 1%). istnieje możliwość przylutowania oscylatora zewnętrznego wraz z kondensatorami. Przygotowano pod to lutowanie specjalnie przystosowane miejsca znajdujące się tuż obok oscylatora. Możliwe jest podłączenie zewnętrznego źródła o częstotliwości 4-26 MHz. Wewnętrzny natomiast ma częstotliwość 16 MHz. Możliwe jest zaprogramowanie układu do monitorowania błędów z oscylatora zewnętrznego. Wtedy gdy wystąpi problem z działaniem układ automatycznie przeskoczy z zewnętrznego na wewnętrzny sygnał.

Rys. 1.2. Miejsce na przylutowanie oscylatora zewnętrznego

Specyfikacja mikrokontrolera zastosowanego w przedstawianej płytce [1]:

  • Rdzeń ARM Cortex M4;
  • Częstotliwość 100 MHz;
  • Flash 512 kB;
  • Pamięć SRAM 128 kb;
  • Przetwornik AC: 12 bitowy, 16 kanałowy;
  • Timery: 10;
  • Porty I/O: 81
  • 3xI2C
  • 3xUSART
  • 5xSPI
  • USB 2.0 Full Speed

Opis wyprowadzeń


Płytka wyposażona jest w dwa rodzaje wyprowadzeń. Pierwsze z nich znajdujące się od wewnątrz płytki ( złącza goldpin żeńskie ) pozwalają na podłączenie nakładek do Arduino. Nucleo jest z nimi w pełni zgodne. Drugi typ połączeń są to złącza Morpho, które stanowią wszystkie wyprowadzenia mikrokontolera. 

Poniżej przedstawiam rysunek zaczerpnięty z dokumentacji do modułu. Przedstawia on rozkład elementów na warstwie górnej.

Rys. 1.3. Rozmieszczenie elementów na płytce - warstwa górna

Nucleo składa się z dwóch zasadniczych części, górna na której znajduje się programator/debugger ST-Link/V2. Pozwala on na oddzielną pracę z wyjściem SWD. Aby możliwa była praca na zewnętrznych układach należy odłączyć obie zworki na CN2. Druga część płytki natomiast składa się z mikrokontrolera oraz umieszczonych wyprowadzeń, przycisków funkcyjnych itp. 

Jedną z możliwości jaką oferuje nam rodzina STM nucleo jest programowanie układu z wykorzystaniem kompilatora on-line mbed.pl. Dzięki tej platformie dostajemy możliwość napisania programu bez fizycznej instalacji kompilatora.


Rys. 1.4. Opis wyprowadzeń układu [3]

Pierwszy program


Pierwszy program będzie standardowy, czyli mruganie diodą wbudować. Nie ma tutaj żadnych cudów. W pierwszej kolejności deklarujemy wykorzystywane porty GPIO, potem w pętli cyklicznie włączamy i wyłączamy diodę. Przez to, że występuje tutaj mikrokontroler z tym samym rdzeniem sterowanie i wykorzystywane komendy są takie same jak w Discovery.
Dioda LED w tym przypadku jest podłączona do pinu PA5. W płytkach nucleo mamy możliwość obsługi tylko pojedynczej diody wbudowanej.

#include "stm32f4xx.h"
 
void delay(int time)
{
    int i;
    for (i = 0; i < time * 5000; i++) {}
}
 
void DiodeOn(uint16_t led);
void DiodeOff(uint16_t led);
void DiodeConfig(void);
 
int main(void)
{
 DiodeConfig();
 
    while (1) {
        DiodeOn(GPIO_Pin_5); // zapalenie diody
        delay(1000);
 
        DiodeOff(GPIO_Pin_5); // zgaszenie diody
        delay(2000);
    }
}
 
//Konfiguracja diody wbudowanej PA5
void DiodeConfig(void)
{
    GPIO_InitTypeDef gpio; // obiekt gpio z konfiguracja portow GPIO
 
    // uruchomienie zegara modulu GPIO
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 
 
    GPIO_StructInit(&gpio); //domyslna konfiguracja
    gpio.GPIO_Pin = GPIO_Pin_5; //konfigurujemy pin 5
    gpio.GPIO_Mode = GPIO_Mode_OUT; //jako wyjscie
    gpio.GPIO_OType = GPIO_OType_PP;
    gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
    gpio.GPIO_Speed = GPIO_Speed_25MHz;
    GPIO_Init(GPIOA, &gpio); // inicjalizacja modulu GPIOA
}
 
//Funkcja odpowiedzialna za zapalenie diody
void DiodeOn(uint16_t led)
{
 GPIO_SetBits(GPIOA, led);
}
 
//Funkcja odpowiedzialna za zgaszenie diody
void DiodeOff(uint16_t led)
{
 GPIO_ResetBits(GPIOA, led);
}


Bibliografia


[1]       www.botland.com.pl
[2]       UM1724 User Manual, STM32 Nucleo Boards
[3]       http://www.waveshare.com/wiki/XNUCLEO-F411RE