Nowa generacja STM32Cube MX (2)

Nowa generacja STM32Cube MX (2)

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.hrysunek 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_Driverrysunek 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

 

div#stuning-header .dfd-stuning-header-bg-container {background-size: initial;background-position: top center;background-attachment: initial;background-repeat: initial;}#stuning-header div.page-title-inner {min-height: 650px;}