Dla bardziej zaawansowanych użytkowników pakietu STM32Cube MX 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
STM32Cube MX – konfiguracja middleware
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 17.
Każda z tych opcji oprócz bibliotek dostarcza wygodne graficzne środowisko projektowe projektowania ekranów z umieszczonymi na nich widżetami, tekstem itp.
Rys. 17. Wybór dostawcy biblioteki graficznej dla Middleware GRAPHICS
STM32Cube MX – interfejs komunikacyjny do TFT
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 STM32Cube MX po wyborze modułu 32F429I DISCOVERY, który ma na pokładzie panel LCD TFT ze sterownikiem ILI9341.
Rys. 18. Wybór interfejsu LTDC
STM32Cube MX również domyślnie konfiguruje interfejs LTDC – rysunek 19.
Rys. 19. 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.
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 32F429I DISCOVERY
Rys. 20. Zakładka Parameter Settings dla Middleware GRAPHICS
Jeżeli wybierzemy opcję FreeRTOS enable to STM32Cube MX 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 poolingu.
STM32Cube MX – GUIBuilder
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 21.
Rys. 21. Uruchomienie emWinGUIBuilder
Ostatnie okno Platform Settings definiuje przypisanie linii dodatkowego interfejsu szeregowego używanego do komunikacji ze sterownikiem panelu LCD-TFT – rysunek 22.
Rys. 22. 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. Generowanie szkieletu projektu z wykonanymi przez nas konfiguracjami układów peryferyjnych i ewentualnie middleware jest wykonywane po kliknięciu na przycisk GENERATE CODE.
Rys. 23. 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 STM32Cube MX.
STM32Cube MX – middleware Graphics
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 bardziej lub mniej 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 24 . 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.
Rys. 24. Pliki źródłowe z procedurami obsługi sterownika wyświetlacza LCD-TFT
List. 1. Inicjalizacja 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); }
Procedury obsługi warstwy HAL interfejsu LTDC wykorzystywanego przez sterownik wyświetlacza są umieszczone w katalogu STM32F4xx_HAL_Driver – rysunek 25.
Rys. 25. 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 26. Co ciekawe katalog Middlewares->ST-STemWin->Software programy wykorzystywane w trakcie pracy z biblioteka graficzną.
Rys. 26. Katalog Middlewares
STM32Cube MX – konfiguracje
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 oczywiste spore udogodnienie, ale własną aplikację musimy napisać sobie 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().
List. 2. Funkcja 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(;;); }
STM32Cube MX jest ciągle rozwijany przez ST, a jego kolejne wersje są coraz doskonalsze. Wersja V5 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ę nie zrozumiałym jest brak STM32CubeMX V5 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.
Tomasz Jabłoński