STM32F303, USART + DMA : ein Interrupt pro Byte möglich?

OP #4600804
Lesenswert?

Servus !

Meinen STM32 habe ich so eingerichtet, daß Bytes per USART empfangen und 
per circular DMA ewig kreisend in einen Buffer geschrieben werden. 
Interrupts bei halb und ganz vollem Buffer werden ausgelöst.

So weit, so prächtig. Jetzt bräuchte ich einen Zähler, der bei jedem 
empfangenen Byte hochgezählt wird. Erste Frage: geht das? Ich habe das 
Reference Manual so verstanden, daß der USART-Interrupt für RXNE immer 
noch ausgelöst wird - das klappt aber irgendwie nicht. Jedenfalls 
bekomme ich nicht einen Interrupt pro Byte...

Wenn das so nicht geht, könnte ich ja den DMA-Buffer ein Byte groß 
machen. Dann würde ich halt im Buffer-Full-Interrupt die Bytes zählen... 
Rein gefühlsmäßig wiederstrebt mir das allerdings etwas.
Deshalb die zweite Frage: wäre die Variante sinnvoll?

Danke für die Hilfe und habt ein erholsames Wochenende!

Markus
#4600820
Lesenswert?

@Markus Grunwald (the_grue)


>So weit, so prächtig. Jetzt bräuchte ich einen Zähler, der bei jedem
>empfangenen Byte hochgezählt wird. Erste Frage: geht das?

Keine Ahunung, ich würde aber mal sagen, nein. Man könnte das aber an 
Hand der Pointer in der DMA berechnen.

>Wenn das so nicht geht, könnte ich ja den DMA-Buffer ein Byte groß
>machen.

Dann wäre DMA reichlich sinnlos.

>Deshalb die zweite Frage: wäre die Variante sinnvoll?

Nö.
#4600858
Lesenswert?

Ohne die Funktion geht das übrigens mit DMAxx_Channelxy->CNDTR. Aber 
damit erfährst du nur, wie viele Elemente der DMA zu diesem Zeitpunkt 
noch erwartet. Du kannst nicht sicherstellen, dass bei jedem Mal wenn 
der DMA ein Byte verarbeitet hat, ein Zähler verändert wird. Daher die 
Frage, was der OP machen möchte :)
Gast #4602811
Lesenswert?

Markus G. schrieb:
> So weit, so prächtig. Jetzt bräuchte ich einen Zähler, der bei jedem
> empfangenen Byte hochgezählt wird.

Und wozu soll der Zähler gut sein?

Ich hab den Eindruck, daß du von der Idee besessen bist, DMA um jeden 
Preis benutzen zu wollen. Ich kann von einem derartigen Ansatz nur 
abraten, denn DMA ist nichts anderes als relativ stupides Kopieren von A 
nach B, wobei schon beim Aufsetzen des DMA-Kanals der Datenumfang 
bekannt sein muß, was bei einem UART-Input grundsätzlich nicht gegeben 
ist.

Wie man das weitaus besser macht, ist hier bereits 1003 mal geschrieben 
worden.

W.S.

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