Forum: Mikrocontroller und Digitale Elektronik STM32 USB und DCMI + DMA Absturz


von Patrick B. (p51d)


Lesenswert?

Hallo miteinander

Ich stehe momentan komplett auf dem Schlauch: Ich habe an mein 
Stm32F4-Discovery einen kleinen Kamerasensor (OV9655) angeschlossen, und 
möchte nun die Bilder auf dem PC anzeigen. Anfänglich nur ein 
Schnappschuss.
Als Verbindung habe ich das USB Modul mit der Lib 2.1.0 gewählt und 
betreibe nun einen kleinen VCP. Dieser läuft ohne weiteres. Nun wollte 
ich den DMA etwas umschreiben, damit er mir die Daten nicht in einer 
anderen Peripherie (FSMC), sondern in einem Array im Ram speichert, 
bevor ich ihn dan über USB versende.

Doch hier entstehen schon die grossen Probleme/Phänomene:
Irgendwie kann der DMA mit dem DCMI in Kombination mit dem USB nicht 
arbeiten.
Der erste Schritt war einmal dies
1
volatile uint16_t DCMI_Buffer[160 * 120] = {0};
2
3
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE);
4
5
// Reinitialize
6
DCMI_DeInit();
7
8
DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous;
9
DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware;
10
DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Falling;
11
DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_High;
12
DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_High;
13
DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame;
14
DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b;
15
16
DCMI_Init(&DCMI_InitStructure);
17
18
/* DCMI Interrupts config ***************************************************/
19
//  DCMI_ITConfig(DCMI_IT_VSYNC, ENABLE);
20
//  DCMI_ITConfig(DCMI_IT_LINE, ENABLE);
21
//      DCMI_ITConfig(DCMI_IT_FRAME, ENABLE);
22
//  DCMI_ITConfig(DCMI_IT_ERR, ENABLE);
23
//  DCMI_ITConfig(DCMI_IT_OVF, ENABLE);
24
25
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
26
NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn;
27
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
28
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
29
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
30
NVIC_Init(&NVIC_InitStructure);
31
32
/* Configures the DMA2 to transfer Data from DCMI to the LCD ****************/
33
/* Enable DMA2 clock */
34
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
35
36
/* DMA2 Stream1 Configuration */
37
DMA_Cmd(DMA2_Stream1, DISABLE);
38
DMA_DeInit(DMA2_Stream1);
39
while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE);        // Check if the DMA Stream is disabled before enabling it.
40
41
DMA_StructInit(&DMA_InitStructure);
42
DMA_InitStructure.DMA_Channel = DMA_Channel_1;
43
DMA_InitStructure.DMA_PeripheralBaseAddr = DCMI_DR_ADDRESS;
44
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)DCMI_Buffer;
45
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
46
DMA_InitStructure.DMA_BufferSize =  (160 * 120);
47
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
48
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
49
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
50
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
51
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
52
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
53
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
54
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
55
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
56
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
57
DMA_Init(DMA2_Stream1, &DMA_InitStructure);
Dies erzeugt schon einen Fehler beim PC: USB Gerät nicht erkannt, und 
der MCU steckt in einem Hard_fault handler fest.
Neuer Versuch, den Buffer verkelinern. Damit der MCU nicht hängen 
bleibt, muss das Array zwingend mit der doppelten Grösse wie BufferSize 
sein?!?
Wenn ich dann ein Bild streame, dann sind die Daten im kompletten Array. 
Wie kann das sein?

Ich gehe einmal dafon aus, dass die USB Lib von ST Fehlerfrei ist, und 
da über den Debuger die Register genau gleich sind wie ich sie oben 
angegeben habe. Es kann doch nicht sein, dass ich ein Buffer deklariren 
muss, der doppelt so gross ist, wie benötigt, aber dann entgegen den 
Registern doch komplett beschrieben wird.

Ich hoffe, ihr könnt mir etwas weiterhelfen.

Gruss
Patrick

von Detlef K. (adenin)


Lesenswert?

Hmm, wie größ ist den das Bild.
Da sind doch sehr widersprüchliche Daten zu Initalisierung im Code.

von Patrick B. (p51d)


Lesenswert?

Das Bild selber ist 160x120 Pixel à 2 Bytes (RGB565).

Die einzelnen Komponenten sind von den ST-Beispielen angepasst, und sind 
auch auf dem Internet entsprechend forhanden.
Da die einzelnen Komponenten (DCMI + DMA + Interrupts ohne USB; nur USB) 
funktionieren, habe ich mich einmal durch die Erratas durchgelesen und 
das gefunden:
1
When the DMA2 is managing AHB Peripherals (only peripherals embedding FIFOs) and also APB transfers in a concurrent way, this generates a data corruption (multiple DMA access).
2
3
When this condition occurs:
4
• The data transferred by the DMA to the AHB peripherals could be corrupted in case of a FIFO target.
5
• For memories, it will result in multiple access (not visible by the Software) and the data is not corrupted.
6
• For the DCMI, a multiple unacknowledged request could be generated, which implies an unknown behavior of the DMA.
7
8
AHB peripherals embedding FIFO are DCMI, CRYPTO, and HASH. On sales types without CRYPTO, only the DCMI is im pacted. External FIFO controlled by the FSMC is also impacted.

Scheinbar hat der DMA2 Probleme mit sehr grossen Datenmengen, aber ich 
blicke da noch nicht so durch, ob das USB noch irgendwie mit dem AHB 
zusammenhängt.

von majormoritz (Gast)


Lesenswert?

DataSize eventuell auf Word und nicht auf HalfWorld, wenn das Bild 
160×120 a 2bytes ist? Ist aber nur eine vermutung.

Moritz

von Patrick B. (p51d)


Lesenswert?

Byte = 8Bit
HalfWord = 16Bit
Word = 32Bit

... Sollte also passen

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.