Skocz do zawartości

STM32U5 - LTDC + MIPI-DSI + GFXMMU


Gieneq

Pomocna odpowiedź

Cześć, testuję ostatnio evalboard STM32U5A9J-DK, na pewno ktoś ma większe doświadczenie więc na starcie pytanie:

  • czy -Ofast i 160MHz (max) 480x480 px RGB8888 10ms czyszczenie framebuffera na samym MCU to szybko?

Na razie podejście nienajlepsze. Bez optymalizacji wyszło 36ms.

void gfx_prepare() {
	int32_t ltdc_clear_sreen_start_us = microtimer_get_us();
	/* Clear screen */
	gfx_fillscreen(0xFFFF0000); // RED
	gfx_draw_fillrect(LCD_WIDTH/2 - 20, LCD_HEIGHT-40, 40, 40, 0xff0000ff);
	ltdc_clear_sreen_duriation_us = microtimer_get_us() - ltdc_clear_sreen_start_us;
}

void gfx_draw_fillrect(uint32_t x_pos, uint32_t y_pos, uint32_t width, uint32_t height, uint32_t color) {
  uint32_t  px_address = 0;
  uint32_t  i;
  uint32_t  j;

  /* Get the rectangle start address */
  uint32_t startaddress = (hltdc.LayerCfg[0].FBStartAdress + (4 * (y_pos * PIXEL_PERLINE + x_pos)));

  /* Fill the rectangle */
  for (i = 0; i < height; i++) {
    px_address = startaddress + (3072 * i); //768 * 4
    for (j = 0; j < width; j++) {
    	      *(__IO uint32_t *)(px_address) = color;
      px_address += 4;
    }
  }
}


void gfx_fillscreen(uint32_t color) {
	gfx_draw_fillrect(0, 0, LCD_WIDTH, LCD_HEIGHT, color);
}

Tu podgląd czasów:

image.thumb.png.0c700adf7c40b139874ce3e283df8cea.png

Jak można to poprawić? Używanie memset nie poprawiło, pewnie optymalizacja i tak sprowadza to do podobnych operacji.

Widziałem że DMA2D ma tryb mem-register do wypełniania kolorem. A może transfer małych kawałów pamieci?

Chcę teraz dodać doublebuffer z przerwania od LTDC Live Event, ale najpierw muszę mieć sposób żeby zmieścić się pomiędzy back i front Vporch 😕 

To zajmuje te 10ms:

image.thumb.png.b3104dbdcba30b800947a7eb1bcf9fd0.png

  • Lubię! 1
Link do komentarza
Share on other sites

900 KB (bez niebieskiego kwadracika) w 10 ms = 88 MB/s no to mało. Np. Pico, czy w sumie RP2040 kopiowanie z RAMu do RAMu z użyciem DMA to jakieś 271 (7,5 KB) do 322 (106,25 KB) MB/s (32 bitowe DMA) przy 125 MHz - standardowy zegar. Dla przykładu memset jest tam wolniejszy jakieś 36% w porównaniu do DMA.

 

Edytowano przez matsobdev
Link do komentarza
Share on other sites

@matsobdev dzięki za info, faktycznie to bardzo mało.

DMA2D ma 2 tryby, jedne z nich register-memory ma opcję wypełnienia kolorem bufora. Gdy uwzględni się rozmiar GFXMMU to można przyspieszyć. Teraz wypełnienie bufora zajmuje 3,2ms.

image.thumb.png.ea096ce0fff0ec2814e68cd1b5fc587d.png

Można to przyspieszyć wyrzucając init HALa który zajmuje 0,2ms i napisać coś swojego ale i tak jest poprawa. Z podwójnym buforowaniem wrzuci się to na tło i przez 11ms rysowania drugiego bufora zdąży.

void DMA2D_FillRect(uint32_t color, uint32_t x, uint32_t y, uint32_t width, uint32_t height) {
	hdma2d.Init.Mode = DMA2D_R2M;
	hdma2d.Init.ColorMode = DMA2D_OUTPUT_ARGB8888;
	hdma2d.Init.OutputOffset = PIXEL_PERLINE - width;
	HAL_DMA2D_Init(&hdma2d);
	HAL_DMA2D_Start(
		&hdma2d,
		color,
		hltdc.LayerCfg[0].FBStartAdress + 4 * (y * PIXEL_PERLINE + x),
		width,
		height
	);
	HAL_DMA2D_PollForTransfer(&hdma2d, 100);
}

https://www.st.com/resource/en/application_note/an4943-using-the-stm32-chromart-accelerator-to-refresh-an-lcdtft-display-stmicroelectronics.pdf

https://medium.com/siili-automotive/optimizing-rendering-performance-on-stm32-using-dma2d-5885869de2b5

http://www.lucadavidian.com/2017/10/02/stm32-using-the-ltdc-display-controller/

  • Lubię! 2
Link do komentarza
Share on other sites

Tak w ramach ciekawostki. Ustawienie LUT GFXMMU odbywa się przez podanie początkowych i końcowych numerów pixeli, które mają być uwzględnione jako obszar widoczny. Plik wejściowy podaje się w Cubie w Excelu ale tylko xlsx i nazwa pierwszego arkusza ma być sheet1 bo inaczej nie przejdzie. 😅

image.thumb.png.338f6cc366d301f759279a349d028c5d.png

W tym przypadku aplik z 480 wartościami 2 rozwiązań równania okregu o promieniu 480/2 przeciętego prostą y = b.

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Ten okrąg nie powinien mieć każdej linii symetrycznej (np. linie 95, 96)? Generalnie powinny zmieniać się co dwa długości linii dla 480 (a czasem być takie same. Teraz trochę kopnięte jest z jednej strony. Ja bym wstawił z Painta (zawsze pro; można też z ichnich pełnoekranowych grafik, pewnie coś dają) okrąg 1 px, 480 d i sprawdził pokrycie pikseli na wyświetlaczu z zadaną maską. Okrąg biały reszta czarne. W sumie czarne w środku, a na zewnątrz czerwone, niebieski lub zielone, żeby było widać, jak okrąg by nie doszedł do "krawędzi" wyświetlacza.

Edytowano przez matsobdev
Link do komentarza
Share on other sites

@matsobdev może być że jest przekoszone, dałem zaokrąglenie w dół. W ustawieniach jest kolor niepokrytego tła. Jak coś wcieknie to wiadomo że jest niepokryte. Tu ustawiłem magentę.

Ciekawe że jak wyśrubowałem 145 FPSów to maska się przesunęła, wcześniej prześwit był tylko z jednej strony.

image.thumb.png.cb41d3f5cd161afe4b6777f13aad177e.png

To się później poprawi, teraz udało mi się odpalić doublebuffering. Wystarczyło przygotować 2 bufory w GFXMMU i przy przerwaniu od wejścia w blanking period przełączyć je dla warstwy 0 LTDC. Do tego flaga do zablokowania rysowania żeby zsynchronizować główną pętlę z odświeżaniem ekranu żeby nie wystąpił tearing effect.

Ciekawe że powyżej 50FPSów widoczny jest wyraźnie ślad z poprzednich pozycji kwadratów. Jakby podtrzymanie pixeli w wyświetlaczu nie nadążało.

image.thumb.png.ee0b8f6737713f6e6bef54695e4eb81b.png

  • Lubię! 1
Link do komentarza
Share on other sites

Dnia 21.07.2023 o 13:20, Gieneq napisał:

Tu ustawiłem magentę.

Offtopic. Ostatnio kupiłem nowe tonery o drukarki... Jeśli tak wygląda magenta to nie wiem czy chce instalować komplet 😉

temp.jpg

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.