H1M4W4R1 Napisano Marzec 23, 2021 Udostępnij Napisano Marzec 23, 2021 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) 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 More sharing options...
Elvis Marzec 23, 2021 Udostępnij Marzec 23, 2021 Proponuję jednak zacząć od tego G031. Jesteś pewien, że niecałe 5MHz to wszystko co ten układ potrafi? Link do komentarza Share on other sites More sharing options...
H1M4W4R1 Marzec 23, 2021 Autor tematu Udostępnij Marzec 23, 2021 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 More sharing options...
Elvis Marzec 23, 2021 Udostępnij Marzec 23, 2021 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 More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Zealota Marzec 23, 2021 Udostępnij Marzec 23, 2021 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 More sharing options...
H1M4W4R1 Marzec 23, 2021 Autor tematu Udostępnij Marzec 23, 2021 (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. 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 Marzec 24, 2021 przez H1M4W4R1 1 Link do komentarza Share on other sites More sharing options...
Gieneq Marzec 24, 2021 Udostępnij Marzec 24, 2021 @H1M4W4R1 To cieszy nas to, że na Forbocie jest lepsza atmosfera 🙂 Link do komentarza Share on other sites More sharing options...
kaworu Marzec 24, 2021 Udostępnij Marzec 24, 2021 (edytowany) 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 Marzec 24, 2021 przez kaworu Link do komentarza Share on other sites More sharing options...
H1M4W4R1 Marzec 24, 2021 Autor tematu Udostępnij Marzec 24, 2021 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 More sharing options...
kaworu Marzec 24, 2021 Udostępnij Marzec 24, 2021 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 More sharing options...
H1M4W4R1 Marzec 25, 2021 Autor tematu Udostępnij Marzec 25, 2021 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 More sharing options...
kaworu Marzec 26, 2021 Udostępnij Marzec 26, 2021 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. 😉 1 Link do komentarza Share on other sites More sharing options...
Zealota Marzec 26, 2021 Udostępnij Marzec 26, 2021 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 More sharing options...
kaworu Marzec 28, 2021 Udostępnij Marzec 28, 2021 Taka myśl mnie naszła, a Ty przypadkiem tego transferu nie robisz z flasha? Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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ę »