[2] JAVA i STM32 – ekspresowy kurs programowania z MicroEJ – obsługa GPIO
Opóźnienie między zmianami stanu diody jest realizowane przez metodę Thread.sleep(long milis), która przyjmuje liczbę milisekund uśpienia wątku, w którym została ona wywołana. Dodatkowo musi się ona znajdować w bloku try-catch, ponieważ w przypadku przerwania uśpienia wysyła do wywołującego wątku wyjątek, który należy obsłużyć.
Zmiana stanu diody może być także wykonana w odpowiedzi na zdarzenie przycisku, co zostało pokazane w metodzie performAction klasy ButtonListener (listing 4)
List. 4. Obsługa LED w metodzie performAction klasy ButtonListener
public void performAction(int value) { System.out.println("Got event number "+value); int action = Buttons.getAction(value); switch (action) { case Buttons.PRESSED: System.out.println("Button PRESSED"); Leds.setLedOn(1); break; case Buttons.RELEASED: System.out.println("Button RELEASED"); Leds.setLedOff(1); break; default: break; } }
Przed uruchomieniem przykładu warto jeszcze wspomnieć, że podczas symulacji informacje na temat platformy (w tym przypadku liczba diod i przycisków) pobierane są z pliku *-fp?definitions?frontpanel.pl. Z kolei przy uruchamianiu na fizycznym układzie informacje o platformie brane są z plików platformy *-bsp.
Uruchamianie na zestawie ewaluacyjnym
Do tej pory aplikacja budowana była dla potrzeb symulatora. Aby umożliwić uruchomienie jej na fizycznym układzie należy w konfiguracji (Run As?Run Configurations…), w zakładce Execution, wybrać opcję Execute on EmbJPF. Po udanej kompilacji można uruchomić środowisko Keil klikając na *-bsp\Project\MicroEJ\MDK-ARM\Project.uvproj i zbudować źródła w C wybierając Project?Build target. Po zakończeniu można podłączyć zestaw ewaluacyjny STM32F429I-DISCO do komputera i wybrać Flash?Download. Program powinien uruchomić się automatycznie (patrz film).
W przykładzie wykorzystywany jest system operacyjny RTX, natomiast maszyna wirtualna Javy jest uruchamiana jako jego zadanie. Można to zauważyć w pliku main.c i funkcji main, gdzie wywoływana jest funkcja os_sys_init_user(javaTask, 10, &javaTaskStack, sizeof(javaTaskStack)). Wśród źródeł można znaleźć również pliki buttons.c, zawierający funkcje konfiguracji, obsługi przerwań i przekazywania zdarzeń do wyższej warstwy aplikacji oraz LLLEDS.c, gdzie znajdują się funkcje informujące o liczbie skonfigurowanych diod oraz zmieniające ich stan.
Podczas działania aplikacji w normalnym trybie, wszystkie funkcje printf (w języku C) oraz System.out.println (w języku Java) są przekierowywane na wyjście portu szeregowego USART2. Można jednak tak skonfigurować debugger, aby dało się obserwować komunikaty bez potrzeby podłączania portu szeregowego. W celu należy zmodyfikować funkcję fputc w pliku putchar.c, zmieniając ostatnią linię (return ch) na wywołanie (return(ITM_SendChar(ch))), a w konfiguracji (Project?Options for target) włączyć opcję Enable Trace i ustawić odpowiednią częstotliwość zegara (180 MHz) – rysunek 6.
a)
b)
Rys. 6. Włączanie konsoli podczas debugowania
Rys. 7. Komunikaty funkcji printf podczas debuggowania
Domyślnie na płytce zestawu linia danych interfejsu SWD jest odłączona od procesora. Można ją podłączyć zwierając mostek SB9 lub łącząc przewodem pin 6 złącza CN2 z pinem PB3 procesora.
Aby obserwować komunikaty należy wejść w tryb debuggowania z listy Serial Windows wybrać Debug (printf) Viewer (rysunek 7).