Forum: Mikrocontroller und Digitale Elektronik STM32 DMA auf GPIO und das schnell


von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Mahlzeit!
Mit einem STM32F407 möchte ich mehrere 16x16xRGB LED Panel ansteuern.
Diese sind im Endeffekt nur Schieberegister ohne Multiplexing.
(weil recht alte Panels von nem Dresdner Schrotti zum Kilopreis)

Momentan missbrauche ich dafür die 3 SPI, aber ich brauche für das 
fertige Projekte davon 5 Datenströme.
Also will ich 15Bit paralel über den GPIO Ausgeben per DMA.

Das funktioniert auch schon ganz gut wenn ich ein statisches uint16_t 
Array aus dem SRAM2 Ausgebe und das bei 10MHz Ausgangstakt.
Der STM32F407 läuft dabei auf 168MHz.

Aufbau:
TimerA enabled TimerB. Dabei Zählt er die Takte die Ausgegeben werden 
sollen um danach TimerB sofort stillzulegen.
Der DMA End IRQ ist zu langsam, da würden dann noch ungewollte Takte 
kommen.
TimerB läuft im PWM Mode mit 50/50 und gibt somit per GPIO den Takt aus 
und triggert beim Overflow den DMA.
Der DMA ließt dann aus dem SRAM2 immer 16Bit und gibt die auf den GPIO 
aus.
1Bit ist dabei eben Beifang.

Das geht auch schon ganz gut, aber wenn der ARM Kern selber mal auf den 
SRAM2 zugreifen muss, zum Updaten des Arrays, dann braucht der DMA zu 
lange um an die Daten zu kommen.
Damit verschieben sich manche Ausgabewörter um eine Taktflanke -> doof 
fürs Schieberegister.
Das ließe sich ja noch umschiffen indem nur nach einem "DMA fertig IRQ" 
geschieben wird vom ARM Kern aus.

Aber für 12Bit Graustufen (Bit Angle Modulation, kein PWM!) und 120Hz 
Wiederholrate bräuchte ich so ~22MHz.
Denn bei den jetzigen 60Hz Wiederholrate sieht mans noch leicht 
flimmern.
Aber dann gibts direkt FIFO Errors vom DMA.
Das bedeutet, dass er garnicht mehr schnell genug auf den RAM zugreifen 
kann.


Nun die Fragen:

Hier im Forum habe ich gelesen, dass die Busmatrix 12 Takte braucht um 
den DMA Zugriff zum SRAM zu routen? Gibts dazu irgendeine Quelle?

Gibt es noch andere Möglichkeiten schnell Daten aus dem STM32 
rauszupusten?
Das muss nicht auf den F407 beschränkt sein.

Ist die Busmatrix eines STM32H7 schneller?
Der ARM Kern hat zwar 400MHz, aber das Bussystem nur 200MHz.

Ich würde ja gerne nen FPGA nehmen, aber dann fehlts an BlockRAM von den 
hier rumliegenden Xilinxen.
Von Lattice hab ich hiern dickes FPGA Brett mal geschenkt bekommen (da 
veraltet), der ist aber so groß, dass der nicht mehr mit der kostenlosen 
Toolchain läuft.

von Phil E. (aktiver_mitleser)


Lesenswert?

Zum Vermeiden von Missverständnissen:
- du hast eine Art Framebuffer im SRAM, in dem deine Daten liegen
- jedes Bit (0-14) in diesen 16-Bit-Worten entspricht einem 
SPI-Datenstrom

- Wie viele Pixel bzw. Datenbits hast du?
- Wie machst du deine BAM? Der Vorteil an der BAM ist doch, dass du 
teilweise Zeiten mit hoher Transferrate hast und dafür andere Zeiten in 
denen nichts los ist. Wäre es möglich, in der Zeit in denen du deine 
niedrigen Bits überträgst (= wenig Zeit zwischen den Transfers) die CPU 
einfach schlafen zu legen (oder sonstwie nicht auf den SRAM 
zuzugreifen)?

- Woher kommt deine SPI-Clock, das ist der Timer B-Output? Ich vermute, 
das Latch machst du in Software?

Eine Möglichkeit, das "Überspringen" der Daten zu vermeiden wäre die 
Clock zusammen mit den Daten auszugeben, z.B. in dem das aktuell 
ungenutzte 16. Bit einfach alterniert und eine externe Analogschaltung 
jede Flanke in einen Clockpuls verwandelt. Wenn dein DMA kurzzeitig 
hängt, würde dann zumindest auch die Clock hängen. Ist natürlich doof, 
weil dieser Jitter bei der BAM natürlich 1:1 in Helligkeitsschwankungen 
eingeht.

Eine Sache die evtl auch gehen könnte wäre evtl. die Daten im CCM-RAM 
abzulegen und versuchen was mit dem FSMC zu machen. Da kenne ich mich 
aber nicht aus, vielleicht geht das gar nicht, vielleicht geht das gar 
nicht mit deiner Package etc.

Bzgl. FPGA: Wie viel BRAM brauchst du denn? Das Lattice UP5K hat 1 MBit 
SRAM eingebaut, was bei 12 Bit RGB immerhin 29kpixel, oder 113 deiner 
16x16-Panels. Kostet außerdem erbärmlich wenig.

von pitschu (Gast)


Lesenswert?

Ich habe das gleiche Problem mal mit dem F407 für eine 64x64 Matrix mit 
4 RGB Kanälen mit jeweils 16 Zeilen gelöst. Das Vorgehen ist das selbe 
wie du beschreibst. Ich takte auch mit 10,5 MHz und komme so bei 6-Bit 
BAM auf ca. 150Hz Bildrate.
Entscheidend für das Timing war, die Daten für das GPIO-DMA und das 
Prescaler-DMA in das SRAM2 zu verlegen. SRAM2 ist über einen eigenen Bus 
an die Matrix angebunden und kommt daher nicht mit der CPU in Gehege. 
Das ist im Reference-Manual ganz gut beschrieben.

pitschu

von Phil E. (aktiver_mitleser)


Lesenswert?

Hast du dir den LTDC angeschaut, den es in einigen F4 und H7 gibt?
https://www.st.com/resource/en/application_note/dm00287603.pdf

Interessant finde ich da folgende Aussage:
"All other STM32 MCUs with no LTDC peripheral can directly drive LCD-TFT 
panels using FSMC and DMA. Refer to application note QVGA TFT-LCD direct 
drive using the STM32F10xx FSMC peripheral (AN3241)" - scheinbar kann 
der das selbe wie FSMC und DMA, aber eben besser.

Außerdem das Bild auf Seite 17 - scheinbar ist nur ein Transfer über die 
Busmatrix nötig (Speicher -> LTDC und dann direkt raus) statt zwei 
Transfers mit DMA (Speicher -> DMA -> GPIO/FSMC)

Ich bin in dem Thema aber kein Experte, hoffe aber dir trotzdem 
weitergeholfen zu haben.

Wie kommst du eigentlich auf die 22MHz? 22MHz / 120Hz * 1/4096 
Zeitauflösung = 44 Bit pro Frame? Und muss es ein ganzzahliges 
Vielfaches von 60Hz sein (weil du vorgefertigtes Video abspielst) oder 
gehen z.B. auch 90Hz (wenn du die Videodaten in Echtzeit erzeugst)?


pitschu schrieb:
> Entscheidend für das Timing war, die Daten für das GPIO-DMA und das
> Prescaler-DMA in das SRAM2 zu verlegen.

Bingo! Der ist auch nicht am IBUS und DBUS angeschlossen, kann also gar 
nicht um Buszeit konkurrieren.

: Bearbeitet durch User
von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Der SPI war nur eine Vorgeschichte zur ersten Inbetriebnahme der Panels.
Mit dem SPI wird garnichts mehr gemacht, das läuft jetzt alles über den 
DMA.

Der STM32F407 hat 2 getrennte SRAM.
In SRAM1 arbeitet der ARM Kern sein Programm ab (Stack und Daten).
In SRAM2 liegt bisher ausschließlich der Framebuffer.
Dieser Framebuffer ist schon "vorgekaut", also er enhält 12 Subarrays 
für die BAM Phasen und dann genug uint16_t für die Datenstromausgabe.
Dank der Busmatrix können 2 getrennte Busmaster auf 2 getrennte Slaves 
zugreifen.

> Wie viele Pixel bzw. Datenbits hast du?
Im Endeffekt möchte ich 9x5 der Panels verschalten, also 144x80 Pixel.
Das sind somit 11520xRGB Pixel.
Das wird also ne Videowall mit >1m Breite.

> Wie machst du deine BAM?
Noch ein Timer zählt die Abstände die zwischen 2 "BAM Bursts" 
eingehalten werden müssen und der IRQ Handler dieses Timers stößt das 
oben genannte Timer/DMA Konstrukt an.
Durch ein geschicktes Interleaving der großen BAM Pausenzeiten kann ich 
9 Panels pro RGB Datenstrom speisen.
Trotzdem wäre noch genug Zeit um Daten von SRAM1 nach SRAM2 zu kopieren.
Aber dann bleib ich auf die 10MHz CLK festgenagelt, ich will ja 20MHz ;)

> Ich vermute, das Latch machst du in Software?
Das Latchen und Enablen der Schieberegister geschieht über IRQ Handler 
und darin weitere angestoßene Timer.
Da ist es ja nicht ganz so kritisch ob das nach 5 oder 100 CPU Takten 
kommt.
Glücklicherweise haben die STM32 Timer "ohne Ende".

Ich hatte schon drüber nachgedacht die CLK als das übrige Bit 
auszugeben.
Statt als HW Ausgang des TimerB.
ABER! (So dachte ich bisher) Dann brauch ich ja den doppelten DMA Takt, 
weils ja 2 Taktflanken pro Takt braucht.
Dann müsste ich 40MHz auf dem DMA erreichen und es gehen ja nichtmal 
20MHz.
Im Endeffekt tritt der FIFO Fehler so ab 12MHz auf.
Dass das Bit toggelt mit dem halben Takt und eine Flankenerkennung macht 
nen Impulse draus is natürlich ne Idee kopfkratz.

Der FSMC wär noch ne Idee, der haut doch aber zwischendurch immermal 
Adressen raus?

> Wie viel BRAM brauchst du denn?
Das Umwandeln eines Inputstreams könnt ich "on the fly" erledigen zum 
Buffer füllen.
Eine Zeile hat 144 Pixel zu 16 Pixelbits.
Das Ganze zu 12 BAM Phasen. und Double Buffering wär nicht schlecht.
-> 144*12*16*2 = 55296 Bits. + Alphawerttabelle der Augenkennlinie.
Hmm Moment, vorn paar Wochen hatte ich da noch was größeres 
ausgerechnet.

Aber wenn man mal bedenkt, dass 10MHzx2Byte schon 20MByte/s sind, dann 
ist da wohl einfach das Ende der Fahnenstange der STM32 erreicht?

@pitschu:
Das liegt ja schon getrennt im SRAM2 und reicht für 10MHz.
Aber ich will ja MEHR! (20MHz)

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Da tippt man und es meldet sich noch wer ;)

Den LCD Controller hab ich mir schon angesehen, aber der braucht 
mindestens eine Leerzeile (auch wenn man 0 in das passende Register 
packt).
Womit sich die benötgte Datenratte verdoppeln würde.

Ja, ich will 60Hz Videos abspielen können, daher ein Vielfaches.
Aber auch die 90Hz als Notlösung schaffe ich bisher nicht.

Die AppNote klingt interessant, die lese ich mir heute Abend mal durch.

Die Frequenz muss so verdammt hoch sen, weil eben die kleinste Bit Angle 
Modulationsphase den Takt vorgibt.
Dabei arbeite ich schon mit den Enables, weil der Takt auch so schon zu 
gering wäre.
Wenn ich aber mit noch mehr Display aus Phasen arbeite wirds langsam 
recht dunkel.

Bis runter zu 1/512 ist der Takt noch hoch genug, dass wärend der Bit 
Anzeige Zeit neue Daten reinkommen, danach arbeite ich mit dem 
OutputEnable Pin es Schieberegisters.
Es hängen eben 3 Panels in Reihe.

von Martin S. (strubi)


Lesenswert?

Moin,

das Problem hatte ich auch mal, und hab's mit nem Spartan6-LX9 
erschlagen.
Allerdings habe ich das Problem mit dem fehlenden BRAM recht aufwendig 
per SPI-Cache umschifft, dass genügend 'scratch pad' memory für die 
LED-Arrays übrigbleiben. Ist auch bei mir ne etwas andere Geschichte 
(Neopixel/WS2812).
Für ne Einzel-Frickellösung greifst du wohl besser zum grösseren FPGA.

von Phil E. (aktiver_mitleser)


Lesenswert?

Mw E. schrieb:
> Der FSMC wär noch ne Idee, der haut doch aber zwischendurch immermal
> Adressen raus?

So wie ich das verstehe ja, aber nur auf den Adresspins, nicht auf den 
Datenpins. Könnte natürlich sein dass durch die dadurch notwendigen 
Delays die Datenrate zu gering wird. Wie gesagt, kein Experte.

Mw E. schrieb:
> Aber wenn man mal bedenkt, dass 10MHzx2Byte schon 20MByte/s sind, dann
> ist da wohl einfach das Ende der Fahnenstange der STM32 erreicht?

Blöde Frage, aber - schon mal überlegt zu übertakten? 240MHz sind wohl 
drin (+43% ggü 168MHz), laut dem hier: 
http://sigalrm.blogspot.com/2014/01/overclocking-stm32f4.html und dem 
hier: 
https://stm32f4-discovery.net/2014/11/overclock-stm32f4-device-up-to-250mhz/
Oder soll das ein Serienprodukt werden das in-spec sein muss?

Mw E. schrieb:
> Im Endeffekt möchte ich 9x5 der Panels verschalten, also 144x80 Pixel.
> Das sind somit 11520xRGB Pixel.
> Das wird also ne Videowall mit >1m Breite.

Warum nimmst du nicht zwei identische Controller und steuerst jeweils 
nur die Hälfte der Panels an? Dann hast du für ein paar Euros mehr die 
doppelte Datenrate. Musst halt ein Sync-Signal per Kabel weiterleiten 
und in Software vorsehen dass nur eine der beiden Bildhälften ausgegeben 
werden soll.

von m.n. (Gast)


Lesenswert?

Deine Beschreibung habe ich nur überflogen; auf den 1. Blick erschließen 
sich mir die Anforderungen nicht so richtig. Aber ...

Mw E. schrieb:
> Nun die Fragen:
>
> Hier im Forum habe ich gelesen, dass die Busmatrix 12 Takte braucht um
> den DMA Zugriff zum SRAM zu routen?
> ...

Ohne nachzusehen: 12 Takte sind absoluter Unsinn!
Am schnellsten geht die Ausgabe auf den Datenbus. Seit Jahr und Tag 
erledige ich damit die Ansteuerung von TFT-Displays. 
http://mino-elektronik.de/TFT-direct-drive/TFT-direct-drive.htm#tft-4
Timer werden keine benötigt. Das Timing wird über die Einstellungen des 
Buszyklus eingestellt. Da die DMA-Ausgabe immer auf den gebremsten 
Buszugriff warten muß, gibt es auch keine Lücken bei der Ausgabe.

Neuerdings verwende ich STM32F765, die höhere Geschwindigkeit und mehr 
RAM bieten. Der Bildspeicher paßt bequem in SRAM1, wobei SRAM2 und DTCM 
RAM für die CPU im ungestörten Zugriff bleiben.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Die Appnote mit dem LCD am FSMC hab ich jetzt mal durchgelesen.
Da werden jetzt erstmal 3,6MHz Pixeltakt erwähnt.
Weit weg von den anvisierten 20MHz, da wird die Busmatrix sicherlich 
auch wieder rumzicken.

Noch was zum Hardware TFT/LCD Controller:
Der muss zwar nur einmal durch die Busmatrix, aber das muss der DMA2 
auch nur so oft.
Der DMA2 hat ja 2 Busmaster eingebaut, somit kann er gleichzeitig auf 
den Slave Bus der GPIO Register zugreifen (AHB1) und auf den SRAM2.
Die Busmatrix routet das ja paralel durch.

@Philipp M.
Übertakten wär natürlich auch ne Idee für das Hobbyprojekt.
Halbes Display geht ja schlecht wenn die Panelanzahl der Spalten/Zeilen 
von 9 oder 5 /2 geteilt werden müssen.
Dritteln ginge hingegen schon, wird dann aber aufwändig.
Dann hab ich aber auch nur ein Panel pro Strang (mit dem 3x 
Interleaving) und komme locker mit 10MHz aus, ja.
Die Pixeldaten sollten per Artnet angeflogen kommen, das bietet ja sogar 
ein SYNC Paket.
Aber ob das für 120Hz Wiederholrate genau genug ist müsst ich erstmal 
herausfinden.
Oder ein Master empfängt per Artnet und schiebt das wieder mit diesem 3x 
SPI für RGB weiter zu den Slaves. Der /CS ist dann der SYNC.
Bei Elecrow bekomme ich eh mindestens 5 Platinen ;)

@m.n.
Welche ANforderung erschließt sich dir nicht? Da erklär ich gerne noch 
was.
Die 12 Takte kommen durchaus hin.
168MHz/12 = 14MHz.
Bei 10MHz funktioniert meine Ausgabe ja noch und so ab 12MHz gehts 
kaputt.
Von euch weis jetzt aber wirklich keiner wo man die Info herbekommt 
wieviel Takte denn nun der Busmaster vom F4 und H7 braucht zum 
arbitrieren?
Nachlesen würd ich das schon gerne.
Kann aber auch, wie von dir gemeint, völliger Unsinn sein.
(Der DMA brauch ja auch etwas Zeit zum Reagieren nachdem er vom Timer 
getriggert wurde)

Deine TFT Ansteuerung per FSMC läuft mit 50MHz?
Das klingt nach der gesuchten Lösung, da muss ich mal den Code 
durchstöbern.

Guck dir mal den STM32H750 an.
Kostet 5€, weil er nur 128k Flash hat.
Ist aber sonst wie die großen ujnd teuren 20€ H7.

von Sven B. (scummos)


Lesenswert?

Die LPC4300-Serie von NXP (so ähnlich wie die STM32F4 von der Größe her) 
hat so ein "Serial GPIO"-Modul, mit dem man so etwas evtl. machen kann. 
12 MB/s Datenrate habe ich damit jedenfalls schon umgesetzt, das war 
kein Problem.

von W.S. (Gast)


Lesenswert?

Mw E. schrieb:
> Mahlzeit!

Moin!

Was du schreibst, erscheint mir doch recht wirr. Du hast also eine Art 
Anzeigematrix für bunte Bilder, bestehend aus Moduln mit je 16x16 Pixeln 
RGB.

Und nun versuchst du, sowas ohne jegliche externe Logik anzusteuern. Ich 
nehme mal an, daß dein Gesamtbild nicht allzu riesig ist, vielleicht 4x6 
Moduln, macht zusammen 128x64.

Wie kommst du bei so wenigen Pixeln auf Pixeltakte von 20 MHz?

Ich sag's mal so: Du MUSST darauf achten, daß bei ungepufferten 
Schieberegistern die Schiebezeit, also die Zeit für's Update der 
gesamten Anzeige klein bleibt im vergleich zu der anschließenden 
Anzeigezeit. Also wenn du 50 Hz Wiederholrate haben willst, dann sollte 
die Schiebezeit etwa 1 ms dauern, dann 19 ms Anzeigezeit. Dann flackert 
auch nichts mehr.

Also nicht besinnungslos die Taktrate hochtreiben, sondern das 
Verhältnis von Einstellen/Anzeigen richtig hinkriegen.

So. Und warum soll es dann nun unbedingt ein STM32 sein? Guck dir lieber 
einen µC aus, der eine dedizierte TFT-Ansteuerung drin hat, z.B. LPC4088 
oder so. So eine TFT-Ansteuerung geht auch per DMA, aber deren DMA ist 
in den Peripherie-Core eingebaut und (ganz wichtig) der Core puffert die 
Daten, so daß der DMA die Anzeigedaten paketweise und asynchron aus dem 
RAM holen kann und die Anzeige-Ausgabedaten an den Pins sind trotzdem 
taktsynchron und gleichmäßig.

An deiner Stelle würde ich schlichtweg eine kleine externe Logik bauen, 
die das klassische TFT-Interface auf deine Anzeigematrix umsetzt. Dafür 
ist kein FPGA nötig, wahrscheinlich tut es bereits eine Prise 
gewöhnliche TTL-Chips. Du hast da ja RGB-Daten, Pixelclock, DE, HSynch, 
VSynch - das sollte ausreichen, zumal sich das timing in weiten Grenzen 
programmieren läßt.

W.S.

von m.n. (Gast)


Lesenswert?

Mw E. schrieb:
> Die 12 Takte kommen durchaus hin.
> 168MHz/12 = 14MHz.
> Bei 10MHz funktioniert meine Ausgabe ja noch und so ab 12MHz gehts
> kaputt.

Bei GPIO würden sich 12 MHz eher aus 48 MHz / 4 ergeben.

FMC hängt direkt an der AH-Busmatrix, hat zudem noch einen Schreibpuffer 
von 16 x 32 und ist damit affenschnell.

> Deine TFT Ansteuerung per FSMC läuft mit 50MHz?

Das dürfte etwas zu hoch sein und habe ich nie getestet. Bei QVGA oder 
WQVGA ist bei 20 MHz Schluß mit lustig, einfach zu schnell.

> Guck dir mal den STM32H750 an.
> Kostet 5€, weil er nur 128k Flash hat.

Das mache ich! Mal sehen, wer die im TQFP100 günstig in kleineren 
Stückzahlen im Angebot und ab Lager lieferbar hat.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

> Bei GPIO würden sich 12 MHz eher aus 48 MHz / 4 ergeben.
Meinste ich hab die RCC/PLL Einstellungen vergeigt?
Wenn der AHB nicht 168MHz hätte dann wäre die Baudrate vom UART aber 
komplett daneben.
Die Debugausgaben kann ich aber wunderbar lesen, also wird das nicht das 
Problem sein.

>> Deine TFT Ansteuerung per FSMC läuft mit 50MHz?
> Das dürfte etwas zu hoch sein und habe ich nie getestet. Bei QVGA oder
> WQVGA ist bei 20 MHz Schluß mit lustig, einfach zu schnell.

Weil bei einem der TFT Bilder was von 50MHz stand, aber das war dann 
wohl der Takt dieses R210. Bei den STM32 TFT Bildern standen dann 
nurnoch die fps auf dem TFT.
Die 20MHz wären dann knapp erreicht ohne Luft nach oben, probieren kann 
mans ja mal.

Die H750 in TQFP100 gibts bei Mouser, verkaufen dir die Trumps aber 
nicht wegen dem AES Kern.
Bei AVNET gibts den auch, sogar direkt ohne nervige Nachricht einer 
Exportbestimmung. In den Warenkorb legen geht schonmal, aber ich hab 
noch nicht bestellt.


@WS:
Also ich hab hier doch schon mehrmals geschrieben, dass ich 9x5 Panels 
verschalte.

> Wie kommst du bei so wenigen Pixeln auf Pixeltakte von 20 MHz?
Hatte ich auch schon geschrieben.
Ich nutze Bit Angle Modulation, also ich muss 12Bit Graustufen in 
Software machen, weil diese Panels nur Schieberegister mit LEDs sind.
Nichtmal Multiplexing gibts.
Bitangle lässt die LEDs immer kürzer aufleuchten je tiefer es in die LSB 
reingeht.
Also beim MSB ist die LED 1/2 Framezeit an, ein Bit niederwertiger dann 
1/4 der Zeit.
Bei 12Bit geht das also runter bis auf 1/4096 der Framezeit.
Aber selbst da sind 20MHz schon zu wenig und ich muss daher schon mit 
dem OutputEnable der SRegister spielen (was übrigens auch im Original so 
gemacht wird).
Soll heißen: währen der Anzeigezeit kann ich auch mit 20MHz schnell 
genug die Daten ranschaufeln ab dem Bit8.
Noch weniger Takt würde aber noch größer OFF Zeiten bedeuten und das 
Panel würde dunkler.
Ein panel will 12A bei 5V wenn alles an ist, mit meier Ansteuerung ist 
das schon bei "alles an" laut Bildpixeln bei nurnoch 8,3A angelangt.
Hat aber den Vorteil, dass ich nur 12x Pixel reinschieben muss, bei 
12Bit PWM Wärs 4096x.
Warum nicht noch mehr Takt? Laut DB können die SReg nur bis 25MHz.

Die Sreg sind gelatcht, also gepuffert.
Du hast oben das Problem überlesen: Der DMA kann die Daten nicht mehr 
Taktsynchron raushauen.
Es flackert also, weil dann die Daten falsch im SReg landen.
Zudem will ich 120Hz, bei 60Hz sieht man noch flimmern.

Privat nutze ich nunmal STM32, weil die Peripherie bis zum Abwinken 
haben.
Die LPC sind da etwas spartanischer ausgerüstet.
zB was die Anzahl der Timer angeht und von denne nutze ich grade ne 
Menge.

von pitschu (Gast)


Lesenswert?

Mw E. schrieb:
> Von euch weis jetzt aber wirklich keiner wo man die Info herbekommt
> wieviel Takte denn nun der Busmaster vom F4 und H7 braucht zum
> arbitrieren?

Schau dir mal die AN4031 zum STM32 DMA controller an. Da wird 
detailliert gezeigt, wie viele Takte der DMA braucht.

von m.n. (Gast)


Lesenswert?

Mw E. schrieb:
>> Bei GPIO würden sich 12 MHz eher aus 48 MHz / 4 ergeben.
> Meinste ich hab die RCC/PLL Einstellungen vergeigt?

Nein, ich habe es vergeigt, weil die Zahlen so schön passten ;-)
GPIO läuft über den AHB1 mit typ. 42 MHz. Da dort noch synchronisiert 
werden muß, war meine Annahme, daß 1/4 des Bustaktes ein plausibler Wert 
wäre.

Mw E. schrieb:
> Du hast oben das Problem überlesen: Der DMA kann die Daten nicht mehr
> Taktsynchron raushauen.

Mein Ansatz dabei ist, den DMA nicht zu einem Timer zu synchronisieren, 
sondern asynchron laufen zu lassen und anhand einer Daten- oder 
Adressleitung einen synchronen Impuls auszugeben. Die Datenausgabe 
synchronisiert sich damit selbst.
Da Du 15 Bit benötigst, wäre das 16. Datenbit dafür frei. Ich erzeuge 
den Impuls (jeweils für Vsync und Hsync) über je eine Adressleitung.
Vielleicht ist das für Dich machbar.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

@m.n.
Das überlesen Zitat galt WS ;)

Dank der AppNote von pitschu blick ich jetzt wos knarzt:
Dass die Busmatrix so lange braucht ist Murks, ja.
Das SReg sampled bei einer LO->HI Taktflanke aus dem Timer (wenn der PWM 
Wert erreicht ist).
Der Timer gibt das Overflow Event an den DMA zurück und dabei wird das 
Taktsignal wieder von HI->LO geändert.

Der DMA hat jetzt also nur die halbe Taktzeit um getriggert zu werden 
und dann die Daten über die Busmatrix zum AHB1 zu den GPIO zu schreiben.
Was 4 AHB Zyklen braucht, nicht Takte.
Ein Zyklus besteht aus einer Adressphase und einer Datenphase also 2 
Takten, weil es ein pipelined Bus ist.
Das wird zu viel. +- Jitterkrams und wielange das interne antriggern von 
Timer->DMA baucht hab ich jetzt nicht lesen können in der AppNote.

Da hilft auch mein FIFO trigger auf FULL mit nem BURST nicht mehr, der 
ist ja zum Daten nachschieben aus dem SRAM2 da.

Nen übler Hack wärs jetzt auf das PWM Event zu triggern und auf die DMA 
Latenz zu hoffen, aber ne zu viel Hack ;)

Ich werdmal im urlaub nach den Weihnachtsfeiertagen mit dem FSMC 
spielen, aber die Idee mit einem Controller pro drittel Display wär auch 
nicht schlecht.

HSYNC/VSYNC brauchts nicht.
Es müssen immer 16*16*3 uint16_t ausgegeben werden.
(Eine drittel Zeile aus 3 Panels eben*)
(Die Panels selber sind nicht zeilenweise steuerbar)
Danach gibts den "fertig" IRQ. In diesem wird das Latch der Sreg 
gepulsed und danach ein Timer gestartet der das Output Enable in 
hardware ansteuert um die Bit Angle Leuchtzeit genaustens einzuhalten.
Die Übertragung darf gerne etwas IRQ Jitter haben, aber eben keine Bits 
fressen.

*die anderen beiden 3er Gruppen der Zeile aus Panels werden in den 
Übertragungspausen des ersten drittels bespielt.

Bisher hab ich einen Testaufbau, der schon mithilfe eines mplayer 
Plugins Video auf 32x16 abspielen kann mit 60Hz und 12Bit Graustufen pro 
Farbe.
Dank nicht gesyncten Kamerashutter flackert das aber wie s**
https://www.youtube.com/watch?v=h9qx7ENijSQ

von Andreas M. (amesser)


Lesenswert?

Wie oben schon geschrieben, aber vermutlich untergegangen, warum nicht 
das 16. freie bit als Taktsignal nutzen? Braucht dann halt doppelt so 
viel RAM.

Der DMA müsste auch 32 Bit Worte aus dem RAM lesen und auf zwei 16 Bit 
Peripheriezugriffe mappen können. Dann spart man sich einen AHB Zyklus 
auf den RAM.

Außerdem meine ich mich zu erinnern, das man irgendwo in der Busmatrix 
die Priorität der Master einstellen kann.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Andreas M. schrieb:
> Außerdem meine ich mich zu erinnern, das man irgendwo in der Busmatrix
> die Priorität der Master einstellen kann.

Nicht beim F4, der hat fest Round Robin.
Bei anderen ARM SoCs musste ich aber an sowas schonmal rumspielen ja.

Andreas M. schrieb:
> Wie oben schon geschrieben, aber vermutlich untergegangen, warum nicht
> das 16. freie bit als Taktsignal nutzen? Braucht dann halt doppelt so
> viel RAM.
Der DMA muss dann aber doppelt so schnell sein, schafft er aber nicht.
Die Idee war zudem nur zu toggeln und aus den FLanken den eigentlichen 
CLK zu extrahieren.

Andreas M. schrieb:
> Der DMA müsste auch 32 Bit Worte aus dem RAM lesen und auf zwei 16 Bit
> Peripheriezugriffe mappen können. Dann spart man sich einen AHB Zyklus
> auf den RAM.

