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.





Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć
Fotorezystor, czyli czujnik światła dwojakiego działania. Przykład innowacji w automatyce i elektronice możliwej dzięki technologii fotooporników 



