Forum: Mikrocontroller und Digitale Elektronik Pfadprobleme OV7670 STM32F429Zi


von Christian H. (wegweiser2000)


Angehängte Dateien:

Lesenswert?

Hallo mal wieder.

nach den letzten Raschlägen habe ich mir eine OV7670 Cam sowie ein 
STm32F429I Discovery Board gekauft. Nach einiger Spielerei mit eclipse 
und C++ bin ich im Internet auf die folgende Seite gestoßen:

www.urel.feec.vutbr.cz/MPOA/2014/cam-ov7670

Ich habe mit AMR Keil installiert und die OV7670 entsprechend der 
Beschreibung angeschlossen. Weiterhin habe ich das Projekt 
heruntergeladen und in Keil geladen.
Dazu habe ich noch einige Libraries installiert.

Jetzt habe ich folgendes Problem : Zu der main gehören, wie ihr aus der 
Projekt-Spalte entnehmen könnt, mehrere Unterfunktionen. Diese 
Unterfunktionen wurden nicht von mir eingefügt, sondern von der Person, 
die den Code geschrieben hat.
Wenn ich nun mit F7 "target build" durchführe, werden folgende 
Fehlermeldungen ausgegeben:

Error instantiating RTE components
Error #540: 'Keil::Device:StdPeriph Drivers:DCMI:1.3.0' component is not 
available for target 'OptRec'
Error #540: 'Keil::Device:StdPeriph Drivers:DMA:1.3.0' component is not 
available for target 'OptRec'
Error #540: 'Keil::Device:StdPeriph Drivers:Framework:1.3.1' component 
is not available for target 'OptRec'
Error #540: 'Keil::Device:StdPeriph Drivers:GPIO:1.3.0' component is not 
available for target 'OptRec'
Error #540: 'Keil::Device:StdPeriph Drivers:I2C:1.3.0' component is not 
available for target 'OptRec'
Error #540: 'Keil::Device:StdPeriph Drivers:RCC:1.3.0' component is not 
available for target 'OptRec'
Error #540: 'Keil::Device:StdPeriph Drivers:SPI:1.3.0' component is not 
available for target 'OptRec'
Error #540: 'Keil::Device:StdPeriph Drivers:TIM:1.3.0' component is not 
available for target 'OptRec'

Das sind genau die mit einem gelben Zeichen markierten Dateien.

Diese Fehlermeldungen rühren daher, dass die Pfade der Unterfunktionen 
falsch sind. Die Pfade sind noch so gesetzt, wie die Ordner des Urhebers 
aufgebaut waren.
Um das Problem zu beheben habe ich die in dem Dateiordner vorhandenen .c 
und .h Dateien händisch in den jeweiligen Unterordner kopiert. 
Vergeblich.

Meine Frage also:
Wie werden die Funktionen richtig initialisiert und oder die Pfade zu 
meinen Ordnern angepasst ?

Anbei habe ich einige Bilder zum besseren Verständnis angefügt.

Vielen Dank schon mal für Eure Mühen !

von hp-freund (Gast)


Lesenswert?

Christian H. schrieb:
> AMR Keil installiert

Hab ich keine Ahnung von.
Vielleicht irgend was wie bei der Paketinstallation?
RTE muss evtl. dahin wo auch die anderen Pakete sind.

**************************************************************

Aus Spaß habe ich dein Projekt einfach mal in AC6 probiert.
Entgegen der Erwartung, wird es ohne Probleme gebaut.

von Christian H. (wegweiser2000)


Lesenswert?

Ist AC6 eine Workbench für eclipse (Keplar) ?

von hp-freund (Gast)


Lesenswert?

http://www.openstm32.org/HomePage

Kann man mit Anmeldung dort herunterladen, geht aber auch anders.

Ich habe aktuell Neon mit dem Plugin installiert.
Siehe:
Beitrag "Re: STM32F7 Discovery Board"

Geht auch für Win. Musst nur die richtigen Punkte auswählen.

von Christian H. (wegweiser2000)


Angehängte Dateien:

Lesenswert?

Guten Tag,

gestern bin ich ein Wenig weiter gekommen. Der Fehler liegt in der Datei 
stm32f4xx_conf.h(StdPeriph Drivers:Framework).Dort werden auch RTE 
eingebunden.


Diese wird vom System nicht gefunden und enthält exakt die Dateien, die 
Probleme machen.

Wie ist die übergeordnete "Device" Datei mit der main verknüpft, bzw. 
wie ist der Fehler zu beheben ?

von Christian H. (wegweiser2000)


Angehängte Dateien:

Lesenswert?

Ich beantworte mir die Frage einmal selbst.

Die Funktionen, die den Fehler auslösen sind im Run-Time 
Environment-Manager nicht ausgewählt und auch nicht vorhanden. 
Bildausschnitt anbei, erklärender Link darunter.

http://www.keil.com/support/man/docs/uv4/uv4_ca_rtemanager.htm

Die Nächste Frage:

Wo läd man die StdPeriph Diver Bib herunter ? Ich habe google bemüht, 
aber leider nichts gefunden.

Gruß

Wegweiser

von jonny p (Gast)


Lesenswert?

Hallo erstmal,
zum einen musst du mal schauen ob da etwas mit update oder Download 
steht, das müsste dann so auch funktionieren

zum anderen bist du hier glaube ich zumindest im falschen Forum,da hier 
die wenigsten hilfreiche tips dir geben können zum Thema Stm32.
hier dreht sich meist alles um die schrottigen AVR's

von Nico W. (nico_w)


Lesenswert?

jonny p schrieb:
> zum anderen bist du hier glaube ich zumindest im falschen Forum,da hier
> die wenigsten hilfreiche tips dir geben können zum Thema Stm32.

Ich denke nicht. Gefühlte 90% unter dem Filter 'ARM' betrifft STM32.

Christian H. schrieb:
> Wo läd man die StdPeriph Diver Bib herunter ? Ich habe google bemüht,
> aber leider nichts gefunden.

Wohl nicht genau genug :)
https://www.google.de/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=stdperiph%20stm32

http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-libraries.html?querycriteria=productId=LN1939

von Christian H. (wegweiser2000)


Angehängte Dateien:

Lesenswert?

Hallo mal wieder.

Nachdem ich nun einige Wochen mit dem Bord und der OV7670 herumprobiert 
habe, ist ein neues Problem aufgreten, auf das ich keine Antwort weis. 
Auf meinem Display erscheinen nur ungeordnete Pixel. Wenn ich den Deckel 
aufsetze (=dunkel), färben sich die Pixel rötlich..... In den Anlagen 2 
Bilder von der OV7670 und dem STM32F429ZI.

Der  Code ist mit CoCOX programmiert worden.

Als Hintergrundwissen dienten folgende Seiten:


http://embeddedprogrammer.blogspot.de/2012/07/hacking-ov7670-camera-module-sccb-cheat.html

http://supuntharanga.blogspot.de/2014/04/stm32f4-discovery-board-ov7660-or.html

http://www.urel.feec.vutbr.cz/MPOA/2014/cam-ov7670

Ich hoffe einer von euch hat wieder einmal eine Idee...


Mit in dem Code sind noch Teile von einer OV3640, was ich von einem 
Forenmitglied kopiert habe.


//              PA4  -> DCMI_HSYNC  = Camera HSYNC (HREF)
//              PA6  -> DCMI_PCLK   = Camera PCLK (PIXCLK)
//    PA8  ->  DCMI_XCLK   = Camera XCL
//              PB7  -> DCMI_VSYNC  = Camera VSYNC
//              PB8  -> I2C1-SCL    = Camera I2C-SCL
//              PB9  -> I2C1-SDA    = Camera I2C-SDA

//              PC6  -> DCMI_D0     = Camera D0
//              PC7  -> DCMI_D1     = Camera D1
//              PC8  -> DCMI_D2     = Camera D2
//              PC9  -> DCMI_D3     = Camera D3
//              PE4  -> DCMI_D4     = Camera D4
//              PD3  -> DCMI_D5     = Camera D5
//              PE5  -> DCMI_D6     = Camera D6
//              PE6  -> DCMI_D7     = Camera D7

//


#define cam_ov7670 0
#define cam_ov3640 1
#define cam_mtd112 2//not yet tested
#define cam_chip 1

volatile uint8_t registerValue;

#define DELAY_MS 0
#define ARRAY_END 0xff


typedef struct CamReg_t{
    uint16_t addr;
    uint8_t data;
} CamReg;




#if cam_chip==cam_ov7670
#define cam_adr 0x42
#define reg_datei ov7670_reg
#define vsync_signal DCMI_VSPolarity_High
#define hline_signal DCMI_HSPolarity_Low
#define pclk_polarity DCMI_PCKPolarity_Rising
#define sccb_bus_wr sccb_wr_8_8
#define sccb_bus_rd sccb_rd_8_8
//#define cam_format  cam_formatVGA
u32 h_px=1024, v_px=768;            //640 480
#define cam_format_xQVGA  2
#define regDateiFile  "ov7670_regs.h"
#endif

#if cam_chip==cam_ov3640
#define cam_adr 0x78
#define vsync_signal DCMI_VSPolarity_Low
#define hline_signal DCMI_HSPolarity_Low
#define pclk_polarity DCMI_PCKPolarity_Rising
//#define pclk_polarity DCMI_PCKPolarity_Falling
#define sccb_bus_wr sccb_wr_16_8
#define sccb_bus_rd sccb_rd_16_8
#define cam_format_xQVGA  3
u32 h_px=1024, v_px=768;
#define reg_datei ov3640_xga
#define regDateiFile "ov3640_regxxx.h"
#endif

#if cam_chip==cam_mtd112//not tested
#define cam_adr 0xba
#define vsync_signal DCMI_VSPolarity_Low
#define hline_signal DCMI_HSPolarity_Low
#define pclk_polarity DCMI_PCKPolarity_Rising
#define sccb_bus_wr sccb_wr_16_16
#define sccb_bus_rd sccb_rd_16_16
//#define cam_format  cam_formatQVGA
#define cam_format_xQVGA  2
#define reg_datei mtd112_reg
#define regDateiFile "mt9d112_regs.h"
#endif

/*#if cam_format==cam_formatQVGA
#define H_PX 320
#define V_PX 240
#endif
#if cam_format==cam_formatVGA*/
#define H_PX 320*cam_format_xQVGA
#define V_PX 240*cam_format_xQVGA
/*#endif
#if cam_format==cam_formatUXGA
//#define H_PX 1600
//#define V_PX 1200
#define H_PX 320*3
#define V_PX 240*3
#endif
*/
#include regDateiFile

#define DCMI_DR_REGISTER   DCMI_BASE|0x28
#define SDRAM_START_ADRx      ((uint32_t)0xD0000000)
#define cam_bufferStart        SDRAM_START_ADRx
//#define H_PX 640
//#define V_PX 480
#define pwdn_high    pinSET(C,14)
#define pwdn_low    pinCLR(C,14)

volatile uint16_t *pixel_cursorDB=cam_bufferStart+H_PX<<3;//>*10;
volatile uint32_t zl_Hline;

void DMA2_Stream1_IRQHandler(void){
  if(DMA_GetITStatus(DMA2_Stream1, DMA_IT_TCIF1)){//TransferComplete
    DMA_ClearITPendingBit(DMA2_Stream1, DMA_IT_TCIF1);
    zl_Hline+=8;
    pixel_cursorDB+=h_px<<3;//*8
    if((zl_Hline)%16){//line0 ready - start line1
      DMA2_Stream1->M0AR=0xD0000000+4*h_px*zl_Hline;
    }else{//line1 ready - start line0
      DMA2_Stream1->M1AR=0xD0000000+4*h_px*zl_Hline;
    }
  }
}

void cam_InitXCLK(){
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);    // war 
auskom.
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_MCO);  // PA8 = XCL
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      // war auskom.
    //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;    // war auskom.
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        // neu
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //HSE 8mhz HSI 16mhz PLLC 168mhz
//    RCC_MCO1Config(RCC_MCO1Source_HSE,RCC_MCO1Div_1);
//    RCC_MCO1Config(RCC_MCO1Source_HSI,RCC_MCO1Div_1);
    RCC_MCO1Config(RCC_MCO1Source_PLLCLK,RCC_MCO1Div_5);

//Pwdn
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
  //GPIOG->OSPEEDR=  GPIO_Speed_50MHz<<(2*pin);
  }
void cam_InitIO(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_DCMI); // 
PA4=DCMI_HSYNC -> HSNYC
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_DCMI); // 
PA6=DCMI_PCLK  -> PCLK

    // Structur fuer Port-A
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6 | GPIO_Pin_8; 
// Pin 8 auskommentieren

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;        //war drin
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;          // neu von 
mir
    // Config von Port-A
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //-----------------------------------------
    // Alle Pins von Port-B initialisieren
    //-----------------------------------------
    //GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_DCMI); // 
PB6=DCMI_D5    -> D5
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_DCMI); // 
PB7=DCMI_VSYNC -> VSYNC

    // Structur fuer Port-B
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    // Config von Port-B
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //-----------------------------------------
     // Alle Pins von Port-C initialisieren
     //-----------------------------------------
     GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_DCMI); // 
PC6=DCMI_D0    -> D0
     GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_DCMI); // 
PC7=DCMI_D1    -> D1
     GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_DCMI); // 
PC8=DCMI_D2    -> D2
     GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_DCMI); // 
PC9=DCMI_D3    -> D3

     // Structur fuer Port-C
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 
| GPIO_Pin_9;

     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
     // Config von Port-C
     GPIO_Init(GPIOC, &GPIO_InitStructure);

     //-----------------------------------------
      // Alle Pins von Port-d initialisieren
      //-----------------------------------------
      GPIO_PinAFConfig(GPIOD, GPIO_PinSource3, GPIO_AF_DCMI); // 
PC6=DCMI_D0    -> D0

      // Structur fuer Port-d
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
      // Config von Port-d
      GPIO_Init(GPIOD, &GPIO_InitStructure);

    //-----------------------------------------
    // Alle Pins von Port-E initialisieren
    //-----------------------------------------
//    GPIO_PinAFConfig(GPIOE, GPIO_PinSource0, GPIO_AF_DCMI); // 
PE0=DCMI_D2    -> D4
//    GPIO_PinAFConfig(GPIOE, GPIO_PinSource1, GPIO_AF_DCMI); // 
PE1=DCMI_D3    -> D4
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource4, GPIO_AF_DCMI); // 
PE4=DCMI_D4    -> D4
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource5, GPIO_AF_DCMI); // 
PE5=DCMI_D6    -> D6
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_DCMI); // 
PE6=DCMI_D7    -> D7

    // Structur fuer Port-E
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | 
GPIO_Pin_6;//|GPIO_Pin_0 |GPIO_Pin_1 ;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    // Config von Port-E
    GPIO_Init(GPIOE, &GPIO_InitStructure);


    //HSE 8mhz HSI 16mhz PLLC 168mhz
  //  RCC_MCO1Config(RCC_MCO1Source_HSI,RCC_MCO1Div_1);
    RCC_MCO1Config(RCC_MCO1Source_PLLCLK,RCC_MCO1Div_5);
    pinDIRout(B,9);
  }

void mco_xclock_on (void){
  RCC->CFGR |= RCC_MCO1Source_PLLCLK;
}

void mco_xclock_off (void){
  RCC->CFGR &=~ RCC_MCO1Source_PLLCLK;
}

void powerDnSeq(void){
mco_xclock_off();
pwdn_low;
}

void cam_powerUpSeq(void){
powerDnSeq();
_delay_ms(300);
pwdn_high;
_delay_ms(11);
mco_xclock_on();
_delay_ms(11);
pwdn_low;
_delay_ms(20);
}



void cam_init_sccb_io(void) {
  GPIO_InitTypeDef GPIO_InitStructure;
  // Clock Enable
//RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  // Config PG13 als Digital-Ausgang
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}




void cam_InitDCMI(void){
    DCMI_InitTypeDef DCMI_InitStructure;

    // Clock enable
    RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE);

    // DCMI init
    //DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_SnapShot;
    DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous;
    DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware;

    //DCMI_InitStructure.DCMI_PCKPolarity = pclk_polarity;
    DCMI_InitStructure.DCMI_PCKPolarity = 
DCMI_PCKPolarity_Rising;//of7670
//    DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Falling;

    //DCMI_InitStructure.DCMI_VSPolarity = vsync_signal;
    DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_High;//of7670

   // DCMI_InitStructure.DCMI_HSPolarity = hline_signal;
    DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_Low;//of7670

    DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_1of4_Frame;
    DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b;
    DCMI_Init(&DCMI_InitStructure);
}

//--------------------------------------------------------------
void cam_InitDMA(void){
    DMA_InitTypeDef  DMA_InitStructure;

    // Clock enable
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);

    // DMA deinit
    DMA_Cmd(DMA2_Stream1, DISABLE);
    DMA_DeInit(DMA2_Stream1);

    // DMA init

    DMA_InitStructure.DMA_Channel = DMA_Channel_1;
    DMA_InitStructure.DMA_PeripheralBaseAddr =&DCMI->DR;// 
OV9655_DCMI_REG_DR_ADDRESS;//
    DMA_InitStructure.DMA_Memory0BaseAddr = 0xD0000000;//LCD_RAM_ADR;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    DMA_InitStructure.DMA_BufferSize = h_px*8;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  //  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

    DMA_InitStructure.DMA_PeripheralDataSize = 
DMA_PeripheralDataSize_Word;
    //DMA_InitStructure.DMA_PeripheralDataSize = 
DMA_PeripheralDataSize_Byte;

   // DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;

    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;

  //  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  //  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_INC4;
    DMA_Init(DMA2_Stream1, &DMA_InitStructure);

    DMA_DoubleBufferModeCmd(DMA2_Stream1, ENABLE);
  //  DMA_MemoryTargetConfig(DMA2_Stream1,pixel_cursorDB+100000, 
DMA_Memory_1);
    DMA2_Stream1->M1AR=0xD0000000+h_px*8*4;
    DMA_ITConfig(DMA2_Stream1,DMA_IT_TC,ENABLE);
  }


void cam_CaptureStart(void){
    // Cursor auf Start setzen
  //  UB_LCD_SetCursor2Draw(LCD_WINDOW.xstart,LCD_WINDOW.ystart);
    // DMA enable
//  cam_InitDCMI();
    zl_Hline=0;
    DMA2_Stream1->M0AR=0xD0000000;
    DMA2_Stream1->M1AR=0xD0000000+H_PX*8*4;
  cam_InitDMA();
   DMA_Cmd(DMA2_Stream1, ENABLE);
    // DCMI enable
    DCMI_Cmd(ENABLE);
    // Capture enable
    DCMI_CaptureCmd(ENABLE);
  }



//--------------------------------------------------------------
// stoppen vom Capture-Mode
// und stopen vom LCD zugriff
//--------------------------------------------------------------
void camx_CaptureStop(void)
{
  // Capture disable
  DCMI_CaptureCmd(DISABLE);
  // DCMI disable
  DCMI_Cmd(DISABLE);
  // DMA disable
  DMA_Cmd(DMA2_Stream1, DISABLE);
}

void DMA2Stream1_InitNVIC(void){
    NVIC_InitTypeDef NVIC_InitStructure;
    DMA_ITConfig(DMA2_Stream1, DMA_IT_TC, ENABLE);
      NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream1_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

}

void cam_init(void){
    // init vom Camera-Modul

}

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.