wtorek, 26 listopada 2019

[3] STM32 - STM32F0 - Riverdi FT801 - Revelation Board Project CooCox

W tym poście chciałbym opisać sposób obsługi wyświetlacza ze sterownikiem FT801 wraz z obsługą bazowego projektu udostępnionego przez firmę Riverdi.


Opis:


Producent udostępnił projekt testowy przygotowany w środowisku CooCox. Do projektu wykorzystano biblioteki STD.

Wykorzystywana prze zemnie płyta Revelation Board została wyposażona mikrokontroler STM32F031C6.

W celu zaprogramowania układu należy wykorzystać programator ST-Link. Po czym podłączyć się do złącza CN4 na płycie od Riverdi.

Do programowania płytki wykorzystałem programator ST-Link V2. Ale równie dobrze można wykorzystać programator z płytek Nucleo bądź inne urządzenie wspierające interfejs SWD.

Podłączenie do programatora ST-Link/V2:


  • 1 - VCC
  • 7 - SWDIO
  • 9 - SWCLK
  • 15 - RESET (Opcjonalnie)
  • 20 - GND

Poprawność podłączenia może zostać sprawdzona za pomocą programu ST-Link Utility. Po podłączeniu programatora do komputera oraz do mikrokontrolera i wciśnięciu przycisku Connect to the target powinien wyświetlić się program odczytany z urządzenia:


CooCox:


Poniżej opiszę projekt udostępniony przez firmę Riverdi. Przygotowany w środowisku CooCox.

Projekt pozwala na obsługę wielu wyświetlaczy firmy Riverdi. W moim przypadku jest to wyświetlacz z pojemnościowym panelem dotykowym oraz przekątną ekranu 4'3 cala.

W celu korzystania z projektu w środowisku przygotowanym przez producenta należy pobrać CooCox CoIDE np. w wersji 1.7.8 oraz zainstalować potrzebne biblioteki w postaci pliku gcc-arm-none-eabi-5_4-2016q3-20160926-win32.exe. Następnie po uruchomieniu projektu należy podać ścieżkę do zainstalowanych narzędzi (Project->Select Toolchain Path):

C:\Program Files\GNU Tools ARM Embedded\5.4 2016q3\bin

Projekt zawiera szereg funkcji pozwalających na obsługę wyświetlaczy z sterownikiem FT801 bądź FT800.

Komunikacja z wyświetlaczem odbywa się przez interfejs SPI oraz biblioteki STD dla mikrokontrolera STM32F0. Dane przesyłane są za pomocą następującej funkcji:

  1. unsigned char SPI_SendByte(unsigned char data)
  2. {
  3.     /* Wait until the transmit buffer is empty */
  4.     while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) { }
  5.     /* Send the byte */
  6.     SPI_SendData8(SPI1, data);
  7.     /* Wait to receive a byte*/
  8.     while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) { }
  9.    
  10.     /* Return the byte read from the SPI bus */
  11.     return SPI_ReceiveData8(SPI1);
  12. }

W celu przesłania danych do wyświetlacza można posłużyć się następującymi komendami:

  1. ft_uint8_t Ft_Gpu_Hal_Rd8(Ft_Gpu_Hal_Context_t *host,ft_uint32_t addr);
  2. ft_uint16_t Ft_Gpu_Hal_Rd16(Ft_Gpu_Hal_Context_t *host,ft_uint32_t addr);
  3. ft_uint32_t Ft_Gpu_Hal_Rd32(Ft_Gpu_Hal_Context_t *host,ft_uint32_t addr);
  4. ft_void_t Ft_Gpu_Hal_Wr8(Ft_Gpu_Hal_Context_t *host,ft_uint32_t addr, ft_uint8_t v);
  5. ft_void_t Ft_Gpu_Hal_Wr16(Ft_Gpu_Hal_Context_t *host,ft_uint32_t addr, ft_uint16_t v);
  6. ft_void_t Ft_Gpu_Hal_Wr32(Ft_Gpu_Hal_Context_t *host,ft_uint32_t addr, ft_uint32_t v);
  7. ft_void_t Ft_Gpu_HostCommand(ft_uint8_t cmd);

