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.
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:
- unsigned char SPI_SendByte(unsigned char data)
- {
- /* Wait until the transmit buffer is empty */
- while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) { }
- /* Send the byte */
- SPI_SendData8(SPI1, data);
- /* Wait to receive a byte*/
- while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) { }
- /* Return the byte read from the SPI bus */
- return SPI_ReceiveData8(SPI1);
- }
W celu przesłania danych do wyświetlacza można posłużyć się następującymi komendami:
- ft_uint8_t Ft_Gpu_Hal_Rd8(Ft_Gpu_Hal_Context_t *host,ft_uint32_t addr);
- ft_uint16_t Ft_Gpu_Hal_Rd16(Ft_Gpu_Hal_Context_t *host,ft_uint32_t addr);
- ft_uint32_t Ft_Gpu_Hal_Rd32(Ft_Gpu_Hal_Context_t *host,ft_uint32_t addr);
- ft_void_t Ft_Gpu_Hal_Wr8(Ft_Gpu_Hal_Context_t *host,ft_uint32_t addr, ft_uint8_t v);
- ft_void_t Ft_Gpu_Hal_Wr16(Ft_Gpu_Hal_Context_t *host,ft_uint32_t addr, ft_uint16_t v);
- ft_void_t Ft_Gpu_Hal_Wr32(Ft_Gpu_Hal_Context_t *host,ft_uint32_t addr, ft_uint32_t v);
- 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:
- Ft_Gpu_CoCmd_Dlstart(phost);
- Ft_App_WrCoCmd_Buffer(phost,CLEAR_COLOR_RGB(0,31,63));//white color
- Ft_App_WrCoCmd_Buffer(phost,CLEAR(1,1,1));//clear screen
- Ft_App_WrCoCmd_Buffer(phost,COLOR_RGB(0xFF,0xFF,0xFF));//red color
- Ft_Gpu_CoCmd_Text(phost,(FT_DispWidth/2), (FT_DispHeight/10), 29, OPT_CENTERX, "Test wyswietlania");
- Ft_App_WrCoCmd_Buffer(phost,COLOR_RGB(0xff,0x00,0x00));
- StringArray[0] = '\0';
- strcat(StringArray,"Counter ");
- Ft_Gpu_Hal_Dec2Ascii(StringArray,(ThisDemoEnd/100)+1);
- strcat(StringArray,"s");
- Ft_Gpu_CoCmd_Text(phost,FT_DispWidth/2, (FT_DispHeight/4), 26, OPT_CENTERX, StringArray);
- Ft_App_WrCoCmd_Buffer(phost,COLOR_RGB(0xff,0xff,0xff));
- Ft_App_WrCoCmd_Buffer(phost,TAG(240));
- Ft_Gpu_CoCmd_Button(phost,FT_DispWidth-65,FT_DispHeight-42,60,30,20,0, "Btn");
- CurrTag2 = Ft_Gpu_Hal_Rd8(phost,REG_TOUCH_TAG);
- if(touchTagValue == 1)
- {
- Ft_Gpu_CoCmd_Text(phost,(FT_DispWidth/2), (FT_DispHeight/4), 29, OPT_CENTERX, "Btn Click");
- }
- Ft_App_WrCoCmd_Buffer(phost,DISPLAY());
- Ft_Gpu_CoCmd_Swap(phost);
- /* Download the commands into fifo */
- Ft_App_Flush_Co_Buffer(phost);
- /* Wait till coprocessor completes the operation */
- Ft_Gpu_Hal_WaitCmdfifo_empty(phost);
- /* Touch press check in sysTick */
- void SysTick_Handler(void)
- {
- //...
- //...
- //...
- if(CurrTag2 == 240)
- {
- CurrTag2 = 0;
- touchTagValue = 1;
- displayCounter=0;
- }
- if(touchTagValue == 1)
- {
- displayCounter++;
- if(displayCounter == 600)
- {
- displayCounter = 0;
- touchTagValue = 0;
- }
- }
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.