logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak zorganizować wyświetlanie menu i oscyloskop na LCD TFT 3,2 przez FSMC?

kamil94goldman 06 Sty 2019 22:52 1578 9
REKLAMA
  • #1 17681695
    kamil94goldman
    Poziom 3  
    Posty: 261
    Pomógł: 5
    Ocena: 3
    Witam ostatnio zakupiłem wyświetlacz LCD TFT 3,2" taki jak na tej stronie: Link

    Podłączyłem wyświetlacz do mojego mikrokontrolera stm32f407 przez FSMC i wszystko działa ładnie.

    Lecz zastanawiam się jak zorganizować pracę z wyświetlaczem. Chciałbym na wyświetlaczu wyświetlać menu główne, umożliwić konfigurację mojego urządzenia z użyciem wyświetlacza z ekranem dotykowym oraz zrealizować coś w rodzaju oscyloskopu żeby wyświetlać na nim jakieś przebiegi.

    Żeby zapalić jeden piksel na moim wyświetlaczu muszę wysłać dwa bajty. Wyświetlacz ma rozdzielczość 320 x 240. Więc żeby wysłać za jednym razem całą tablicę przez DMA potrzebował bym 320 x 240 x 2 = 153,6 kB (wiec wprawie cały SRAM w moim mikrokontrolerze) W discovery stm32f429 użyto zewnętrznej pamięci SDRAM, która jest obsługiwana przez FMC wiec pewnie da się wysyłać wszystko sprzętowo przez DMA z zewnętrznego SDRAMu do LCD, tylko że mój mikrokontroler nie ma interfejsu FMC, wiec nie podłączę zewnętrznego SDRAM.

    Jak można by to zrobić w moim przypadku, żebym mógł zorganizować menu z grafikami? Robiliście coś podobnego lub macie jakieś pomysły?
    Myślałem żeby np. odczytywać grafiki z karty SD i wysyłać do wyświetlacza, ale takie coś trwało by raczej długo i trzeba by dzielić na jakąś ilość transakcji.
  • REKLAMA
  • #2 17681942
    excray
    Poziom 41  
    Posty: 5500
    Pomógł: 739
    Ocena: 656
    Tworzenie sobie mapy bitowej obrazu w pamięci uC i każdorazowe przepychanie jej przez magistralę po jakiejkolwiek zmianie grafiki raczej odpada przy małych uC. Przy dużych to też moim zdaniem mało trafiony pomysł. Po pierwsze - duplikujesz pamięć. Ta grafika i tak będzie dodatkowo w pamięci wyświetlacza do której też masz dostęp w razie potrzeby. Po drugie większość obiektów możesz, a nawet wręcz musisz sobie wektorowo narysować. Taki przycisk rysowany wektorowo to tylko kilkanaście bajtów typu: położenie, wymiary, typ przycisku, stan, kolor, wskaźnik na tekst, czy ewentualnie wskaźnik na grafikę która go wypełnia. A po trzecie, taka funkcja rysująca przycisk/inny obiekt zmienia tylko stan pikseli w miejscu gdzie tworzysz obiekt więc będzie szybka.
  • #3 17681985
    kamil94goldman
    Poziom 3  
    Posty: 261
    Pomógł: 5
    Ocena: 3
    excray napisał:
    Po drugie większość obiektów możesz, a nawet wręcz musisz sobie wektorowo narysować. Taki przycisk rysowany wektorowo to tylko kilkanaście bajtów typu: położenie, wymiary, typ przycisku, stan, kolor, wskaźnik na tekst, czy ewentualnie wskaźnik na grafikę która go wypełnia. A po trzecie, taka funkcja rysująca przycisk/inny obiekt zmienia tylko stan pikseli w miejscu gdzie tworzysz obiekt więc będzie szybka.

    Ok rozumiem. Tylko jeżeli przycisk będzie rysowany wektorowo to będzie dosyć uboga grafika. Jeżeli miał bym go wypełniać grafiką to i tak potrzebuje raczej jakiejś zewnętrznej pamięci RAM. No i jest też taka sprawa, że przy rysowaniu grafiki przez funkcje nie da się wykorzystać DMA.

    excray napisał:
    Tworzenie sobie mapy bitowej obrazu w pamięci uC i każdorazowe przepychanie jej przez magistralę po jakiejkolwiek zmianie grafiki raczej odpada przy małych uC. Przy dużych to też moim zdaniem mało trafiony pomysł. Po pierwsze - duplikujesz pamięć. Ta grafika i tak będzie dodatkowo w pamięci wyświetlacza do której też masz dostęp w razie potrzeby.

    A gdyby zrobić tak jak chyba zrobili w stm32f429 discovery czyli dać zewnętrzny SDRAM (64 Mb) podłączony do FMC oraz dołożyć wyświetlacz sterowany z LCD-TFT controller (LTDC) wbudowany w uC? Wówczas przychodzi mi taki pomysł żeby w zewnętrznym SDRAMie przechowywać całą tablicę o rozdzielczości wyświetlacza oraz pozostałe grafiki (przyciski itp) wraz z wartościami szerokości i wysokości. Następnie jak zmieni mi się wyświetlany obraz to na początku uzupełniam dużą tablicę wyświetlacza grafikami również zgromadzonymi w zewnętrznym SDRAMie, następnie wysyłam całą uzupełnianą tablicę wyswietlacza przez LTDC a potem wysyłam tylko to co będzie się zmieniało, nie odświeżając tego co się nie zmienia?
    No i tutaj można użyć DMA więc wysyłanie tej dużej tablicy wyświetlacza będzie w całości sprzętowo.
  • REKLAMA
  • #4 17682033
    excray
    Poziom 41  
    Posty: 5500
    Pomógł: 739
    Ocena: 656
    kamil94goldman napisał:
    Ok rozumiem. Tylko jeżeli przycisk będzie rysowany wektorowo to będzie dosyć uboga grafika.

    To już tylko zależy od inwencji twórczej. Tutaj masz efekt prościutkiej funkcji do rysowania przycisku:
    Jak zorganizować wyświetlanie menu i oscyloskop na LCD TFT 3,2 przez FSMC?
    Te przyciski mają 26px/45px i jak widzisz już są dość spore na ekranie 320x240. A jakbyś jeszcze chciał umieścić w nich grafikę to w ogóle będą na 1/4 ekranu.
    kamil94goldman napisał:
    No i jest też taka sprawa, że przy rysowaniu grafiki przez funkcje nie da się wykorzystać DMA.

    A czy w ogóle potrzebujesz DMA? W Twojej wersji najpierw używasz CPU do stworzenia wizualizacji przycisku w RAM a później przy użyciu DMA wysyłasz te dane do wyświetlacza. W mojej używasz CPU aby te same dane bezpośrednio wrzucać do wyświetlacza. Na dodatek jak przeanalizujesz powyższy przycisk to zauważysz, że znaczna część przycisku to szare tło - to już jak najbardziej możesz wysłać używając DMA.
  • REKLAMA
  • #5 17686742
    Kwarcu
    Poziom 13  
    Posty: 78
    Pomógł: 5
    Ocena: 66
    Zobacz tę bibliotekę lvgl. Do pracy potrzebuje bufora ramki w RAM o wielkości 1/10 pełnej ramki. Wspiera także DMA2D.
  • REKLAMA
  • Pomocny post
    #6 17687325
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    @kamil94goldman Zacznij od przeczytania noty użytego kontrolera graficznego, w tym sekcji opisującej jego rejestry. Znajdziesz tam zapewne rejestry definiujące prostokątne okno w pamięci VRAM kontrolera. To okno jest definiowane przez współrzędne ekranowe. W ten sposób sobie określasz, w którym miejscu na ekranie chcesz coś zmienić. Następnie z procesora, możesz przez DMA, a możesz inaczej, przesyłasz nową zawartość tego fragmentu ekranu. W ten sposób w pamięci MCU masz tylko małe bitmapy będące elementami większych obiektów graficznych na ekranie.
    Możesz kupić procesor z interfejsem do matrycy LCD i odpowiednią ilością RAM na framebuffer, ale ogólna zasada tworzenia zawartości ekranu będzie dokładnie taka sama.
  • #7 17692442
    kamil94goldman
    Poziom 3  
    Posty: 261
    Pomógł: 5
    Ocena: 3
    tmf napisał:
    Możesz kupić procesor z interfejsem do matrycy LCD i odpowiednią ilością RAM na framebuffer, ale ogólna zasada tworzenia zawartości ekranu będzie dokładnie taka sama.


    Masz tutaj na myśli interfejs LTDC w stm32f429 np. ?

    Czy jest wtedy sens przechowywać np. kolorowe bitmapy na karcie SD, w momencie startu programu przepisywać je do zewnętrznej pamięci SDRAM podłączonej do interfejsu FMC i z tej zewnętrznej pamięci SDRAM wysyłać obiekty do wyświetlacza? Czy tak robi się w praktyce ?
  • #8 17851190
    kamil94goldman
    Poziom 3  
    Posty: 261
    Pomógł: 5
    Ocena: 3
    Ostatnio szukałem jakiegoś taniego wyświetlacza LCD (kolorowego) z ekranem dotykowym około 3,2 cala do projektu komercyjnego i tak mnie zastanawia jak to możliwe, że tutaj taki wyświetlacz:

    kosztuje około 30 - 40 zł:
    https://www.waveshare.com/3.2inch-320x240-touch-lcd-c.htm

    a taki sam wyświetlacz ale bez płytki i bez kontrolera panelu dotykowego np. firmy 4D SYSTEMS czy jakiej kolwiek innej kosztuje około 100 zł.

    Może mi to ktoś wytłumaczyć? :)
  • #9 17851365
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    Wiele wyświetlaczy na modułach dla hobbystów jest po prostu podłej jakości. Kiepskie kolory, max. 18-bitowa głębia, a to też głównie teoretycznie. Więc tu może być haczyk. Inna sprawa, że wszystko zależy od skali. Jesli zamawiasz dużo to Chińczyk zrobi ci to tanio. No i najważniejsze - o cenie nie decyduje to ile kosztuje wytworzenie, tylko ile odbiorca jest w stanie zapłacić. Za ten sam LCD dla NASA pewnie przyszłoby zapłacić o kilka rzędów wielkości więcej :)
  • #10 17851384
    LChucki
    Poziom 31  
    Posty: 1940
    Pomógł: 104
    Ocena: 379
    kamil94goldman napisał:
    taki sam wyświetlacz ale bez płytki i bez kontrolera panelu dotykowego np. firmy 4D SYSTEMS czy jakiej kolwiek innej kosztuje około 100 zł.
    Może mi to ktoś wytłumaczyć?

    Nie masz gwarancji stałości dostaw taniego LCD tak jak i jego parametrów. Może tam zmienić się wszystko, wymiary PCB, typ złącza, sterownik, wymiary matrycy, itd, itp.

Podsumowanie tematu

✨ Użytkownik zadał pytanie dotyczące organizacji wyświetlania menu oraz oscyloskopu na wyświetlaczu LCD TFT 3,2" podłączonym do mikrokontrolera STM32F407 przez FSMC. Wskazano na problem z pamięcią, ponieważ wysłanie pełnej tablicy pikseli wymagałoby dużej ilości SRAM. Uczestnicy dyskusji sugerowali różne podejścia, w tym rysowanie obiektów wektorowo, co zmniejsza zapotrzebowanie na pamięć, oraz wykorzystanie zewnętrznej pamięci SDRAM z interfejsem FMC, co umożliwiłoby efektywne przesyłanie danych do wyświetlacza. Wspomniano również o bibliotece lvgl, która wspiera DMA2D oraz o różnicach w jakości wyświetlaczy LCD w zależności od producenta. Użytkownik zastanawiał się nad przechowywaniem bitmap na karcie SD i ich przesyłaniem do SDRAM, co jest praktykowane w projektach komercyjnych.
Wygenerowane przez model językowy.
REKLAMA