W projekcie można znaleźć dużą ilość przykładowych okien z wygenerowanymi różnymi grafikami jak i z różną funkcjonalnością np. wygenerowanie grafiki z Google Maps, wielopunktowy dotyk, rysowanie itp.

Poniżej krótka funkcja testowa prezentująca kliknięcie przycisku i wyświetlenie tekstu. Jest to modyfikacja jednego z okien testowych:

  1. Ft_Gpu_CoCmd_Dlstart(phost);
  2. Ft_App_WrCoCmd_Buffer(phost,CLEAR_COLOR_RGB(0,31,63));//white color
  3. Ft_App_WrCoCmd_Buffer(phost,CLEAR(1,1,1));//clear screen
  4. Ft_App_WrCoCmd_Buffer(phost,COLOR_RGB(0xFF,0xFF,0xFF));//red color
  5. Ft_Gpu_CoCmd_Text(phost,(FT_DispWidth/2), (FT_DispHeight/10), 29, OPT_CENTERX, "Test wyswietlania");
  6. Ft_App_WrCoCmd_Buffer(phost,COLOR_RGB(0xff,0x00,0x00));
  7. StringArray[0] = '\0';
  8. strcat(StringArray,"Counter ");
  9. Ft_Gpu_Hal_Dec2Ascii(StringArray,(ThisDemoEnd/100)+1);
  10. strcat(StringArray,"s");
  11. Ft_Gpu_CoCmd_Text(phost,FT_DispWidth/2, (FT_DispHeight/4), 26, OPT_CENTERX, StringArray);
  12. Ft_App_WrCoCmd_Buffer(phost,COLOR_RGB(0xff,0xff,0xff));
  13. Ft_App_WrCoCmd_Buffer(phost,TAG(240));
  14. Ft_Gpu_CoCmd_Button(phost,FT_DispWidth-65,FT_DispHeight-42,60,30,20,0, "Btn");
  15. CurrTag2 = Ft_Gpu_Hal_Rd8(phost,REG_TOUCH_TAG);
  16. if(touchTagValue == 1)
  17. {
  18.     Ft_Gpu_CoCmd_Text(phost,(FT_DispWidth/2), (FT_DispHeight/4), 29, OPT_CENTERX, "Btn Click");
  19. }
  20. Ft_App_WrCoCmd_Buffer(phost,DISPLAY());
  21. Ft_Gpu_CoCmd_Swap(phost);
  22. /* Download the commands into fifo */
  23. Ft_App_Flush_Co_Buffer(phost);
  24. /* Wait till coprocessor completes the operation */
  25. Ft_Gpu_Hal_WaitCmdfifo_empty(phost);
  26. /* Touch press check in sysTick */
  27. void SysTick_Handler(void)
  28. {
  29.     //...
  30.     //...
  31.     //...
  32.     if(CurrTag2 == 240)
  33.     {
  34.         CurrTag2 = 0;
  35.         touchTagValue = 1;
  36.         displayCounter=0;
  37.     }
  38.     if(touchTagValue == 1)
  39.     {
  40.         displayCounter++;
  41.         if(displayCounter == 600)
  42.         {
  43.             displayCounter = 0;
  44.             touchTagValue = 0;
  45.         }
  46.     }

Testowy projekt zmodyfikowany lekko zmodyfikowany przeze mnie można pobrać z dysku Google
tym linkiem.

W kolejnych postach przeniosę bibliotekę udostępnioną przez Riverdi do obsługi środowsika System Workbench  oraz przygotuję testowy projekt dla mikrokontrolera STM32F4 z biblioteką customową oraz kolejny projekt zawierający modyfikację plików udostępnionych przez producenta.