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
Markus G. schrieb: > Jedenfalls bekomme ich nicht einen Interrupt pro Byte... Wenn du sowieso einen Interrupt pro Byte bearbeitest, wozu dann noch DMA?
@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ö.
Wofür ist der Zähler? Irgendwann muss du die Daten aus dem Puffer holen - kannst du dann zählen?
Servus, dafür gibt es folgende Fkt:
1 | uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx); |
Es wird bis null gezählt. mfg
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 :)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.