Skocz do zawartości

Dobór STM32 - szybkie przełączania GPIO


H1M4W4R1

Pomocna odpowiedź

Cześć,
potrzebuję wybrać do projektu mikrokontroler z rodziny STM32 (może być równie dobrze jakiś inny np. NXP). Problem jest taki, że potrzebuję przełączać GPIO w czasie tsw <= 77.5ns (dokładniej 3 bloki po 8 bitów używając ODR, więc dobrze mapując porty to będzie przełączanie 2-3 sekcji GPIO; do tego odczyt SPI/ETH). Na moim nieśmiertelnym Nucleo G031 udało mi się wyciągnąć coś takiego (jeden blok GPIO, wyłącznie przełączanie portu)

test.thumb.jpg.3d08a664f3d4b1f9216ea2a76dcf5266.jpg
tsw = T/2 = 110ns

Jakieś sugestie co do wyboru MCU? Zastanawiam się nad STM32F407VET6 (7-15$/szt, LCSC), tylko niestety nie mam żadnej płytki by przetestować na nim prędkość GPIO (a zamówienie z Chin chwilę będzie szło). Według noty katalogowej potrafi wyciągnąć do 84MHz, więc biorąc realistyczną wartość 40MHz zostaje jeszcze sporo mocy na pobranie danych z SPI (Slave, Receive Only). Oczywiście w moim przypadku wystarczy mi 20MHz (i to z zapasem), ale jestem zachłanny... 😉 Oprócz tego dochodzi niestety odczyt danych z SPI lub ETH (czyste ramki po RMII lub RJ45 z PHY), na co już niestety może braknąć mocy - bez przetestowania nie wiem ile mam "luzu" by operować danymi z SPI, a jednak trzeba będzie też je lekko przetworzyć (ustawić w odpowiednich miejscach tablicy).

Co do package to dowolny - o ile da się to sensownie wyprowadzić na 2-4 warstwach 😉 Taktowanie MCU to klasyczny kwarc 12MHz. Cena max 15$/szt (bazuję na LCSC).

A teraz dla tych co myślą, że się domyślili co to za projekt - tak, planuję wyświetlać na tym VGA otrzymywane z innego MCU, nie jest to idealny pomysł, ale ja tylko takie mam 😉 Wolę mieć coś wygodniejszego niż FPGA...

Link do komentarza
Share on other sites

1 minutę temu, Elvis napisał:

Jesteś pewien, że niecałe 5MHz to wszystko co ten układ potrafi?

Raczej wiele więcej z tego nie da się wyciągnąć... jest to pusta pętla z przełączaniem ODR między dwoma stanami, potestuję jeszcze jak znajdę czas, ale raczej wiele więcej bym się od G031 nie spodziewał... Alternatywnie zjechać z rodziałką (zmniejszając rozmiar piksela), ale wolałbym zacząć od czegoś, do czego mam wszystkie dane podane na tacy 😉 Ewentualnie sprawdzę F103C8, ale one za bardzo się ze mną nie lubią... Poza tym też raczej (według dołączonego linku) za dużo się nie da osiągnać...

Niestety tutaj timery nie wchodzą w grę, a CPU_FREQ/2 da się tylko otrzymać timerem 😞 Alternatywnie pokombinować z DMA... Zobaczymy, jak znajdę czas może coś wymyślę... 

