STM32Cube MX V5.0 – odświeżona wersja konfiguratora graficznego [2]
Dla bardziej zaawansowanych użytkowników STM32Cube istotna będzie możliwość dodawania funkcji warstwy middleware. W projekcie z wybranym modułem 32F429I-DISCOVERY można dodawać i konfigurować:
- System plików FATFS
- System czasu rzeczywistego FREERTOS
- Zaawansowaną bibliotekę graficzną GRAPHICS
- Bibliotekę kryptograficzną MBEDTLS
- Bibliotekę PDM2PCM do konwersji strumienia danych PDM z mikrofonu MEMS na strumień danych PCM
- Obsługę interfejsu USB_HOST
Biblioteka graficzna
Dodawanie i konfigurację Middleware pokażemy na przykładzie biblioteki graficznej GRAPHICS. Wybieramy ją z listy Middleware i w oknie Graphics Mode and Configurations trzeba wybrać jedną z dostępnych bibliotek i środowisk narzędziowych: STemWin – bezpłatną, przygotowaną dla mikrokontrolerów STM32 przez firmę Segger, lub również bezpłatną TouchGFX – rysunek 18. Każda z tych opcji, oprócz bibliotek, dostarcza wygodne graficzne środowisko projektowania ekranów z umieszczonymi na nich widżetami, tekstem itp.
Rysunek 18. Wybór dostawcy biblioteki graficznej dla Middleware GRAPHICS
W kolejnym kroku trzeba wybrać interfejs komunikacyjny ze sterownikiem panelu LCD-TFT. Możliwy do wybrania interfejs LTDC został dodany i domyślnie skonfigurowany przez STM32CubeMX po wyborze modułu 32F429IDISCOVERY, który ma na pokładzie panel LCD TFT ze sterownikiem ILI9341.
Rysunek 19. Wybór interfejsu LTDC.
STM32CubeMX również domyślnie konfiguruje interfejs LTDC – rysunek 20.
Rysunek 20. Domyślna konfiguracja interfejsu LTDC
Po wybraniu STemWin możemy przystąpić do konfigurowania biblioteki w oknie Configuration. Mamy tu do dyspozycji 4 zakładki: Parmeter Settings, STemWin, User Constans i Platform Settings.
Konfigracja parametrów
W pierwszej zakładce Parameter Settings możemy:
- Włączyć lub wyłączyć użycie graficznego narzędzia GUIBuilder przeznaczonego do projektowania ekranów interfejsu użytkownika z użyciem widżetów
- Zmienić rozdzielczość użytego wyświetlacza – domyślnie x=240, y=320
- Zmieniać ilość wirtualnych ekranów
- Wybierać rodzaj konwersji kolorów – domyślnie GUICC_565
- Rezerwować wielkość pamięci przeznaczonej na GUI
- Włączać i wyłączać użycie systemu czasu rzeczywistego FREERTOS
- Włączać wsparcie dla sterownika panelu LCD-TFT ILI9341 użytego w wyświetlaczu modułu 32F429IDISCOVERY
Rysunek 21. Zakładka Parameter Settings dla Middleware GRAPHICS
Jeżeli wybierzemy opcję FREERTOS enable to STM32CubeMX przygotuje odpowiednią domyślną konfigurację systemu czasu rzeczywistego i utworzy dedykowany wątek. Po wybraniu opcji wyłączenia RTOS wygenerowany projekt będzie działał na zasadzie pollingu.
Ustawienie możliwości użycia GUIBuilder w zakładce Parameter Settings daje możliwość (po kliknięciu na przycisk Execute) otworzenia narzędzia emWin GUIBuilder z zakładki STemWIN – rysunek 22.
Rysunek 22. Uruchomienie emWinGUIBuilder
Ostatnie okno Platform Settings definiuje przypisanie linii dodatkowego interfejsu szeregowego używanego do komunikacji ze sterownikiem panelu LCD-TFT – rysunek 23.
Rysunek 23. Przypisanie sygnałów interfejsu używanego przez sterownik panelu wyświetlacza
W podobny sposób możemy konfigurować pozostałe moduły z listy middleware.
Szkielet projektu
Generowanie szkieletu projektu z wykonanymi przez nas konfiguracjami układów peryferyjnych i ewentualnie middleware jest wykonywane po kliknięciu na przycisk GENERATE CODE.
Rysunek 24. Generowanie kodu źródłowego
Na końcu procesu generowania kodu źródłowego pojawia się okno, w którym możemy otworzyć projekt w środowisku projektowym IDE (w naszym przypadku jest to TrueStudio) wybranym w zakładce Project Manager STM32CubeMX.
Ponieważ wybraliśmy w konfiguracji middleware GRAPHICS, popatrzmy jak wygląda wsparcie obsługi wyświetlacza. Jak wiemy, panel LCD-TFT jest sterowany przez wbudowany kontroler ILI9341. To rozbudowany układ konfigurowany i sterowany przez zapisywanie wewnętrznych rejestrów. Zazwyczaj taki sterownik wymaga mniej lub bardziej zaawansowanej inicjalizacji polegającej na zapisywaniu rejestrów konfiguracyjnych. Middleware GHAPHICS wspiera obsługę wyświetlacza z tym sterownikiem i należy się spodziewać, że w projekcie znajdziemy odpowiednie procedury. W katalogu BSP umieszczono katalog ili9341, w którym są umieszczone dwa pliki: ili9341.c i ili9341.h – rysunek 25. W pliku ili9341.c została umieszczona między innymi procedura ili9341_Init() pokazana na listingu 1.
Jak widać inicjalizacja nie jest banalna i żeby ją dobrze wykonać samodzielnie, potrzeba włożyć w to wiele pracy.
Rysunek 25. Pliki źródłowe z procedurami obsługi sterownika wyświetlacza LCD-TFT
void ili9341_Init(void) { /* Initialize ILI9341 low level bus layer ----------------------------------*/ LCD_IO_Init(); /* Configure LCD */ ili9341_WriteReg(0xCA); ili9341_WriteData(0xC3); ili9341_WriteData(0x08); ili9341_WriteData(0x50); ili9341_WriteReg(LCD_POWERB); ili9341_WriteData(0x00); ili9341_WriteData(0xC1); ili9341_WriteData(0x30); ili9341_WriteReg(LCD_POWER_SEQ); ili9341_WriteData(0x64); ili9341_WriteData(0x03); ili9341_WriteData(0x12); ili9341_WriteData(0x81); ili9341_WriteReg(LCD_DTCA); ili9341_WriteData(0x85); ili9341_WriteData(0x00); ili9341_WriteData(0x78); ili9341_WriteReg(LCD_POWERA); ili9341_WriteData(0x39); ili9341_WriteData(0x2C); ili9341_WriteData(0x00); ili9341_WriteData(0x34); ili9341_WriteData(0x02); ili9341_WriteReg(LCD_PRC); ili9341_WriteData(0x20); ili9341_WriteReg(LCD_DTCB); ili9341_WriteData(0x00); ili9341_WriteData(0x00); ili9341_WriteReg(LCD_FRMCTR1); ili9341_WriteData(0x00); ili9341_WriteData(0x1B); ili9341_WriteReg(LCD_DFC); ili9341_WriteData(0x0A); ili9341_WriteData(0xA2); ili9341_WriteReg(LCD_POWER1); ili9341_WriteData(0x10); ili9341_WriteReg(LCD_POWER2); ili9341_WriteData(0x10); ili9341_WriteReg(LCD_VCOM1); ili9341_WriteData(0x45); ili9341_WriteData(0x15); ili9341_WriteReg(LCD_VCOM2); ili9341_WriteData(0x90); ili9341_WriteReg(LCD_MAC); ili9341_WriteData(0xC8); ili9341_WriteReg(LCD_3GAMMA_EN); ili9341_WriteData(0x00); ili9341_WriteReg(LCD_RGB_INTERFACE); ili9341_WriteData(0xC2); ili9341_WriteReg(LCD_DFC); ili9341_WriteData(0x0A); ili9341_WriteData(0xA7); ili9341_WriteData(0x27); ili9341_WriteData(0x04); /* Colomn address set */ ili9341_WriteReg(LCD_COLUMN_ADDR); ili9341_WriteData(0x00); ili9341_WriteData(0x00); ili9341_WriteData(0x00); ili9341_WriteData(0xEF); /* Page address set */ ili9341_WriteReg(LCD_PAGE_ADDR); ili9341_WriteData(0x00); ili9341_WriteData(0x00); ili9341_WriteData(0x01); ili9341_WriteData(0x3F); ili9341_WriteReg(LCD_INTERFACE); ili9341_WriteData(0x01); ili9341_WriteData(0x00); ili9341_WriteData(0x06); ili9341_WriteReg(LCD_GRAM); LCD_Delay(200); ili9341_WriteReg(LCD_GAMMA); ili9341_WriteData(0x01); ili9341_WriteReg(LCD_PGAMMA); ili9341_WriteData(0x0F); ili9341_WriteData(0x29); ili9341_WriteData(0x24); ili9341_WriteData(0x0C); ili9341_WriteData(0x0E); ili9341_WriteData(0x09); ili9341_WriteData(0x4E); ili9341_WriteData(0x78); ili9341_WriteData(0x3C); ili9341_WriteData(0x09); ili9341_WriteData(0x13); ili9341_WriteData(0x05); ili9341_WriteData(0x17); ili9341_WriteData(0x11); ili9341_WriteData(0x00); ili9341_WriteReg(LCD_NGAMMA); ili9341_WriteData(0x00); ili9341_WriteData(0x16); ili9341_WriteData(0x1B); ili9341_WriteData(0x04); ili9341_WriteData(0x11); ili9341_WriteData(0x07); ili9341_WriteData(0x31); ili9341_WriteData(0x33); ili9341_WriteData(0x42); ili9341_WriteData(0x05); ili9341_WriteData(0x0C); ili9341_WriteData(0x0A); ili9341_WriteData(0x28); ili9341_WriteData(0x2F); ili9341_WriteData(0x0F); ili9341_WriteReg(LCD_SLEEP_OUT); LCD_Delay(200); ili9341_WriteReg(LCD_DISPLAY_ON); /* GRAM start writing */ ili9341_WriteReg(LCD_GRAM); }
Listing 1. Inicjalizacja sterownika wyświetlacza LCD-TFT
Użycie HAL
Procedury obsługi warstwy HAL interfejsu LTDC wykorzystywanego przez sterownik wyświetlacza są umieszczone w katalogu STM32F4xx_HAL_Driver – rysunek 26.
Rysunek 26. Procedury obsługi warstwy HAL interfejsu LTDC
Skompilowaną bibliotekę graficzną emWin w wersji STemWin umieszczono w katalogu Middlewares->STemWin->Lib tak jak to pokazano na rysunku 27. Co ciekawe, katalog Middlewares->ST-STemWin->Software zawiera programy wykorzystywane w trakcie pracy z biblioteka graficzną.
Rysunek 27. Katalog Middlewares
STM32CubeMX to jak wiemy konfigurator, który bardzo ułatwia konfigurowanie układów peryferyjnych i middleware. Po wygenerowaniu kodu dostajemy szkielet projektu z plikami konfigurującymi użyte układy peryferyjne. To oczywiście spore udogodnienie, ale własną aplikację musimy napisać sami. Żeby jeszcze bardziej ułatwić pracę programiście w plikach źródłowych umieszczane są sugestie, gdzie użytkownik może dopisać swój kod , tak jak to zostało pokazane na listingu 2 w funkcji main().
int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_CRC_Init(); MX_I2C3_Init(); MX_SPI5_Init(); MX_TIM1_Init(); MX_USART1_UART_Init(); MX_USB_OTG_HS_HCD_Init(); MX_SPI3_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Initialise the graphical hardware */ GRAPHICS_HW_Init(); /* Initialise the graphical stack engine */ GRAPHICS_Init(); /* Graphic application */ GRAPHICS_MainTask(); /* Infinite loop */ for(;;); }
Listing 2. Funkcja main()
Podsumoanie
STM32CubeMX jest ciągle rozwijany przez ST, a jego kolejne wersje są coraz doskonalsze. Wersja V5.0 jest dojrzałym narzędziem, bardzo intensywnie wspierającym pracę programisty w niewdzięcznej i uciążliwej fazie konfigurowania układów peryferyjnych i middleware. Dużą zaletą jest bezpłatny, pełny dostęp do wszystkich możliwości programu. Mimo tych niezaprzeczalnych zalet trochę niezrozumiałym jest brak STM32CubeMX V5.0 w wersji wtyczki (plug–in) instalowanej na przykład w IDE opartym na Eclipse. Poprzednie wersje wtyczki miały oczywiste błędy, na przykład nie można było poprawnie skonfigurować układu taktowania, podczas gdy wersja uruchamiana niezależnie pracowała bez problemu. Praca z IDE z zainstalowaną wtyczką konfiguratora jest przynajmniej dla mnie wygodniejsza i szybsza. Mimo to STM32CubeMX wykonuje bardzo dobra pracę i jego używanie może być standardem wśród programistów używających mikrokontrolerów STM32.