Forum: Mikrocontroller und Digitale Elektronik DMA Stm32 Usart


von Sebastian (Gast)


Lesenswert?

Hallo,

ich wollte mein Counter vom DMA Stream resetten oder auf ein bestimmten 
Wert schreiben, ohne den Stream neu zu initialiseren.

Ich mache es aktuell so:

// Dma deaktivieren.
DMA_Cmd(Handle->usart_board->ReceiverDmaStream, DISABLE);

// Flags löschen.
USARTGetDma( Handle->usart_board->ReceiverDmaStream )->LISR = 
0x00000000;
USARTGetDma( Handle->usart_board->ReceiverDmaStream )->HISR = 
0x00000000;
USARTDmaClearAllFlags( Handle->usart_board->ReceiverDmaStream );

// Counter umsetzen auf die übergebene Anzahl.
DMA_SetCurrDataCounter(DMA2_Stream6, (uint16_t) (Handle->rxSize));

// Dma wieder aktivieren
DMA_Cmd(Handle->usart_board->ReceiverDmaStream, ENABLE);

_________________________________________________________
Handle->usart_board->ReceiverDmaStream ist mein aktueller DMA Stream.
Handle->rxSize ist meine aktuelle Size auf die der Counter vom DMA 
gesetzt werden soll.
Die Funtkion "USARTDmaClearAllFlags" löscht die Flags DMA_FLAG_FEIFx, 
DMA_FLAG_DMEIFx, DMA_FLAG_HTIFx und DMA_FLAG_TCIFx Flag von dem 
jeweiligen DMA Stream.

Aktuell ist mein Problem, dass der DMA Stream manchmal nicht gleich 
wieder aktiviert wird und das ich vom USART ein OverRun Error bekomme.

Könnt Ihr mir vielleicht helfen wo mein Fehler ist?

von Rangi J. (rangi)


Lesenswert?

ja, steht irgendwo in der doku.
Nur Disable reicht nicht. Du musst in einer Schleife prüfen, ob die DMA 
auch wirklich aus ist.
Ich such mal ob ich die Stelle finde.

von Rangi J. (rangi)


Lesenswert?

z.b. hier:
"If the stream is enabled, disable it by resetting the EN bit in the 
DMA_SxCR register, then read this bit in order to confirm that there is 
no ongoing stream operation. Writing this bit to 0 is not immediately 
effective since it is actually written to 0 once all the current 
transfers have finished. When the EN bit is read as 0, this means that 
the stream is ready to be configured."

von Sebastian (Gast)


Lesenswert?

Hallo,

Danke für die schnelle Antwort.
Ich habe es jetzt so umgesetzt und auch nochmal in der Dokumentation 
nachgelesen und es funktioniert. Dankeschön hat mir viel geholfen : )

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.