Forum: Mikrocontroller und Digitale Elektronik STM32 DMA durch Timer starten


von A. G. (grtu)


Lesenswert?

Hallo zusammen,

ich schaffe es einfach nicht bei einem STM32F4 mit einem Timer DMA zu 
triggern. Folgendes stelle ich ein:


Bei DMA1:
1
// Den Stream ausschalten
2
DMA1_Stream5->CR &= ~DMA_SxCR_EN;
3
// Warten bis er ausgeschaltet ist
4
while (DMA1_Stream5->CR & DMA_SxCR_EN);
5
// Vorherige Flags rücksetzen
6
DMA1->HISR &= ~DMA_HISR_DMEIF6_Msk;
7
// Ziel: GPIOD
8
DMA1_Stream5->PAR = (uint32_t)&GPIOD->BSRR;
9
// Quelle: ein Array
10
DMA1_Stream5->M0AR = (uint32_t)quellArray;
11
DMA1_Stream5->NDTR = numWerte;
12
// Channel 3 (für TIM2_CH1) auswählen
13
DMA1_Stream5->CR |= 3 << DMA_SxCR_CHSEL_Pos;
14
// Priorität, Richtung, Datengröße usw. in CR setzen
15
// ...
16
// Stream einschalten
17
DMA1_Stream5->CR |= DMA_SxCR_EN;

Beim Timer:
1
// Interrupt und DMA Request für Channel 1 (Output Compare) einstellen
2
TIM2->DIER = TIM_DIER_CC1IE | TIM_DIER_CC1DE; 
3
// Timer einschalten
4
TIM2->CR1 |= TIM_CR1_CEN;


Der Timer läuft dann, was ich am Interrupt sehe, jedoch scheint der DMA 
Stream nicht gestartet zu werden. Ich sehe jedenfalls keine Änderung an 
den Pins bei GPIOD. Habe ich irgendwas vergessen?

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Willste wirklich auf das BSRR schreiben?
Also dein Array enthält die passenden Bits zum setzen und löschen der 
Ausgänge?
Oder wollteste lieber das ODR nehmen um direkt die Ausgänge nach den 
Arraywerten zu setzen?

Gib dir doch mal aus ob nach einem CC1 Interrupt das DMA1_Stream5->NDTR 
auch wirklich runterzählt.
Sonst weis man nicht wo das Signal im Silizium versickert.

von A. G. (grtu)


Lesenswert?

Mw E. schrieb:
> Willste wirklich auf das BSRR schreiben?
> Also dein Array enthält die passenden Bits zum setzen und löschen der
> Ausgänge?
> Oder wollteste lieber das ODR nehmen um direkt die Ausgänge nach den
> Arraywerten zu setzen?

Ganz genau. Ich will nur einige der Pins auf dem Port verändern.

Mw E. schrieb:
> Gib dir doch mal aus ob nach einem CC1 Interrupt das DMA1_Stream5->NDTR
> auch wirklich runterzählt.
> Sonst weis man nicht wo das Signal im Silizium versickert.

Es wird leider nichtmal runtergezählt. :-(

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Vllt auch mal nach dem Klassiker geguckt? Aka Takt vergessen 
einzuschalten für den DMA.

Was ich noch sehe ist, dass
1) im HISR nicht alle Flags gelöscht werden
2) da bei dem einen Bit die maske für Stream6 und nicht 5 genutzt wird

von A. G. (grtu)


Angehängte Dateien:

Lesenswert?

Das war tatsächlich ein Tippfehler, vielen Dank für den Hinweis =)

Nach etwas Entlausen habe ich gemerkt, dass der Stream zwar getriggert 
wird, aber beim ersten mal einen Transfer Error Interrupt wirft. Ich 
habe die Register nochmal alle nachgeschaut, aber keinen Fehler 
gefunden. Sie sehen vor (bis auf EN) und nach dem Fehler wie im Anhang 
aus. Ich habe gelesen, dass eventuell nicht auf den Speicherbereich 
zugegriffen werden kann, kann das sein?

: Bearbeitet durch User
von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

DING!
Mit einem DMA hab ich ja auch schonmal auf den GPIOs getrommelt.
Jetz wo dus sagst erinner ich mich wieder an ein Detail.
Nur bei einem der beiden DMA sind beide Bus Anschlüsse an der Busmatrix.
Ansonsten geht das direkt zum APB.
Da beim F4 die GPIO am AHB hängen muss dann dieser DMA genommen werden.

Beim 407/405 ist das dann der DMA2 und nicht DMA1.
Ein Blick in das Datenblatt (nicht RefMan in dem Fall) unter Device 
Overview brignt da Erhellung.

von A. G. (grtu)


Lesenswert?

Mist, ich hätte schwören können, es wäre DMA1 gewesen. Dann kann ichs 
wohl vergessen einen der beiden 32 bit Timer dafür zu nehmen -.-

Vielen Dank für den Hinweis, das hätte mich noch eine Weile gekostet.

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
Noch kein Account? Hier anmelden.