Skocz do zawartości

[STM32F411 + HAL] Ustawianie i wyzwalanie transmisji SPI po DMA


Pomocna odpowiedź

Napisano (edytowany)

Pracuję właśnie nad jednym projektem, w którym próbuję stworzyć generowanie monochromatycznego sygnału VGA, w celu wyświetlania terminalu tekstowego na starym monitorze. Założenie jest taki, że sygnały synchronizacji (HSYNC/VSYNC) będą generowane za pomocą timerów i PWM, a koniec "back porch" będzie wyznaczany przez OC na tych samych timerach. Same piksele będą natomiast wypychane na kanał jeden z kanałów RGB (konkretnie GREEN, bo zależy mi na zielonym tekście) za pomocą SPI, poprzez DMA, z bufora zawierającego aktualną linię.

W chwili obecnej sytuacja wygląda następująco:

Następuje wywołanie callbacka obsługującego horizontal back porch -> wołam HAL_SPI_Transmit_DMA(&hspi1, scanline, SCANLINE_LEN) -> SPI zaczyna wysyłać piksele.

Problem polega na tym, że HAL_SPI_Transmit_DMA to dość ciężka funkcja, która zawiera w sobie trochę logiki i chwilę się wykonuje. Efekt jest taki, że linie zaczynają być rysowane za późno i ich początek pojawia się dopiero w okolicy 1/4 ekranu.

Prawidłowe podejście powinno wyglądać następujaco:

Kończymy rysowanie poprzedniej linii (początek front porch) -> Ustawiamy kolejną transmisję DMA -> Następuje przejście do kolejnej linii i sygnał HSYNC -> Następuje wywołanie callbacka obsługującego horizontal back porch -> Inicjuję wcześniej ustawioną transmisję, żeby SPI zaczął jak najszybciej wysyłać piksele z bufora.

Ktoś orientuje się w jaki sposób coś takiego osiągnąć za pomocą HAL?

Edytowano przez atlantis86

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...