Myślałem też o alternatywnie - rejestrach przesuwnych i 3 magistralach SPI (tylko niestety one mają po ~40MHz, a musiałyby przesyłać dane piksela w tempie 15MHz (przybliżenie), więc zostałbym z 6-bitową paletą 😉 Alternatywą dla tego byłby jakiś i.MX RT1020, którego SPI buja się do 150-200MHz, ale to już przerost formy nad treścią 😉 

Link do komentarza
Share on other sites

Raczej da się całkiem sporo, nie pamiętam już czy 24MHz, czy 12MHz, ale na pewno o wiele lepiej niż obecnie. A nawet jeśli będzie lepszy układ, to niekoniecznie wszystko będzie działało bez odpowiedniej optymalizacji - stąd była moja rada, żeby najpierw zacząć od G031. Na F407 będzie wtedy dużo łatwiej.

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

Ciekawe co to za założenia, że trzeba męczyć te biedne GPIO 🙂 Na prawdę nie da się tego zrobić łącząc liczniki, DMA i inne żeby to sprzęt robił?

Skoro sprzętowo da się obsłużyć HUB75 (6 kanałów transmisji szeregowej, bez UART, SPI czy innego ) to pewnie dałoby się i te kilka kolorów.

https://www.elektroda.pl/rtvforum/viewtopic.php?p=19240230#19240230

 

Link do komentarza
Share on other sites

(edytowany)

Po wymianie STM32G031 na STM32F302 wynik podskoczył do magicznych 10MHz. Ale po znacznej podmianie mikrosa na coś bardziej nietypowego są już dość bardziej interesujące rezultaty... 16MHz swapa software'owego 😉 Na czystym rejestrze.

image.thumb.png.594bb5376efd5562b443e2c9bec44f91.png
RP2040 GPIO na rejestrach

Z DMA nie szło wyciągnąć więcej niż 980kHz - i raczej to dość realna wartość, gdyż wykonanie DMA wymaga zmiany wartości 4 rejestrów, podczas gdy aktualizacja GPIO to tylko 1 rejestr. Problem w tym, że konieczna będzie zmiana 2-3 rejestrów, co automatycznie dzieli freq na 1/2 lub 1/3. Pozostaje jedynie DMA z Timerem, ale niestety wszystkie dane na sieci, które znajduję są przestarzałe i już połowy funkcji API nie ma, a CubeMX nie trawi wygenerowania DMA dla Timera... (zostawia pusto)

volatile uint32_t* gpioc_odr = &GPIOC->ODR;

while(true)
{
	*gpioc_odr = value;
	value = !value;
}

Bez optymalizacji to to nie jest - zmiana pinu to "aż" 3 instrukcje w ASM... zmieniające "aż" jeden rejestr...  Niestety tutaj kończy się mój zasób czasu na dzisiaj, zobaczy się jeszcze jutro co dam radę wymyślić... Ale za wiele raczej się nie da.

P.S. mam alergię na elektrodę (toksyczność tego forum jest zbyt duża na mój gust, ale to tylko moja opinia)

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

15 godzin temu, H1M4W4R1 napisał:

Z DMA nie szło wyciągnąć więcej niż 980kHz - i raczej to dość realna wartość, gdyż wykonanie DMA wymaga zmiany wartości 4 rejestrów

To zależy jak to zrealizujesz, bo ja wyciągnąłem ~20MHz na 6 kanałach GPIO używając DMA i timera do generowania sygnału CLK. A da się więcej.

Edytowano przez kaworu
Link do komentarza
Share on other sites

Przed chwilą, kaworu napisał:

To zależy jak to zrealizujesz

Narazie to było software'owo, bo niestety dokumentacja, którą mam jest dość przestarzała i nie wspiera nowej wersji SDK, a na grzebanie się z tragiczną dokumentacją STM32 (mówię o API, nie o hardware) już zabrakło czasu...

Link do komentarza
Share on other sites

Przed chwilą, H1M4W4R1 napisał:

mówię o API, nie o hardware

Bo kto normalny używa HALa. 😄 W każdym razie, jak chcesz poeksperymentować, możesz ustawić port na maks prędkość i skonfigurować DMA do transferu mem2mem, wtedy za pomocą DMA zapisać dane do ODR (dwa słowa, tryb kołowy). Nie sprawdzałem czy to w ogóle zadziała, może byc za szybo dla portu, ale to jest najszybsza metoda jaką można przełączać pin z poziomu softu.

19 godzin temu, Zealota napisał:

Skoro sprzętowo da się obsłużyć HUB75 (6 kanałów transmisji szeregowej, bez UART, SPI czy innego ) to pewnie dałoby się i te kilka kolorów.

https://www.elektroda.pl/rtvforum/viewtopic.php?p=19240230#19240230

Dodajmy, że opis tego projektu nawet na forbota wrzuciłem. 😉

Link do komentarza
Share on other sites

Dzisiaj po chwili zabawy z DMA udało mi się wyciągnąć przy MEM2MEM Circular transfer prędkość przełączania rzędu 7.2MHz (sygnału prostokątnego). [F302]. To jest dość typowa liczba (10% częstotliwości zegara). To oznacza, że przekazanie danych zajmuje DMA 10 cykli zegara. Teraz pytanie czy da się to zopytmalizować inaczej niż TIM (ew. jak ktoś mógłby byłbym wdzięczny za instrukcję lub link z zasobami jak podłączyć TIM do DMA MEM2MEM, bo ciągle mi nie wychodzi 😞 [moja umiejętność szukania treści w internecie wysiada]).

Dodatkową cechą, którą zauważyłem jest to, że wraz ze wzrostem pobierania zasobów przez procesor spada częstotliwość do ~5MHz.

hdma_memtomem_dma1_channel1.Instance = DMA1_Channel1;
hdma_memtomem_dma1_channel1.Init.Direction = DMA_MEMORY_TO_MEMORY;
hdma_memtomem_dma1_channel1.Init.PeriphInc = DMA_PINC_ENABLE;
hdma_memtomem_dma1_channel1.Init.MemInc = DMA_MINC_DISABLE;
hdma_memtomem_dma1_channel1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_memtomem_dma1_channel1.Init.MemDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_memtomem_dma1_channel1.Init.Mode = DMA_CIRCULAR;
hdma_memtomem_dma1_channel1.Init.Priority = DMA_PRIORITY_VERY_HIGH;

Appendix: częstotliwości są wartościami sygnału prostokątnego 😉 

Appendix no. 2: tak używam HAL, ale to tylko inicjacja sprzętu, więc nie powinno to mieć bardzo znaczącego wpływu na wydajność...

Link do komentarza
Share on other sites

9 godzin temu, H1M4W4R1 napisał:

Circular transfer prędkość przełączania rzędu 7.2MHz

Co prawda nigdy tego trybu nie sprawdzałem, ale to coś podejrzanie mało.

9 godzin temu, H1M4W4R1 napisał:

jak ktoś mógłby byłbym wdzięczny za instrukcję lub link z zasobami jak podłączyć TIM do DMA MEM2MEM

Nie da się. 😄

Bo to działa inaczej. DMA działa tak, że prawie we wszystkich przypadkach przesyła dane z jednego dowolnego miejsca w drugie dowolne i jest czymś wyzwalane (lub nie, jeśli to m2m). Więc po prostu patrzysz czy dany kontroler DMA jest podłaczony w te miejsca, które są Ci potrzebne, z niego sobie wybierasz kanał, który jest podłaczony do timera, który Ci się podoba i tyle (no, jeszcze timer trzeba ustawić do pracy z DMA). Timer jest tu tylko triggerem i adresy pamieci/urządzenia nie muszą mieć z nim nic wspolnego.

Jeśli wybierzesz przykładowo UART jako trigger kanału DMA, to możesz sobie robić transfery miedzy dwoma buforami w pamięci kiedy przyjdzie znak po uarcie. Jaki to bedzie mialo sens, niewiem, ale można. 😉

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

Tak z ciekawości, próbowałeś wyciągnąć jakiś szybki zegar (> 10 MHz) na "nóżkę" i zmierzyć maksymalną prędkość, żeby ocenić "jakość" Twoich pomiarów? Z tego co widzę masz Siglenta, o jakim paśmie?

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.