STM32 DMA durch Timer starten

OP #5693018
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
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.
OP #5693079
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. :-(
(Firma: fritzler-avr.de) #5693103
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
OP #5693476
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
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.
OP #5693547
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.