Hallo zusammen,
ich kämpfe hier recht verzweifelt mit den STM32F4 herum und benötige
gerade wieder zwei kleine Hilfestellungen.
Zum einen möchte ich bei einem DMA 2 Interrupts aktivieren. Genauer geht
es um den DMA2 channel6 stream2. Von dem benötige ich den Half-Transmit-
und Full-Transmit-Interrupt und verzweifle bei der Namensuche.
Häufig finde ich dann Konstrukte wie
1 | void DMA1_Channel1_IRQHandler(void)
|
2 | {
|
3 | //Test on DMA1 Channel1 Transfer Complete interrupt
|
4 | if(DMA_GetITStatus(DMA1_IT_TC1))
|
5 | {
|
6 | status=1;
|
7 | LEDToggle(LEDG);
|
8 | //Clear DMA1 Channel1 Half Transfer, Transfer Complete and Global interrupt pending bits
|
9 | DMA_ClearITPendingBit(DMA1_IT_GL1);
|
10 | }
|
11 | }
|
die mich dann vollends verwirren, denn wenn schon ein Interrupt
ausgelöst wurde, warum dann noch der Check in Software? Das macht für
mich keinen Sinn!
Und auch wenn ich aus dem Namen des Interrupts auf den gesuchten Namen
schließen könnte, es muss doch ein Dokument geben, in dem diese
Bezeichungen niedergeschrieben sind?! Man kann doch nicht jeden
Interrupt-Namen erraten müssen?
Und zu meinem 2. Problem:
Wenn der DMA alle Daten übertragen hat soll er gestoppt und wieder auf
null gestellt werden. Das Problem dabei ist, dass der DMA möglicherweise
auch alle Daten übertragen haben kann wenn er garade bei der Hälfte
seines Puffers angekommen ist. Zur Verdeutlichung das Bild im Anhang.
Die Daten liegen im Speicher und werden von dort in einem Interrupt
konvertiert (dabei wird aus einem Byte acht Byte, daher die späte
Konvertierung) und in den Puffer des DMA geladen (jenachdem welcher
Interrupt natürlich auch nur die entsprechende Hälfte des Puffers).
Jetzt kann es aber sein, dass alle Daten übertragen wurden und der DMA
gerade beim Half-Transmit angekommen ist. wenn ich nun an dieser Stelle
stoppen würde, dann würde beim nächsten Start wohl erst die 2.Hälfte des
Puffers übertragen und danach erst die erste Hälfte. Die Daten die vor
dem Neustart des DMA aber in dessen Puffer laden möchte sind aber so
formatiert, dass der DMA auch mit der ersten Hälfte beginnen soll. Nun
frage ich mich, ob der DMA für diesen Neustart wirklich (wie so oft im
Internet behauptet wird) komplett deinitialisiert und dann neu
initialisiert werden muss.
Weiß hier jemand Rat?
Vielen Dank
Grüße Michaela