Es scheint ja eher DMA->GPIO Register das Problem zu sein.
Das hatte ich zudem schonmal versucht, aber irgendwie war dann ein 
Dreher drinne und es kam totaler Datenmüll raus, da müsst ich nochmal 
nachforschen.

von m.n. (Gast)


Lesenswert?

Mw E. schrieb:
> Andreas M. schrieb:
>> Wie oben schon geschrieben, aber vermutlich untergegangen, warum nicht
>> das 16. freie bit als Taktsignal nutzen? Braucht dann halt doppelt so
>> viel RAM.
> Der DMA muss dann aber doppelt so schnell sein, schafft er aber nicht.
> Die Idee war zudem nur zu toggeln und aus den FLanken den eigentlichen
> CLK zu extrahieren.

Hast Du vielleicht einen Schaltplan? Mir fehlt immer noch die 
Vorstellung, wie es genau ablaufen soll.

Als Taktsignal bietet sich /WR an!

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Uff, Schaltplan.
Den müsst ich erst Zeichnen, das ist momentan ein fliegender Testaufbau 
bestehend aus einem F407 Discovery und einem 74ABT245 als 3.3V -> 5V 
Wandler.

Hier das DB des SRegs mit den LED Treiber Ausgängen:
http://www.siti.com.tw/product/spec/LED/SP-ST2221C-A.004.pdf

SERIN:
- STM32 GPIO Pin per DMA
- PORTA

CLOCK:
- STM32 Timer Output Compare Ausgang
- Timer triggert intern den DMA
- PWM Mode mit 50/50 DC
- Timer8 OCR1 PC6

LATCH:
- GPIO Bitbongo im DMA fertig IRQ
- PC0

nENABLE:
- STM32 Timer Output Compare Ausgang zur genauen Einhaltung der BAM 
Zeiten
- One Pulse Mode
- Timer9 OCR1 PE5

Reicht das schon?
Is ja eigentlich nur nen Schieberegister ;)

von m.n. (Gast)


Lesenswert?

Mw E. schrieb:
> Reicht das schon?

Nee.
Wie ein Schieberegister aussieht ist bekannt. Aber wieviel davon sind 
wie angeordnet und wie sieht das Muster aus, das ausgegeben werden soll?
Wie wird das Tastverhältnis für eine einzelne LED erzeugt?

Vielleicht bin ich auch schon zu alt für "blinkende Weihnachtsbäume" ;-)

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Eigentlich war ja nur die Frage wie ich den DMA schneller auf den GPIO 
trommeln lassen kann.

Wie man diese Panels ansteuert, da klär ich auch gern auf.
Da muss ich aber mal in ein anderes Forum verweisen.
In dem hab ich dokumentiert (als Fritzler) wie bisher die Ansteuerung 
läuft.

Nicht verwirren lassen, dass da noch von SPI gesprochen wird.
Diese SPI Ausgabemuster sollen ja paralelisiert werden damit 5 
Panelzeilen statt einer am STM32 hängen.

Bitte hier klicken:
https://www.fingers-welt.de/phpBB/viewtopic.php?f=14&t=11610

Rückfragen dann wieder hier schreiben ;)

von Phil E. (aktiver_mitleser)


Lesenswert?

Mw E. schrieb:
> Nen übler Hack wärs jetzt auf das PWM Event zu triggern und auf die DMA
> Latenz zu hoffen, aber ne zu viel Hack ;)

Nix Hack, so funktioniert synchrone Logik ^^ Da du aber eh dein 
Clock-Signal mit nem Timer erzeugst hast du doch den Luxus es beliebig 
verzögern zu können. Verzögere dein Latch-Enable-Signal doch einfach 
einige Takte, dann hat der DMA mehr Zeit.
Sollte das Schieberegister 50:50 Tastverhältnis am Latch-Pin fordern 
oder du würdest die minimale High-Zeit unterschreiten könntest du zur 
Not einen weiteren Timer verwenden.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Hmm, ja, also doch, kommt auf die Experimentierliste.
Als Hack versteh ichs, weil der DMA->GPIO Zugriff dann vllt zu früh 
kommen KÖNNTE.
Aber lieber probieren statt zu labern.

Das CLK zu verzögern wär auch ne Idee, dazu muss ich nur den DC Wert der 
"PWM" ändern, dann kommt die LO->HI Flanke später.
Das Latch muss nichtmal aktiv verzögert werden, die IRQ Latenz ist da 
schon mein Freund.
Der Latch Pin brauch eh kein 50/50.

Dem SReg ist selbst der DC des CLK Wumpe, da gibts nur eine Mindestzeit 
die das Teil HI bleiben muss.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.