STM32 HAL DMA circular Start an beliebiger stelle im Buffer

Gast #6059085
Lesenswert?

Hallo ihr wissenden,

Ich habe folgenden Idee, nur bei der Umsetzung hapert es noch ein wenig.

Der Plan ist einen ws2812B Stripe mittels DMA und PWM von einem STM32 
(z.B. STM32F041) zu befeuern, was ja soweit auch kein Problem ist, und 
gut funktioniert.

Da nur fertige Muster ausgegeben werden sollen, diese dann aber 
"durchgeschoben" werden sollen, ist meine Überlegung diese Muster im 
Flash statt im Ram ab zu legen. Nun wäre es schön dem DMA, die 
Bufferadresse und den Startpunkt mit zu geben, beim Ende des Buffers 
soll dieser wieder von vorne beginne (circular mode?).

Nach der Übertragung der Bufferlänge, sollte der DMA dann abgeschaltet 
werden. Die Längenüberprüfung, wird so mit dem DMA nicht funktionieren, 
dieses wäre aber einfach über den Timerinterupt möglich.

Ich verspreche mir davon eine noch geringere CPU Last, als wenn ich das 
mit der 2 x 24Byte Halfcomplete / complete Methode realisiere.

Hat jemand einen Ansatz wie ich den Startpointer vorgeben kann?

LG
Gast #6059144
Lesenswert?

Klingt so, als brauchst Du einen Ring-Puffer im Flash, der dann vom DMA 
benutzt wird.

Ist es nicht einfacher diesen im RAM anzulegen und mit Speicherbereich 
kopieren von der gewünschte Flash Adresse (mit DMA und Überlauf 
Erkennung + 2. DMA Bereich) dorthin zu kopieren?
Gast #6059156
Lesenswert?

Wenn ich noch mal nachdenke, müsste es genauso auch im Flash gehen.

Zwei DMA im Wechsel nacheinander ausgeben.

1. DMA mit der Flash Startadresse füttern, als Länge den Rest bis zum 
Ende des Flash Bereichs angeben.

2. DMA Anfang des Flash Bereichs angeben, die Länge ergibt sich bis zur 
gewünschten Startadresse-1

Das ganze Endlos.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren