STM32F407 DMA

Gast #4664803
Lesenswert?
• ▲
▼
Hallo Leute,

evtl. hat von euch einer eine Idee was hier faul sein könnte.

Ich habe eine simple DMA Übertragung von einem Array im RAM zum
UART, so nun ist es so, dass wenn ich die 1000 Werte die jeweils darin 
liegen per for schleife rüberschaufle immer sauber ankommen.

Wenn ich die 1000 Werte per DMA zum UART schaufeln lasse, dann überträgt 
er meißt die ersten 400 - 800 Werte einwandfrei, die restlichen Werte 
sind nullen...

Dieses Verhalten ist komplett sporadisch, ich hab im RAM direkt schon 
nachgesehen, alle werte stehen am richtigen platz und sind vorhanden.

Was könnte dieses Verhalten hervorrufen?

Hier mein DMA Code:
1
  DMA_DeInit(DMA1_Stream4);                        //Am Anfang deinit um wiederholten transfer zu ermöglichen
2

3
  DMA_InitTypeDef DMA_InitStruct;
4

5
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);          //Clock einschalten DMA1
6

7

8
  DMA_InitStruct.DMA_Channel = DMA_Channel_4;                //DMA1 Channel 4 Stream 4
9
  DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&(UART4->DR);      //Senke UART4 Datenregister
10
  DMA_InitStruct.DMA_Memory0BaseAddr = BaseAddr;              //Quelle Datenarray
11
  DMA_InitStruct.DMA_DIR = DMA_DIR_MemoryToPeripheral;          //Richtung Speicher zum UART
12
  DMA_InitStruct.DMA_BufferSize = 2000;                  //x Bytes übertragen
13
  DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        //UART Datenregister Statisch
14
  DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;          //im array weiterzählen
15
  DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //nur ein byte immer (UART 8 bit modus)
16
  DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;      //nur ein byte immer holen##############################
17
  DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;                //wiederholend???
18
  DMA_InitStruct.DMA_Priority = DMA_Priority_High;            //Priorität
19
  DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable;            //FIFO aus
20
  DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;      //nur bei aktivem FIFO benötigt
21
  DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single;        //ununterbrechbare transfermenge je zyklus
22
  DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;    //ununterbrechbare transfermenge je zyklus
23

24
  DMA_Init(DMA1_Stream4, &DMA_InitStruct);
25

26
  DMA_Cmd(DMA1_Stream4, ENABLE);                      //DMA einschalten... Übertragung starten...

Noch ein paar infos zur Applikation, die DMA Übertragung eines gleich 
großen Arrays mit konstanten werten funktioniert auch ohne probleme.

Der sporadische Kommunikationsfehler tritt nur bei einem variablen Array 
auf, das Array wird in einer Interruptroutine mit den ADC Werten 
gefüllt. Der DMA überträgt dieses Array nicht komplett obwohl es im RAM 
laut debugger komplett gefüllt ist.

Zur gleichen zeit ist es möglich das Array mit den konstanten Werten 
ohne probleme zu übertragen.

Ich bin am verzweifeln, wenn das Array im RAM sauber zu lesen ist, dann 
muss es der DMA doch auch ohne probleme übertragen können.


Vielen Dank für eure Antworten

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.