Forum: Mikrocontroller und Digitale Elektronik STM32F303, USART + DMA : ein Interrupt pro Byte möglich?


von Markus G. (the_grue)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus G. schrieb:
> Jedenfalls bekomme ich nicht einen Interrupt pro Byte...
Wenn du sowieso einen Interrupt pro Byte bearbeitest, wozu dann noch 
DMA?

von Falk B. (falk)


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ö.

von Jan K. (jan_k)


Lesenswert?

Wofür ist der Zähler? Irgendwann muss du die Daten aus dem Puffer holen 
- kannst du dann zählen?

von aSma>> (Gast)


Lesenswert?

Servus,
dafür gibt es folgende Fkt:
1
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx);
Es wird bis null gezählt.

mfg

von Jan K. (jan_k)


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 :)

von W.S. (Gast)


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.

von Björn G. (tueftler)


Lesenswert?

W.S. schrieb:
> beim Aufsetzen des DMA-Kanals der Datenumfang
> bekannt sein muß, was bei einem UART-Input grundsätzlich nicht gegeben
> ist.
Naja, ausser man wartet auf den Paketanfang, in dem passenderweise die 
Nutzdatenbreite drin steht und schmeisst dann den DMA für diese 
Byte-Anzahl an.

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.