LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

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
 Zachęcamy do przeczytania pierwszej części artykułu

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

Absolwent Wydziału Elektroniki Politechniki Wrocławskiej, współpracownik miesięcznika Elektronika Praktyczna, autor książek o mikrokontrolerach Microchip i wyświetlaczach graficznych, wydanych nakładem Wydawnictwa BTC. Zawodowo zajmuje się projektowaniem zaawansowanych systemów mikroprocesorowych.