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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.