Graficzny interfejs użytkownika GUI: przykład na STM32F4DISCOVERY (2)

W artykule przedstawiamy zastosowanie biblioteki „STM32 embedded GUI library” na podstawie przykładu ilustrującego w jaki sposób odbywa się dodawanie oraz wyświetlanie elementów graficznych interfejsu: etykiety i przycisku. Projekt aplikacji interfejsu graficznego został opracowany do pracy w zestawie składającym się z: płytki STM32F4Discovery, płytki bazowej DM-STF4BB oraz modułu wyświetlacza DM-LCD35RT.

 

Fot. 1. Elementy składowe układu testowego

 

 

 

Fot. 2. Układ testowy

 

Projekt aplikacji z interfejsem graficznym został opracowany w środowisku CooCox CoIDE w wersji 1.7.0 (do pobrania na stronie) z wykorzystaniem narzędzi „GNU Tools for ARM Embedded Processors” w wersji 4.7-2012-q4 (plik instalatora jest dostępny na stronie). Przed pierwszą kompilacją projektu należy sprawdzić z menu Project ? Select Toolchain Path czy ścieżka wskazuje na wymienione narzędzia GNU (rysunek 3).

 

Rys. 3. Ścieżka dostępu do narzędzi GNU

 

Implementację interfejsu graficznego rozpoczęto od stworzenia nowego projektu w środowisku CoIDE. W tym celu należało wywołać okienko dialogowe z menu Project ? New Project i podać nazwę projektu (np. DevKit407_GUI_App) oraz katalog w którym zostanie on zapisany (domyślnie jest nim katalog C:\CooCox\CoIDE\workspace\). W kolejnym okienku należało wybrać docelowy obiekt – Chip, oraz mikrokontroler – STM32F407VG. Po zatwierdzeniu powyższych danych w oknie głównym programu pojawiła się zakładka Repository w której zostały wybrane wymagane komponenty (rysunek 4) w wyniku czego w zakładce Project pojawiła się struktura projektu jak ta przedstawiona na rysunku 5.

 

Rys. 4. Wymagane komponenty

 

Rys. 5. Początkowa struktura projektu

 

W pliku stm32f4xx_conf.h należało odkomentować linijki kodu podłączające pliki nagłówkowe (te które występują w gałęzi cmsis_lib\include struktury projektu). Natomiast w pliku system_stm32f4xx.c trzeba było zmienić wartość stałej PLL_M z 25 na 8, ponieważ mikrokontroler zamontowany na płytce zestawu jest taktowany z zewnętrznego źródła o częstotliwości 8 MHz a nie 25 MHz. Oprócz tego koniecznym było zmodyfikowanie pliku startup_stm32f4xx.c, ponieważ wykorzystywana jest funkcja sprintf() ze zmiennymi typu float; należy sprawdzić czy wartość długości stosu jest parzysta (stała STACK_SIZE) oraz odnaleźć linijkę [2]:

i zamienić ją na:

Do konfiguracji parametrów pracy kompilatora i linkera służy zakładka Configuration otwierana z menu View ? Configuration. W sekcji Compile wybierany jest sprzętowy układ FPU, a w polu Defined Symbols powinny znaleźć się wymagane definicje (rysunek 6) – należy tutaj dodać tylko DevKit407.

 

Rys. 6. Zakładka Compile

 

W sekcji Link należy zaznaczyć wszystkie trzy znaczniki, z listy Library wybrać Use nano C Library i zaznaczyć znacznik Printf float (rysunek 7). Jeżeli próba kompilacji/linkowania zakończy się niepowodzeniem z powodu nieznalezionych plików libm.a i libgcc.a (sytuacja gdy włączony jest sprzętowy FPU) to należy do listy Linked Libraries dodać te pliki, przykładowo [3]:

 

Rys. 7. Zakładka Link

 

Jeżeli sterownik do programatora ST-Link/V2 jest zainstalowany w systemie to należy jeszcze sprawdzić czy w sekcji Debugger parametry są ustawione poprawnie (rysunek 8).

 

Rys. 8. Zakładka Debugger

 

Kolejną wymaganą czynnością jest dodanie plików z biblioteki „STM32 embedded GUI library” oraz plików związanych z bezpośrednią obsługą wyświetlacza – zostały one uporządkowane w trzech grupach (EmbeddedGUI_HAL, EmbeddedGUI_Library oraz DevKit407) (rysunek 9). Dodawanie nowych grup oraz plików do nich jest realizowane poprzez kliknięcie prawym przyciskiem myszy na nadrzędnym elemencie drzewa i wybranie z menu wpisu Add Group lub Add Files – środowisko CoIDE nie powtarza rzeczywistej struktury plików jaka istnieje w katalogu projektu poprzez opcję odśwież (F5).

 

Rys. 9. Struktura projektu rozszerzona o dodatkowe pliki

 

Do grupy Application (rysunek 10) zostały dodane pliki wygenerowane przez oprogramowanie Embedded UI Resource Editor (katalog GUI_ApplicationLayer) i opisane w pierwszej części artykułu. Pozostałe pliki zostały skopiowane z katalogu zawierającego szablonowe pliki źródłowe z biblioteki „STM32 embedded GUI library” (z katalogu Project\Embedded_GUI_Template\ – katalog src oraz inc).

 

Rys. 10. Struktura grupy Application

 

Jak widać (rysunek 11) biblioteka GUI została opracowana w taki sposób, że zawiera dwie oddzielne warstwy:

  • warstwa API (Application Programming Interface)
  • warstwa HAL (Hardware Abstraction Layer)

 

Rys. 11. Architektura biblioteki graficznej [5]

 

Pliki należące do warstwy API (grupa EmbeddedGUI_Library) dostarczają narzędzi w postaci funkcji umożliwiających tworzenie, modyfikację, usuwanie oraz wyświetlanie elementów interfejsu GUI. Warstwa ta jest niezależna od sprzętu na którym (mikrokontroler) i z którym (wyświetlacz, panel dotykowy) pracuje. Natomiast warstwa HAL (grupa EmbeddedGUI_HAL) zawiera sterowniki urządzeń wejścia/wyjścia i udostępnia funkcje dla wyższej warstwy API. To właśnie ona powinna być modyfikowana w zależności od tego na jakim sprzęcie pracuje.

Na potrzeby tego projektu pliki z obu warstw zostały w pewnej części zmodyfikowane w taki sposób, aby zawierały najmniej kodu oraz były przejrzyste – bez wykonywania niepotrzebnych operacji, co w przypadku standardowej biblioteki nie zawsze tak było. W projekcie warstwę HAL tworzą dwie grupy plików: DevKit407 oraz EmbeddedGUI_HAL.

Warstwa HAL: Krótka charakterystyka

Warstwę HAL tworzą cztery pliki, a pierwszym z nich jest plik LcdHal.c, który zawiera funkcje odpowiedzialne między innymi za rysowanie linii, prostokąta, okręgu, znaków oraz tekstu. Oprócz tych podstawowych procedur zdefiniowane są również takie które sterują pracą kontrolera wyświetlacza i znacząco ułatwiają rysowanie tych prostych obiektów. Oto kilka funkcji z tego pliku:

 

Rysowanie linii poziomej lub pionowej

void GL_DrawLine(uint16_t Xpos, uint8_t Ypos, uint16_t Length, uint8_t Direction)

Rysowanie linii o dowolnej orientacji z zadanymi punktami początku i końca

Wyprowadzanie symbolu (wskaźnik do tablicy opisującej symbol)

Rysowanie mapy bitowej (format BMP z nagłówkiem BITMAPV4HEADER) zapisanej jako tablica w pamięci Flash

Konfiguracja aktywnego okna wyświetlacza

Konfiguracja trybu wprowadzania pikseli

Przedostatnia funkcja GL_SetDisplayWindow() ustawia obszar w którym będą wprowadzane piksele (rysunek 12) – przy osiągnięciu granicy okna przez kursor jest on automatycznie przenoszony na przeciwległą granicę tegoż okna co pozwala np. na narysowanie pełnego prostokąta bez zbędnych funkcji LCD_SetCursor(). Natomiast znaczenie ostatniej funkcji GL_ChangeDirection() można zrozumieć patrząc na rysunek 13.

 

Rys. 12. Konfiguracja aktywnego okna wyświetlacza

 

Rys. 13. Możliwe tryby wprowadzania pikseli [4]

 

Poniżej przedstawiono inicjalizację linii portów wejścia/wyjścia, układu peryferyjnego FSMC oraz wyświetlacza LCD z kontrolerem SSD2119:

Pozostałe pliki z grupy warstwy HAL dotyczą obsługi panelu dotykowego, który podłączony jest do kontrolera STMPE811QTR będącego ekspanderem portu wejścia/wyjścia i z którym komunikacja odbywa się poprzez magistralę I2C. Poniższa funkcja realizuje odczyt pozycji, w której wykryto kliknięcie i zapisuje współrzędne do zmiennych globalnych TSC_Value_X i TSC_Value_Y:

Dotknięcie panelu jest wykrywane przez układ ekspandera, który następnie generuje na wyjściu INT odpowiedni sygnał (dotknięcie – logiczne 0, odpuszczenie – logiczna 1). Sygnał ten jest podawany na wejście PC13 mikrokontrolera i traktowany jako przerwanie zewnętrzne obsługiwane w funkcji EXTI15_10_IRQHandler():

Jan Szemiet


Materiały dodatkowe

[1] AN3128 – STM32 embedded graphic objects and touchscreen library

[2] Float variables not working in sprintf and printf, http://www.coocox.org/forum/topic.php?id=346

[3] Hard FPU/Soft FPU Libraries – http://blog.stm32f4.eu/development-chain/setting-up-coocox/

[4] Dokumentacja kontrolera SSD2119

[5] Krótki opis biblioteki Embedded GUI – http://www.emcu.it/STM32/Embedded-GUIandTOUCH-Library/EmbeddedGUIandTOUCH.html

Jan Szemiet

Do pobrania

Autor: