Hi, ich lese mit dem STM32F4 Discovery Werte von einem Port ein. Das Ganze passiert getaktet auf 14 MHz und damit das so schnell auch funktioniert benutze ich DMA um die Daten von der Peripherie in einen Buffer zu übertragen. Im Großen und Ganzen funktioniert das alles recht zuverlässig und stabil, nur eine Sache kann ich mir nicht so recht erklären. Ich gehe folgendermaßen vor: Ich generiere mir ein Testsignal, das ich genau kenne und lese dieses per DMA ein. Anschließend sehe ich im Debugger nach, ob alles passt. Und von den ca. 8000 Werten sind auch 7990 ok. Nur die ersten 5-10 Werte am Anfang des DMA-Transfers sind nicht zuverlässig richtig, die ersten drei sind sogar so ziemlich immer falsch. Nur eben nie gleich falsch. Eher sowas wie ein Wert taucht dreimal auf. Wenn ich z.B. Zahlen 1-8000 übertrage kommt sowas raus: 1,2,2,2,5,6,7,8,9,10... oder 8,1,1,1,3,6,7,8,9,10... danach ist dann alles gut. Der DMA-Stream ist schon lange "enabled", bevor das eigentliche Signal ankommmt. Das Einzige, was mit dem ersten DMA-Wert gestartet wird, ist ein Timer, der an den Daten-Clock-Pin gekoppelt ist, um die Anzahl der eingelesenen Werte hochzuzählen und den DMA-Transfer immer bei einer steigenden Clock-Flanke auszulösen. Könnte es sein, dass dieser Timer den Transfer der ersten paar DMA-Werte behindert? Ich stecke nicht tief genug in der Thematik drin um das beurteilen zu können und wäre daher für Ideen dankbar :-)
Moin, wie wird die dma den getriggert? Wenn die schon viel früher gestartet wird, liegen vllt. noch gar nicht deine Daten am port an? Bin aber grade nicht so mit der Thematik vertraut. Verwendest du Pull Ups/Downs?
Hi! nur mal ins Blaue geraten: Hängt DMA und die Ports an unterschiedlichen Clocks? Stichwort APB und AHB. Eventuell kommt es da um ein paar Takte Versatz. Liest du einen 8 Bit Port ein? Das würde bedeuten, der könnte den FIFO-Mode verwenden, der unter Umständen zu fehlerhaften Daten führt. Den kannst du testweise ausschalten: "In direct mode (when the DMDIS value in the DMA_SxFCR register is ‘0’), the threshold level of the FIFO is not used: after each single data transfer from the peripheral to the FIFO, the corresponding data are immediately drained and stored into the destination." Im Reference Manual RM0090 sind in Kapitel 10.3.10 mehr Hinweise. Gruß Stefan
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.