STM32NUCLEO + mbed.org = pierwsze aplikacje na STM32
Jeśli chcemy stworzyć nowy projekt na bazie już istniejącego to należy wyeksportować wybrany projekt i zaimportować go ponownie, ale już pod inną nazwą. Klikając PPM na katalogu z projektem wybieramy Export Program… (rysunek poniżej) i w otwartym okienku wybieramy projekt oraz docelowe środowisko, do którego ma być on przekonwertowany.
W ramach środowiska mbed wystarczy wybrać mbed Online IDE (mbed Tools). Po zatwierdzeniu przyciskiem Export (rysunek poniżej) zostanie wygenerowany plik archiwalny…
…który możemy zapisać na dysk (rysunek poniżej).
Import projektu dokonujemy w zakładce Upload, dostępnej po naciśnięciu przycisku Import w prawym górnym rogu (rysunek poniżej), wybierając wygenerowany przed chwilą projekt-szablon.
W okienku, jakie pojawi się po naciśnięciu przycisku Import!, wybieramy Import As Programs i wpisujemy nazwę, np. Nucleo-F334R8_LEDs (rysunek poniżej).
Na tym etapie projekt jest już skonfigurowany i można przystąpić do uzupełniania głównego pliku.
Pierwsze aplikacje w mbed
Przedstawimy dwie aplikacje realizowane w środowisku mbed – pierwsza z nich miga LED LD2 (zieloną) z częstotliwością 2 Hz. W tym celu wykorzystamy biblioteczną klasę DigitalOut, której opis można znaleźć po rozwinięciu elementu mbed, a następnie Classes (rysunek poniżej).
Kopiując przykład zawarty w dokumentacji danej klasy i kompilując projekt uzyskujemy gotowy plik, który należy zapisać na „dysk” emulowany przez Nucleo. Jak można zauważyć, nazwy takie jak LED1 są już zdefiniowane dla konkretnego zestawu (rysunek poniżej), przez co nie musimy przeglądać schematów elektrycznych celem znalezienia nazwy wyprowadzenia mikrokontrolera.
Pierwsza aplikacja wygląda następująco:
// Toggle a LED #include "mbed.h" DigitalOut led(LED1); int main() { while(1) { led = !led; wait(0.25); } }
}
}
Jak widać jej kod jest dość prosty i sprowadza się jedynie do utworzenia obiektu klasy DigitalOut za pomocą konstruktora z argumentem zdefiniowanym jako LED1, cyklicznej zmiany stanu obiektu (diody) na przeciwny oraz czekania 250 ms. Zaletą tworzenia aplikacji w języku C++ w porównaniu do zwykłego C jest możliwość wykonywania operacji z wykorzystaniem samych obiektów, bez konieczności wywoływania przy tym funkcji jak np. read()/write().
W kolejnej wersji aplikacji dodamy obsługę przycisku ogólnego przeznaczenia, po wciśnięciu którego dioda zacznie migać, a po odpuszczeniu jej ostatni stan zostanie zachowany. Tym razem potrzebny będzie jeszcze obiekt klasy DigitalIn zainicjalizowany na wartość zdefiniowaną jako USER_BUTTON. Stan przycisku odczytujemy w prosty sposób poprzez pobranie wartości zmiennej enable (obiekt klasy DigitalIn):
// Flash a LED while an USER BUTTON is pressed #include "mbed.h" DigitalIn enable(USER_BUTTON); DigitalOut led(LED1); int main() { while(1) { if(!enable) { led = !led; } wait(0.25); } }
W ostatnim przykładzie zmodyfikujemy nasz program tak, aby obsługiwał zewnętrzne diody LED podłączone do zestawu w sposób pokazany na rysunku 2 – wykorzystano tutaj moduł z 8 diodami KAmodLED8.
Rys. 2. Schemat podłączenia diod LED do zestawu Nucleo-F334R8
W danym zestawie Nucleo linie D0 oraz D1 są domyślnie odłączone od mikrokontrolera (rysunek 3) dlatego w ich miejsce wybrano odpowiednio linie D8 oraz D9.
Rys. 3. Ponieważ linie D0 i D1 są odłączone w Nucleo odłączone od GPIO mikrokontrolera, w ich miejsce użyto linii D8 i D9
W pierwszej kolejności należy utworzyć obiekty poszczególnych diod i można to zrobić deklarując tablicę obiektów klasy DigitalOut. Każdy element tablicy jest inicjalizowany przy pomocy konstruktora z argumentem zdefiniowanym jako D2…D9 (nazwy wyprowadzeń zgodne z systemem Arduino i oznaczone na płytce Nucleo). W głównej pętli programu zamiast operowania na pojedynczym obiekcie będziemy operować na elementach tablicy. Wprowadzając dodatkową zmienną zliczającą od 0 w górę i wykorzystując operację modulo będzie można uzyskać dostęp do elementów z indeksem od 0 do 7. W wyniku działania programu uzyskamy efekt przesuwającej się diody:
// Rotate a LED on KAmodLED8 module #include "mbed.h" DigitalOut KAmodLED8[] = {DigitalOut(D8), DigitalOut(D9), DigitalOut(D2), DigitalOut(D3), DigitalOut(D4), DigitalOut(D5), DigitalOut(D6), DigitalOut(D7) }; int main() { int i = 0; while(1) { // Turn on LED KAmodLED8[i % 8] = 1; // Wait 0.25 s wait(0.25); // Turn off LED KAmodLED8[i++ % 8] = 0; } }