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

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