STM32 DMA durch Timer starten

#5693018
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?
(Firma: fritzler-avr.de) #5693059
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.
#5693079
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. :-(
#5693476
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?
Angehängte Dateien:
(Firma: fritzler-avr.de) #5693500
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren