Forum: Mikrocontroller und Digitale Elektronik STM32F4 DCMI_FLAG_OVFRI: Overflow Raw flag mask


von Stefan (Gast)


Lesenswert?

Hallo zusammen,

ich probiere gerade das DCMI-Interface des STM32F407ZG ans laufen zu 
bekommen.

Dazu habe ich Code von jemanden übernommen und auf meine Hardware 
angepasst.
(Link ganz unten)

Leider schreibt er in diesem Forum nur gelöst und ich finde nicht 
heraus, wie er das gemacht hat.


Als Board nutze ich das STM32E407 mit einer 2 MPixel Kamer von Aptina 
(MT9D111).

Die Kameransteuerung funktioniert einwandfrei und sie liefert auch gute 
Daten.

Ich weiß nicht, ob ich da eine Einstellung vergessen habe.

erst mal meine Initalisierung der GPIO_Pins, des DMA's und des DCMI's
1
void init_dcmi(void){
2
    // Speicher einmal vollschreiben, damit es eindeutige Ergebnisse gibt
3
    for (count = 0;count < 100*100*2*2;count++){
4
      frame_buffer[count] = 0;
5
    }
6
    count =0;
7
    GPIO_InitTypeDef GPIO_InitStructure;
8
    NVIC_InitTypeDef NVIC_InitStructure;
9
10
    /*** Configures the DCMI GPIOs to interface with the OV2640 camera module ***/
11
    /* Enable DCMI GPIOs clocks */
12
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |RCC_AHB1Periph_GPIOC |RCC_AHB1Periph_GPIOE,ENABLE);
13
14
    /* Connect DCMI pins to AF13 */
15
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_DCMI);
16
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_DCMI);
17
18
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_DCMI);
19
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_DCMI);
20
21
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_DCMI);
22
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_DCMI);
23
24
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource0, GPIO_AF_DCMI);
25
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource1, GPIO_AF_DCMI);
26
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource4, GPIO_AF_DCMI);
27
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource5, GPIO_AF_DCMI);
28
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_DCMI);
29
30
    /* DCMI GPIO configuration */
31
    /* GPIO A*/
32
                                //HREF       | PCLK
33
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6 ;
34
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // Alternativfunktion
35
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
36
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //Pullup
37
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;  //Pullup
38
    GPIO_Init(GPIOA, &GPIO_InitStructure);
39
40
    /*GPIO B*/
41
                                //D5         | VSync
42
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 ;
43
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // Alternativfunktion
44
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
45
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //Pullup
46
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;  //Pullup
47
    GPIO_Init(GPIOB, &GPIO_InitStructure);
48
49
    /*GPIO C*/
50
                                //D0         |D1
51
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 ;
52
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // Alternativfunktion
53
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
54
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //Pullup
55
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;  //Pullup
56
    GPIO_Init(GPIOC, &GPIO_InitStructure);
57
58
    /*GPIO E*/
59
                                //D2       | D3         | D4         | D6         | D7
60
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 ;
61
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // Alternativfunktion
62
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
63
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //Pullup
64
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;  //Pullup
65
    GPIO_Init(GPIOE, &GPIO_InitStructure);
66
67
    /*Konfiguriren der I2C Schnittstelle zum steuern der Kamera*/
68
    //init_I2C2(); // I2C initialisierung zur Steuerung der Kamera
69
70
     /* Interrupts*/
71
        NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream1_IRQn;
72
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
73
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
74
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
75
        NVIC_Init(&NVIC_InitStructure);
76
77
78
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
79
        NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn;
80
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
81
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
82
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
83
        NVIC_Init(&NVIC_InitStructure);
84
85
86
      /* dcmi Struktur*/
87
88
        DCMI_InitTypeDef DCMI_InitStructure;
89
        DMA_InitTypeDef  DMA_InitStructure;
90
91
          /*** Configures the DCMI to interface with the OV2640 camera module ***/
92
          /* Enable DCMI clock */
93
          RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE);
94
95
          /* DCMI configuration */
96
          DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous;
97
          DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware;
98
          DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Rising;
99
          DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_Low;
100
          DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_Low;
101
          DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_1of4_Frame;
102
          DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b;
103
          //DCMI_JPEGCmd(ENABLE/DISABLE) bit[3]: JPEG Mode
104
105
          DCMI_Init(&DCMI_InitStructure);
106
107
          //----- mask interrupt for DCMI -----
108
          DCMI_ITConfig(DCMI_IT_VSYNC, ENABLE);
109
          DCMI_ITConfig(DCMI_IT_LINE, ENABLE);
110
          DCMI_ITConfig(DCMI_IT_FRAME, ENABLE);
111
          DCMI_ITConfig(DCMI_IT_OVF, ENABLE);
112
          DCMI_ITConfig(DCMI_IT_ERR, ENABLE);
113
114
          /* Configures the DMA2 to transfer Data from DCMI */
115
          /* Enable DMA2 clock */
116
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
117
118
          /* DMA2 Stream1 Configuration */
119
          DMA_DeInit(DMA2_Stream1); // Deinitalisieren von DMA2_Stream1
120
          DMA_StructInit(&DMA_InitStructure); // Grundeinstellungen vornehmen
121
122
          DMA_InitStructure.DMA_Channel = DMA_Channel_1;
123
          DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(DCMI_BASE+0x28);
124
          DMA_InitStructure.DMA_Memory0BaseAddr = (u32)frame_buffer;
125
          DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
126
          DMA_InitStructure.DMA_BufferSize = 0x1388;
127
          DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
128
          DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
129
          DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
130
          DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
131
          DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
132
          DMA_InitStructure.DMA_Priority = DMA_Priority_High;
133
          DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
134
          DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
135
          DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
136
          DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
137
138
          /* DMA2 IRQ channel Configuration */
139
          DMA_Init(DMA2_Stream1, &DMA_InitStructure);
140
  return;
141
}

Die Interruptroutine habe ich auch aus dem Forum übernommen.
1
void DCMI_IRQHandler(void)
2
{
3
    if(DCMI_GetFlagStatus(DCMI_FLAG_VSYNCRI) == SET)
4
    {
5
        if(start == 0)
6
        {
7
            start = 1;
8
        }
9
        else
10
        {
11
            start = 0;
12
        }
13
    }
14
    else if(DCMI_GetFlagStatus(DCMI_FLAG_LINERI) == SET)
15
    {
16
        if(start == 1)
17
        {
18
            count++;
19
        }
20
        else
21
        {
22
            if(count != 0)
23
            {
24
                printf("count: %d \n\n", count); //just dor counting the number of line
25
            }
26
            count = 0;
27
        }
28
    }
29
    else if(DCMI_GetFlagStatus(DCMI_FLAG_FRAMERI) == SET)
30
    {
31
        printf("DCMI_FLAG_FRAMERI \n\n");
32
    }
33
    else if(DCMI_GetFlagStatus(DCMI_FLAG_ERRRI) == SET)
34
    {
35
        printf("DCMI_FLAG_ERRRI \n\n");
36
    }
37
    else if(DCMI_GetFlagStatus(DCMI_FLAG_OVFRI) == SET)
38
    {
39
        printf("DCMI_FLAG_OVFRI \n\n");  //********** diesen Fehler bekomme ich immer!
40
    }
41
42
43
    DCMI_ClearFlag(DCMI_FLAG_VSYNCRI);
44
    DCMI_ClearFlag(DCMI_FLAG_LINERI);
45
    DCMI_ClearFlag(DCMI_FLAG_FRAMERI);
46
    DCMI_ClearFlag(DCMI_FLAG_ERRRI);
47
    DCMI_ClearFlag(DCMI_FLAG_OVFRI);
48
49
}

Die Kamera ist auf 50x50 Pixel eingestellt und liefert sie auch.
der Speicher, wo er die Daten Reinschreiben soll habe ich wie folgt 
deklariert:
1
u8 frame_buffer[100*100*2*2];

er sollte also eindeutig zu groß sein und es drüfte doch kein Overflow 
auftreten.

in der main(). initialisiere ich alle nötigen Komponenten und probiere 
dann ein Video zu machen.
1
init_dcmi();
2
mt9d131_init(50, 50);
3
DMA_Cmd(DMA2_Stream1, ENABLE);
4
DCMI_Cmd(ENABLE);
5
delay_ms(1000);
6
DCMI_CaptureCmd(ENABLE);

Ich stehe gerade echt auf dem Schlauch und hoffe das mir einer weiter 
helfen kann.

Schon mal im Voraus Danke.

Grüße
Stefan

von Stefan P. (stefan_p49)


Lesenswert?


von vampire (Gast)


Lesenswert?

http://www.mikrocontroller.net/attachment/157288/F4D_ETH_cam.zip
dort Programm 6
-- must Dir zusammensuchen( aber funktioniert!);

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.