Hallo Leute,
ich bin im Moment dabei den DMA Controller des STM32F429 zu
programmieren. Leider funktioniert da gar nichts... Ich habe versucht
den DMA DataCounter (SxNDTR) zu setzen und ihn dirket danach auszulesen.
Leider funktioniert das nicht, ich erhalte immer den Wert 0. Hier der
Code dafür (die Initialisierung habe ich jetzt mal weggelassen).
1
DMA_SetCurDataCounter(DMA2_Stream0,10);
2
uint16_tasd=DMA_GetCurrDataCounter(DMA2_Stream0);
3
4
DMA_Cmd(DMA2_Stream0,ENABLE);
Woran kann das liegen? Ich schreibe doch nur einen Wert in ein
Register...
Viele Grüße
muhh schrieb:> Ich habe versucht> den DMA DataCounter (SxNDTR) zu setzen und ihn dirket danach auszulesen.> Leider funktioniert das nicht, ich erhalte immer den Wert 0.
Es funktioniert, wie es soll :-)
Das Register kann man nur lesen, wenn der DMA-Kanal aktiv ist. Das ist
der 'wunderbare' STM32!
Leider funktioniert auch das nicht.
Ich habe den den Stream0 (Channel0) aktiviert mit DMA_Cmd(DMA2_Stream0,
ENABLE), leider funktioniert das auslesen des Counter Wertes dann immer
noch nicht...
Wenn er aktiv ist, oder wenn er aktiviert ist?
Letzteres wäre ja nun das Muster, das man überall in dem Teil hat. Wenn
ein Gerät abgeschaltet ist, dann hört es eben auch nicht am AHB mit...
Folgenden Code habe ich verwendet, vielleicht habe ich euch einfach auch
nur missverstanden und es deswegen falsch gemacht.
1
DMA_Cmd(DMA2_Stream0,DISABLE);
2
DMA2_Stream0->NDTR=10;
3
DMA_Cmd(DMA2_Stream0,ENABLE);
4
asd=DMA_GetCurrDataCounter(DMA2_Stream0);
5
asmvolatile("nop"::);
Bei dem As. Befehl habe ich einen Breakpoint gesetzt um zu schauen,
welcher Wert in asd steht, leider immer noch 0. Ich benutze ganz am
Anfang die Funktion DMA_DeInit(DMA_Stream0), aber eigentlich werden da
alle Werte nur auf 0 gesetzt... Ich weiß echt nicht woran das liegt, ich
bekomme den DMA einfach nicht zum laufen, selbst diese einfachen
Sachen...
muhh schrieb:> ich bin im Moment dabei den DMA Controller des STM32F429 zu> programmieren. Leider funktioniert da gar nichts...
Was ich Dir weiter oben andeuten wollte: der DMA-Controller ist eine
Krücke. Nimm das "Referece Manual" RM0090 und lies zwischen den Zeilen
genau nach, was alles nicht geht.
Dann such Dir ein Beispielprogramm, was in etwa die von Dir gewünschte
Funktion erfüllt und passe es an.
Wenn Du einen richtigen DMAC brauchst, dann nimm einen RX62/RX63 von
Renesas.
Ich habe doch noch ein kleines Problem mit dem ADC und dem DMA. Ich
möchte erstmal 2 Channel im Scan Mode wandeln und diese Werte via DMA in
ein Array mit 2 Feldern schreiben. Leider funktioniert das nicht so wie
ich möchte. Die erste Gruppen-Wandlung wird in das Array geschrieben,
die Werte ändern sich aber nie wieder.
Hier die Konfiguration:
uint32_tadc_cr=ADC1->CR2&0x00000200;// Wird das DDS Bit gesetzt?
14
GPIO_ToggleBits(GPIOG,GPIO_Pin_13);
15
}
Wenn ich die die DMA_BufferSize auf 4 setze, dann funktioniert das ganze
einwandfrei, er füllt immer zwei Felder mit Daten und nach zwei
ScanConversions fängt er von vorne an.
m.n. schrieb:> muhh schrieb:>> Ich habe versucht>> den DMA DataCounter (SxNDTR) zu setzen und ihn dirket danach auszulesen.>> Leider funktioniert das nicht, ich erhalte immer den Wert 0.>> Es funktioniert, wie es soll :-)> Das Register kann man nur lesen, wenn der DMA-Kanal aktiv ist. Das ist> der 'wunderbare' STM32!
Das stimmt meines wissens nach nicht. das DMA-SxNDTR Register kann, wenn
der Stream aus ist sowohl geschrieben als auch gelesen werden. Ist der
Stream jedoch an kann er gelesen aber nicht beschrieben werden.
Gruß
Christopher