Forum: Mikrocontroller und Digitale Elektronik STM32F407 DMA


von Wanninger (Gast)


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

von Wanninger (Gast)


Lesenswert?

Hat sich erledigt,

bitte löschen

Danke

von Termi (Gast)


Lesenswert?

Tja dann poste doch mal den Code mit dem es funktioniert... Könnte ja 
mal nützlich sein.

Greez Termi

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.