mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 DMA durch Timer starten


Autor: A. G. (grtu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

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


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

Beim Timer:
// Interrupt und DMA Request für Channel 1 (Output Compare) einstellen
TIM2->DIER = TIM_DIER_CC1IE | TIM_DIER_CC1DE; 
// Timer einschalten
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?

Autor: Mw E. (Firma: fritzler-avr.de) (fritzler)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. G. (grtu)
Datum:

Bewertung
0 lesenswert
nicht 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. :-(

Autor: Mw E. (Firma: fritzler-avr.de) (fritzler)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. G. (grtu)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
Autor: Mw E. (Firma: fritzler-avr.de) (fritzler)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. G. (grtu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.