STM32F407学习之ov2640模块的应用

简介:

特点如下:

RGB565的输出格式为常用的输出格式。

 时序:

输出时序:总的来说就是HREF在有效电平(高电平)期间 PCLK沿上升沿捕获数据(约1600*2个数据,因为是行输出时序)

PCLK可达36Mhz

输出时序:

VSYNC给出一个脉冲(有效脉冲自己定),Y[9:0]开始采集数据,采集1200个,每个里面又有1600*2个数据。

 

OV2640窗口设置的一些函数如下:

 

 

 示意图:

 OV2640模块对外接口如下:

  该模块的初始化步骤为:

MCU读取OV2640模块图像数据过程:

DMCI简介:

 DMCI特点:

DMCI数据说明:

DMA说明:

其它说明:

 寄存器简介:

  

 DCMI 初始化流程:

OV2640驱动代码: 

下次我做完发一下源码。

害嗨嗨,我又回来了啊,这次使用OV2640和启明STM32F407ZGT6进行搭配使得OV2640采集到的数据显示到LCD屏上。

这是ov2640.c

#include "ov2640.h"
#include "ov2640cfg.h"	  
#include "sccb.h"	
#include "common.h"


//³õʼ»¯OV2640
//ÅäÖÃÍêÒÔºó,ĬÈÏÊä³öÊÇ1600*1200³ß´çµÄͼƬ!! 
//·µ»ØÖµ:0,³É¹¦
//    ÆäËû,´íÎó´úÂë
u8 OV2640_Init(void)
{
		u16 i=0;
	  u16 reg;
	  
	  //ÉèÖÃIO     	   
    GPIO_InitTypeDef  GPIO_InitStructure;
	  //ʹÄÜʱÖÓ
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOG, ENABLE);   //ʹÄÜGPIOA B C E GʱÖÓ 
	  
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_15;//PG15ÍÆÍìÊä³ö
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //ÍÆÍìÊä³ö
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³ö
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­
    GPIO_Init(GPIOG, &GPIO_InitStructure);//³õʼ»¯
	  
		//PWDN(PD3)
   	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
	  GPIO_Init(GPIOD, &GPIO_InitStructure);//³õʼ»¯
	  
	  OV2640_PWDN=0;	//POWER¸ßµçƽÓÐЧ£¬µÍµçƽÎÞЧ
	  delay_ms(10);
	  OV2640_RST=0;	//¸´Î»OV2640
	  delay_ms(10);
	  OV2640_RST=1;	//½áÊø¸´Î» 
	SCCB_Init();        		//³õʼ»¯SCCB µÄIO¿Ú	 
	  SCCB_WR_Reg(OV2640_DSP_RA_DLMT, 0x01);	//²Ù×÷sensor¼Ä´æÆ÷
   	SCCB_WR_Reg(OV2640_SENSOR_COM7, 0x80);	//Èí¸´Î»OV2640
	  delay_ms(50); 
	  reg=SCCB_RD_Reg(OV2640_SENSOR_MIDH);	//¶ÁÈ¡³§¼ÒID ¸ß°Ëλ
	  reg<<=8;
	  reg|=SCCB_RD_Reg(OV2640_SENSOR_MIDL);	//¶ÁÈ¡³§¼ÒID µÍ°Ëλ
	  if(reg!=OV2640_MID)
	  {
	  	//printf("MID:%d\r\n",reg);
	  	return 1;
	  }
	  reg=SCCB_RD_Reg(OV2640_SENSOR_PIDH);	//¶ÁÈ¡³§¼ÒID ¸ß°Ëλ
	  reg<<=8;
	  reg|=SCCB_RD_Reg(OV2640_SENSOR_PIDL);	//¶ÁÈ¡³§¼ÒID µÍ°Ëλ
	  if(reg!=OV2640_PID)
	  {
	  	//printf("HID:%d\r\n",reg);
	  	return 2;
	  }   
 	  //³õʼ»¯ OV2640,²ÉÓÃSXGA·Ö±æÂÊ(1600*1200)  
	  for(i=0;i<sizeof(ov2640_sxga_init_reg_tbl)/2;i++)
	  {
	    	SCCB_WR_Reg(ov2640_sxga_init_reg_tbl[i][0],ov2640_sxga_init_reg_tbl[i][1]);
   	} 
  	return 0x00; 	//ok
}


void OV2640_RGB565_Mode(void) 
{
	u16 i=0;
	//ÉèÖÃ:RGB565Êä³ö
	for(i=0;i<(sizeof(ov2640_rgb565_reg_tbl)/2);i++)
	{
		SCCB_WR_Reg(ov2640_rgb565_reg_tbl[i][0],ov2640_rgb565_reg_tbl[i][1]); 
	} 
} 
//×Ô¶¯ÆعâÉèÖòÎÊý±í,Ö§³Ö5¸öµÈ¼¶
const static u8 OV2640_AUTOEXPOSURE_LEVEL[5][8]=
{
	{
		0xFF,0x01,
		0x24,0x20,
		0x25,0x18,
		0x26,0x60,
	},
	{
		0xFF,0x01,
		0x24,0x34,
		0x25,0x1c,
		0x26,0x00,
	},
	{
		0xFF,0x01,	
		0x24,0x3e,	
		0x25,0x38,
		0x26,0x81,
	},
	{
		0xFF,0x01,
		0x24,0x48,
		0x25,0x40,
		0x26,0x81,
	},
	{
		0xFF,0x01,	
		0x24,0x58,	
		0x25,0x50,	
		0x26,0x92,	
	},
}; 


//OV2640×Ô¶¯ÆعâµÈ¼¶ÉèÖÃ
//level:0~4
void OV2640_Auto_Exposure(u8 level)
{  
	u8 i;
	u8 *p=(u8*)OV2640_AUTOEXPOSURE_LEVEL[level];
	for(i=0;i<4;i++)
	{ 
		SCCB_WR_Reg(p[i*2],p[i*2+1]); 
	} 
}  
//°×ƽºâÉèÖÃ
//0:×Ô¶¯
//1:Ì«Ñôsunny
//2,ÒõÌìcloudy
//3,°ì¹«ÊÒoffice
//4,¼ÒÀïhome
void OV2640_Light_Mode(u8 mode)
{
	u8 regccval=0X5E;//Sunny 
	u8 regcdval=0X41;
	u8 regceval=0X54;
	switch(mode)
	{ 
		case 0://auto 
			SCCB_WR_Reg(0XFF,0X00);	 
			SCCB_WR_Reg(0XC7,0X10);//AWB ON 
			return;  	
		case 2://cloudy
			regccval=0X65;
			regcdval=0X41;
			regceval=0X4F;
			break;	
		case 3://office
			regccval=0X52;
			regcdval=0X41;
			regceval=0X66;
			break;	
		case 4://home
			regccval=0X42;
			regcdval=0X3F;
			regceval=0X71;
			break;	
	}
	SCCB_WR_Reg(0XFF,0X00);	 
	SCCB_WR_Reg(0XC7,0X40);	//AWB OFF 
	SCCB_WR_Reg(0XCC,regccval); 
	SCCB_WR_Reg(0XCD,regcdval); 
	SCCB_WR_Reg(0XCE,regceval);  
}
//É«¶ÈÉèÖÃ
//0:-2
//1:-1
//2,0
//3,+1
//4,+2
void OV2640_Color_Saturation(u8 sat)
{ 
	u8 reg7dval=((sat+2)<<4)|0X08;
	SCCB_WR_Reg(0XFF,0X00);		
	SCCB_WR_Reg(0X7C,0X00);		
	SCCB_WR_Reg(0X7D,0X02);				
	SCCB_WR_Reg(0X7C,0X03);			
	SCCB_WR_Reg(0X7D,reg7dval);			
	SCCB_WR_Reg(0X7D,reg7dval); 		
}
//ÁÁ¶ÈÉèÖÃ
//0:(0X00)-2
//1:(0X10)-1
//2,(0X20) 0
//3,(0X30)+1
//4,(0X40)+2
void OV2640_Brightness(u8 bright)
{
  SCCB_WR_Reg(0xff, 0x00);
  SCCB_WR_Reg(0x7c, 0x00);
  SCCB_WR_Reg(0x7d, 0x04);
  SCCB_WR_Reg(0x7c, 0x09);
  SCCB_WR_Reg(0x7d, bright<<4); 
  SCCB_WR_Reg(0x7d, 0x00); 
}
//¶Ô±È¶ÈÉèÖÃ
//0:-2
//1:-1
//2,0
//3,+1
//4,+2
void OV2640_Contrast(u8 contrast)
{
	u8 reg7d0val=0X20;//ĬÈÏΪÆÕͨģʽ
	u8 reg7d1val=0X20;
  	switch(contrast)
	{
		case 0://-2
			reg7d0val=0X18;	 	 
			reg7d1val=0X34;	 	 
			break;	
		case 1://-1
			reg7d0val=0X1C;	 	 
			reg7d1val=0X2A;	 	 
			break;	
		case 3://1
			reg7d0val=0X24;	 	 
			reg7d1val=0X16;	 	 
			break;	
		case 4://2
			reg7d0val=0X28;	 	 
			reg7d1val=0X0C;	 	 
			break;	
	}
	SCCB_WR_Reg(0xff,0x00);
	SCCB_WR_Reg(0x7c,0x00);
	SCCB_WR_Reg(0x7d,0x04);
	SCCB_WR_Reg(0x7c,0x07);
	SCCB_WR_Reg(0x7d,0x20);
	SCCB_WR_Reg(0x7d,reg7d0val);
	SCCB_WR_Reg(0x7d,reg7d1val);
	SCCB_WR_Reg(0x7d,0x06);
}
//ÌØЧÉèÖÃ
//0:ÆÕͨģʽ    
//1,¸ºÆ¬
//2,ºÚ°×   
//3,Æ«ºìÉ«
//4,Æ«ÂÌÉ«
//5,Æ«À¶É«
//6,¸´¹Å	    
void OV2640_Special_Effects(u8 eft)
{
	u8 reg7d0val=0X00;//ĬÈÏΪÆÕͨģʽ
	u8 reg7d1val=0X80;
	u8 reg7d2val=0X80; 
	switch(eft)
	{
		case 1://¸ºÆ¬
			reg7d0val=0X40; 
			break;	
		case 2://ºÚ°×
			reg7d0val=0X18; 
			break;	 
		case 3://Æ«ºìÉ«
			reg7d0val=0X18; 
			reg7d1val=0X40;
			reg7d2val=0XC0; 
			break;	
		case 4://Æ«ÂÌÉ«
			reg7d0val=0X18; 
			reg7d1val=0X40;
			reg7d2val=0X40; 
			break;	
		case 5://Æ«À¶É«
			reg7d0val=0X18; 
			reg7d1val=0XA0;
			reg7d2val=0X40; 
			break;	
		case 6://¸´¹Å
			reg7d0val=0X18; 
			reg7d1val=0X40;
			reg7d2val=0XA6; 
			break;	 
	}
	SCCB_WR_Reg(0xff,0x00);
	SCCB_WR_Reg(0x7c,0x00);
	SCCB_WR_Reg(0x7d,reg7d0val);
	SCCB_WR_Reg(0x7c,0x05);
	SCCB_WR_Reg(0x7d,reg7d1val);
	SCCB_WR_Reg(0x7d,reg7d2val); 
}
//²ÊÌõ²âÊÔ
//sw:0,¹Ø±Õ²ÊÌõ
//   1,¿ªÆô²ÊÌõ(×¢ÒâOV2640µÄ²ÊÌõÊǵþ¼ÓÔÚͼÏñÉÏÃæµÄ)
void OV2640_Color_Bar(u8 sw)
{
	u8 reg;
	SCCB_WR_Reg(0XFF,0X01);
	reg=SCCB_RD_Reg(0X12);
	reg&=~(1<<1);
	if(sw)reg|=1<<1; 
	SCCB_WR_Reg(0X12,reg);
}
//ÉèÖÃͼÏñÊä³ö´°¿Ú 
//sx,sy,ÆðʼµØÖ·
//width,height:¿í¶È(¶ÔÓ¦:horizontal)ºÍ¸ß¶È(¶ÔÓ¦:vertical)
void OV2640_Window_Set(u16 sx,u16 sy,u16 width,u16 height)
{
	u16 endx;
	u16 endy;
	u8 temp; 
	endx=sx+width/2;	//V*2
 	endy=sy+height/2;
	
	SCCB_WR_Reg(0XFF,0X01);			
	temp=SCCB_RD_Reg(0X03);				//¶ÁÈ¡Vref֮ǰµÄÖµ
	temp&=0XF0;
	temp|=((endy&0X03)<<2)|(sy&0X03);
	SCCB_WR_Reg(0X03,temp);				//ÉèÖÃVrefµÄstartºÍendµÄ×îµÍ2λ
	SCCB_WR_Reg(0X19,sy>>2);			//ÉèÖÃVrefµÄstart¸ß8λ
	SCCB_WR_Reg(0X1A,endy>>2);			//ÉèÖÃVrefµÄendµÄ¸ß8λ
	
	temp=SCCB_RD_Reg(0X32);				//¶ÁÈ¡Href֮ǰµÄÖµ
	temp&=0XC0;
	temp|=((endx&0X07)<<3)|(sx&0X07);
	SCCB_WR_Reg(0X32,temp);				//ÉèÖÃHrefµÄstartºÍendµÄ×îµÍ3λ
	SCCB_WR_Reg(0X17,sx>>3);			//ÉèÖÃHrefµÄstart¸ß8λ
	SCCB_WR_Reg(0X18,endx>>3);			//ÉèÖÃHrefµÄendµÄ¸ß8λ
}
//ÉèÖÃͼÏñÊä³ö´óС
//OV2640Êä³öͼÏñµÄ´óС(·Ö±æÂÊ),ÍêÈ«Óɸĺ¯ÊýÈ·¶¨
//width,height:¿í¶È(¶ÔÓ¦:horizontal)ºÍ¸ß¶È(¶ÔÓ¦:vertical),widthºÍheight±ØÐëÊÇ4µÄ±¶Êý
//·µ»ØÖµ:0,ÉèÖóɹ¦
//    ÆäËû,ÉèÖÃʧ°Ü
u8 OV2640_OutSize_Set(u16 width,u16 height)
{
	u16 outh;
	u16 outw;
	u8 temp; 
	if(width%4)return 1;
	if(height%4)return 2;
	outw=width/4;
	outh=height/4; 
	SCCB_WR_Reg(0XFF,0X00);	
	SCCB_WR_Reg(0XE0,0X04);			
	SCCB_WR_Reg(0X5A,outw&0XFF);		//ÉèÖÃOUTWµÄµÍ°Ëλ
	SCCB_WR_Reg(0X5B,outh&0XFF);		//ÉèÖÃOUTHµÄµÍ°Ëλ
	temp=(outw>>8)&0X03;
	temp|=(outh>>6)&0X04;
	SCCB_WR_Reg(0X5C,temp);				//ÉèÖÃOUTH/OUTWµÄ¸ßλ 
	SCCB_WR_Reg(0XE0,0X00);	
	return 0;
}
//ÉèÖÃͼÏñ¿ª´°´óС
//ÓÉ:OV2640_ImageSize_SetÈ·¶¨´«¸ÐÆ÷Êä³ö·Ö±æÂÊ´Ó´óС.
//¸Ãº¯ÊýÔòÔÚÕâ¸ö·¶Î§ÉÏÃæ½øÐпª´°,ÓÃÓÚOV2640_OutSize_SetµÄÊä³ö
//×¢Òâ:±¾º¯ÊýµÄ¿í¶ÈºÍ¸ß¶È,±ØÐë´óÓÚµÈÓÚOV2640_OutSize_Setº¯ÊýµÄ¿í¶ÈºÍ¸ß¶È
//     OV2640_OutSize_SetÉèÖõĿí¶ÈºÍ¸ß¶È,¸ù¾Ý±¾º¯ÊýÉèÖõĿí¶ÈºÍ¸ß¶È,ÓÉDSP
//     ×Ô¶¯¼ÆËãËõ·Å±ÈÀý,Êä³ö¸øÍⲿÉ豸.
//width,height:¿í¶È(¶ÔÓ¦:horizontal)ºÍ¸ß¶È(¶ÔÓ¦:vertical),widthºÍheight±ØÐëÊÇ4µÄ±¶Êý
//·µ»ØÖµ:0,ÉèÖóɹ¦
//    ÆäËû,ÉèÖÃʧ°Ü
u8 OV2640_ImageWin_Set(u16 offx,u16 offy,u16 width,u16 height)
{
	u16 hsize;
	u16 vsize;
	u8 temp; 
	if(width%4)return 1;
	if(height%4)return 2;
	hsize=width/4;
	vsize=height/4;
	SCCB_WR_Reg(0XFF,0X00);	
	SCCB_WR_Reg(0XE0,0X04);					
	SCCB_WR_Reg(0X51,hsize&0XFF);		//ÉèÖÃH_SIZEµÄµÍ°Ëλ
	SCCB_WR_Reg(0X52,vsize&0XFF);		//ÉèÖÃV_SIZEµÄµÍ°Ëλ
	SCCB_WR_Reg(0X53,offx&0XFF);		//ÉèÖÃoffxµÄµÍ°Ëλ
	SCCB_WR_Reg(0X54,offy&0XFF);		//ÉèÖÃoffyµÄµÍ°Ëλ
	temp=(vsize>>1)&0X80;
	temp|=(offy>>4)&0X70;
	temp|=(hsize>>5)&0X08;
	temp|=(offx>>8)&0X07; 
	SCCB_WR_Reg(0X55,temp);				//ÉèÖÃH_SIZE/V_SIZE/OFFX,OFFYµÄ¸ßλ
	SCCB_WR_Reg(0X57,(hsize>>2)&0X80);	//ÉèÖÃH_SIZE/V_SIZE/OFFX,OFFYµÄ¸ßλ
	SCCB_WR_Reg(0XE0,0X00);	
	return 0;
} 
//¸Ãº¯ÊýÉèÖÃͼÏñ³ß´ç´óС,Ò²¾ÍÊÇËùÑ¡¸ñʽµÄÊä³ö·Ö±æÂÊ

u8 OV2640_ImageSize_Set(u16 width,u16 height)
{ 
	u8 temp; 
	SCCB_WR_Reg(0XFF,0X00);			
	SCCB_WR_Reg(0XE0,0X04);			
	SCCB_WR_Reg(0XC0,(width)>>3&0XFF);		//ÉèÖÃHSIZEµÄ10:3λ
	SCCB_WR_Reg(0XC1,(height)>>3&0XFF);		//ÉèÖÃVSIZEµÄ10:3λ
	temp=(width&0X07)<<3;
	temp|=height&0X07;
	temp|=(width>>4)&0X80; 
	SCCB_WR_Reg(0X8C,temp);	
	SCCB_WR_Reg(0XE0,0X00);				 
	return 0;
}













这是ov2640.h

#ifndef _OV2640_H
#define _OV2640_H

#include "common.h"

#include "sccb.h"

#define OV2640_RST  	PGout(15)			//¸´Î»¿ØÖÆÐźŠ
#define OV2640_PWDN  	PDout(3)			//POWER DOWN¿ØÖÆÐźÅ

// 
#define OV2640_MID				0X7FA2
#define OV2640_PID				0X2642

//µ±Ñ¡ÔñDSPµØÖ·(0XFF=0X00)ʱ,OV2640µÄDSP¼Ä´æÆ÷µØÖ·Ó³Éä±í
#define OV2640_DSP_R_BYPASS     0x05
#define OV2640_DSP_Qs           0x44
#define OV2640_DSP_CTRL         0x50
#define OV2640_DSP_HSIZE1       0x51
#define OV2640_DSP_VSIZE1       0x52
#define OV2640_DSP_XOFFL        0x53
#define OV2640_DSP_YOFFL        0x54
#define OV2640_DSP_VHYX         0x55
#define OV2640_DSP_DPRP         0x56
#define OV2640_DSP_TEST         0x57
#define OV2640_DSP_ZMOW         0x5A
#define OV2640_DSP_ZMOH         0x5B
#define OV2640_DSP_ZMHH         0x5C
#define OV2640_DSP_BPADDR       0x7C
#define OV2640_DSP_BPDATA       0x7D
#define OV2640_DSP_CTRL2        0x86
#define OV2640_DSP_CTRL3        0x87
#define OV2640_DSP_SIZEL        0x8C
#define OV2640_DSP_HSIZE2       0xC0
#define OV2640_DSP_VSIZE2       0xC1
#define OV2640_DSP_CTRL0        0xC2
#define OV2640_DSP_CTRL1        0xC3
#define OV2640_DSP_R_DVP_SP     0xD3
#define OV2640_DSP_IMAGE_MODE   0xDA
#define OV2640_DSP_RESET        0xE0
#define OV2640_DSP_MS_SP        0xF0
#define OV2640_DSP_SS_ID        0x7F
#define OV2640_DSP_SS_CTRL      0xF8
#define OV2640_DSP_MC_BIST      0xF9
#define OV2640_DSP_MC_AL        0xFA
#define OV2640_DSP_MC_AH        0xFB
#define OV2640_DSP_MC_D         0xFC
#define OV2640_DSP_P_STATUS     0xFE
#define OV2640_DSP_RA_DLMT      0xFF 

//µ±Ñ¡Ôñ´«¸ÐÆ÷µØÖ·(0XFF=0X01)ʱ,OV2640µÄDSP¼Ä´æÆ÷µØÖ·Ó³Éä±í
#define OV2640_SENSOR_GAIN       0x00
#define OV2640_SENSOR_COM1       0x03
#define OV2640_SENSOR_REG04      0x04
#define OV2640_SENSOR_REG08      0x08
#define OV2640_SENSOR_COM2       0x09
#define OV2640_SENSOR_PIDH       0x0A
#define OV2640_SENSOR_PIDL       0x0B
#define OV2640_SENSOR_COM3       0x0C
#define OV2640_SENSOR_COM4       0x0D
#define OV2640_SENSOR_AEC        0x10
#define OV2640_SENSOR_CLKRC      0x11
#define OV2640_SENSOR_COM7       0x12
#define OV2640_SENSOR_COM8       0x13
#define OV2640_SENSOR_COM9       0x14
#define OV2640_SENSOR_COM10      0x15
#define OV2640_SENSOR_HREFST     0x17
#define OV2640_SENSOR_HREFEND    0x18
#define OV2640_SENSOR_VSTART     0x19
#define OV2640_SENSOR_VEND       0x1A
#define OV2640_SENSOR_MIDH       0x1C
#define OV2640_SENSOR_MIDL       0x1D
#define OV2640_SENSOR_AEW        0x24
#define OV2640_SENSOR_AEB        0x25
#define OV2640_SENSOR_W          0x26
#define OV2640_SENSOR_REG2A      0x2A
#define OV2640_SENSOR_FRARL      0x2B
#define OV2640_SENSOR_ADDVSL     0x2D
#define OV2640_SENSOR_ADDVHS     0x2E
#define OV2640_SENSOR_YAVG       0x2F
#define OV2640_SENSOR_REG32      0x32
#define OV2640_SENSOR_ARCOM2     0x34
#define OV2640_SENSOR_REG45      0x45
#define OV2640_SENSOR_FLL        0x46
#define OV2640_SENSOR_FLH        0x47
#define OV2640_SENSOR_COM19      0x48
#define OV2640_SENSOR_ZOOMS      0x49
#define OV2640_SENSOR_COM22      0x4B
#define OV2640_SENSOR_COM25      0x4E
#define OV2640_SENSOR_BD50       0x4F
#define OV2640_SENSOR_BD60       0x50
#define OV2640_SENSOR_REG5D      0x5D
#define OV2640_SENSOR_REG5E      0x5E
#define OV2640_SENSOR_REG5F      0x5F
#define OV2640_SENSOR_REG60      0x60
#define OV2640_SENSOR_HISTO_LOW  0x61
#define OV2640_SENSOR_HISTO_HIGH 0x62

 				 
u8 OV2640_Init(void);  
void OV2640_RGB565_Mode(void);
void OV2640_Auto_Exposure(u8 level);
void OV2640_Light_Mode(u8 mode);
void OV2640_Color_Saturation(u8 sat);
void OV2640_Brightness(u8 bright);
void OV2640_Contrast(u8 contrast);
void OV2640_Special_Effects(u8 eft);
void OV2640_Color_Bar(u8 sw);
void OV2640_Window_Set(u16 sx,u16 sy,u16 width,u16 height);
u8 OV2640_OutSize_Set(u16 width,u16 height);
u8 OV2640_ImageWin_Set(u16 offx,u16 offy,u16 width,u16 height);
u8 OV2640_ImageSize_Set(u16 width,u16 height);


#endif

这是ov2640cfg.h

#ifndef _OV2640CFG_H
#define _OV2640CFG_H
#include "ov2640.h" 

const u8 ov2640_sxga_init_reg_tbl[][2]= 
{   
	0xff, 0x00,
	0x2c, 0xff,
	0x2e, 0xdf,
	0xff, 0x01,
	0x3c, 0x32,
	//
	0x11, 0x00,
	0x09, 0x02,
	0x04, 0xD8,//ˮƽ¾µÏñ,´¹Ö±·­×ª
	0x13, 0xe5,
	0x14, 0x48,
	0x2c, 0x0c,
	0x33, 0x78,
	0x3a, 0x33,
	0x3b, 0xfB,
	//
	0x3e, 0x00,
	0x43, 0x11,
	0x16, 0x10,
	//
	0x39, 0x92,
	//
	0x35, 0xda,
	0x22, 0x1a,
	0x37, 0xc3,
	0x23, 0x00,
	0x34, 0xc0,
	0x36, 0x1a,
	0x06, 0x88,
	0x07, 0xc0,
	0x0d, 0x87,
	0x0e, 0x41,
	0x4c, 0x00,
	
	0x48, 0x00,
	0x5B, 0x00,
	0x42, 0x03,
	//
	0x4a, 0x81,
	0x21, 0x99,
	//
	0x24, 0x40,
	0x25, 0x38,
	0x26, 0x82,
	0x5c, 0x00,
	0x63, 0x00,
	0x46, 0x00,
	0x0c, 0x3c,
	//
	0x61, 0x70,
	0x62, 0x80,
	0x7c, 0x05,
	//
	0x20, 0x80,
	0x28, 0x30,
	0x6c, 0x00,
	0x6d, 0x80,
	0x6e, 0x00,
	0x70, 0x02,
	0x71, 0x94,
	0x73, 0xc1, 
	0x3d, 0x34, 
	0x5a, 0x57,
	//
	0x12, 0x00,//UXGA 1600*1200
	
	0x17, 0x11,
	0x18, 0x75,
	0x19, 0x01,
	0x1a, 0x97,
	0x32, 0x36,
	0x03, 0x0f, 
	0x37, 0x40,
	// 
	0x4f, 0xca,
	0x50, 0xa8,
	0x5a, 0x23,
	0x6d, 0x00,
	0x6d, 0x38,
	//
	0xff, 0x00,
	0xe5, 0x7f,
	0xf9, 0xc0,
	0x41, 0x24,
	0xe0, 0x14,
	0x76, 0xff,
	0x33, 0xa0,
	0x42, 0x20,
	0x43, 0x18,
	0x4c, 0x00,
	0x87, 0xd5,
	0x88, 0x3f,
	0xd7, 0x03,
	0xd9, 0x10,
	0xd3, 0x82,
	//
	0xc8, 0x08,
	0xc9, 0x80,
	//
	0x7c, 0x00,
	0x7d, 0x00,
	0x7c, 0x03,
	0x7d, 0x48,
	0x7d, 0x48,
	0x7c, 0x08,
	0x7d, 0x20,
	0x7d, 0x10,
	0x7d, 0x0e,
	//
	0x90, 0x00,
	0x91, 0x0e,
	0x91, 0x1a,
	0x91, 0x31,
	0x91, 0x5a,
	0x91, 0x69,
	0x91, 0x75,
	0x91, 0x7e,
	0x91, 0x88,
	0x91, 0x8f,
	0x91, 0x96,
	0x91, 0xa3,
	0x91, 0xaf,
	0x91, 0xc4,
	0x91, 0xd7,
	0x91, 0xe8,
	0x91, 0x20,
	//
	0x92, 0x00,
	0x93, 0x06,
	0x93, 0xe3,
	0x93, 0x05,
	0x93, 0x05,
	0x93, 0x00,
	0x93, 0x04,
	0x93, 0x00,
	0x93, 0x00,
	0x93, 0x00,
	0x93, 0x00,
	0x93, 0x00,
	0x93, 0x00,
	0x93, 0x00,
	//
	0x96, 0x00,
	0x97, 0x08,
	0x97, 0x19,
	0x97, 0x02,
	0x97, 0x0c,
	0x97, 0x24,
	0x97, 0x30,
	0x97, 0x28,
	0x97, 0x26,
	0x97, 0x02,
	0x97, 0x98,
	0x97, 0x80,
	0x97, 0x00,
	0x97, 0x00,
	//
	0xc3, 0xef,
	
	0xa4, 0x00,
	0xa8, 0x00,
	0xc5, 0x11,
	0xc6, 0x51,
	0xbf, 0x80,
	0xc7, 0x10,
	0xb6, 0x66,
	0xb8, 0xA5,
	0xb7, 0x64,
	0xb9, 0x7C,
	0xb3, 0xaf,
	0xb4, 0x97,
	0xb5, 0xFF,
	0xb0, 0xC5,
	0xb1, 0x94,
	0xb2, 0x0f,
	0xc4, 0x5c,
	//
	0xc0, 0xc8,
	0xc1, 0x96,
	0x8c, 0x00,
	0x86, 0x3d,
	0x50, 0x00,
	0x51, 0x90,
	0x52, 0x2c,
	0x53, 0x00,
	0x54, 0x00,
	0x55, 0x88,
	
	0x5a, 0x90,
	0x5b, 0x2C,
	0x5c, 0x05,
	
	0xd3, 0x02,//autoÉèÖÃҪСÐÄ
	//
	0xc3, 0xed,
	0x7f, 0x00,
	
	0xda, 0x09,
	
	0xe5, 0x1f,
	0xe1, 0x67,
	0xe0, 0x00,
	0xdd, 0x7f,
	0x05, 0x00,
};  
//OV2640 SVGA³õʼ»¯¼Ä´æÆ÷ÐòÁбí
//´ËģʽÏÂ,Ö¡ÂÊ¿ÉÒÔ´ïµ½30Ö¡
//SVGA 800*600
const u8 ov2640_svga_init_reg_tbl[][2]= 
{    
	0xff, 0x00,
	0x2c, 0xff,
	0x2e, 0xdf,
	0xff, 0x01,
	0x3c, 0x32,
	//
	0x11, 0x00,
	0x09, 0x02,
	0x04, 0xD8,//ˮƽ¾µÏñ,´¹Ö±·­×ª
	0x13, 0xe5,
	0x14, 0x48,
	0x2c, 0x0c,
	0x33, 0x78,
	0x3a, 0x33,
	0x3b, 0xfB,
	//
	0x3e, 0x00,
	0x43, 0x11,
	0x16, 0x10,
	//
	0x39, 0x92,
	//
	0x35, 0xda,
	0x22, 0x1a,
	0x37, 0xc3,
	0x23, 0x00,
	0x34, 0xc0,
	0x36, 0x1a,
	0x06, 0x88,
	0x07, 0xc0,
	0x0d, 0x87,
	0x0e, 0x41,
	0x4c, 0x00,
	0x48, 0x00,
	0x5B, 0x00,
	0x42, 0x03,
	//
	0x4a, 0x81,
	0x21, 0x99,
	//
	0x24, 0x40,
	0x25, 0x38,
	0x26, 0x82,
	0x5c, 0x00,
	0x63, 0x00,
	0x46, 0x22,
	0x0c, 0x3c,
	//
	0x61, 0x70,
	0x62, 0x80,
	0x7c, 0x05,
	//
	0x20, 0x80,
	0x28, 0x30,
	0x6c, 0x00,
	0x6d, 0x80,
	0x6e, 0x00,
	0x70, 0x02,
	0x71, 0x94,
	0x73, 0xc1,
	
	0x3d, 0x34, 
	0x5a, 0x57,
	//¸ù¾Ý·Ö±æÂʲ»Í¬¶øÉèÖÃ
	0x12, 0x40,//SVGA 800*600
	0x17, 0x11,
	0x18, 0x43,
	0x19, 0x00,
	0x1a, 0x4b,
	0x32, 0x09,
	0x37, 0xc0,
	//
	0x4f, 0xca,
	0x50, 0xa8,
	0x5a, 0x23,
	0x6d, 0x00,
	0x3d, 0x38,
	//
	0xff, 0x00,
	0xe5, 0x7f,
	0xf9, 0xc0,
	0x41, 0x24,
	0xe0, 0x14,
	0x76, 0xff,
	0x33, 0xa0,
	0x42, 0x20,
	0x43, 0x18,
	0x4c, 0x00,
	0x87, 0xd5,
	0x88, 0x3f,
	0xd7, 0x03,
	0xd9, 0x10,
	0xd3, 0x82,
	//
	0xc8, 0x08,
	0xc9, 0x80,
	//
	0x7c, 0x00,
	0x7d, 0x00,
	0x7c, 0x03,
	0x7d, 0x48,
	0x7d, 0x48,
	0x7c, 0x08,
	0x7d, 0x20,
	0x7d, 0x10,
	0x7d, 0x0e,
	//
	0x90, 0x00,
	0x91, 0x0e,
	0x91, 0x1a,
	0x91, 0x31,
	0x91, 0x5a,
	0x91, 0x69,
	0x91, 0x75,
	0x91, 0x7e,
	0x91, 0x88,
	0x91, 0x8f,
	0x91, 0x96,
	0x91, 0xa3,
	0x91, 0xaf,
	0x91, 0xc4,
	0x91, 0xd7,
	0x91, 0xe8,
	0x91, 0x20,
	//
	0x92, 0x00,
	0x93, 0x06,
	0x93, 0xe3,
	0x93, 0x05,
	0x93, 0x05,
	0x93, 0x00,
	0x93, 0x04,
	0x93, 0x00,
	0x93, 0x00,
	0x93, 0x00,
	0x93, 0x00,
	0x93, 0x00,
	0x93, 0x00,
	0x93, 0x00,
	//
	0x96, 0x00,
	0x97, 0x08,
	0x97, 0x19,
	0x97, 0x02,
	0x97, 0x0c,
	0x97, 0x24,
	0x97, 0x30,
	0x97, 0x28,
	0x97, 0x26,
	0x97, 0x02,
	0x97, 0x98,
	0x97, 0x80,
	0x97, 0x00,
	0x97, 0x00,
	//
	0xc3, 0xed,
	0xa4, 0x00,
	0xa8, 0x00,
	0xc5, 0x11,
	0xc6, 0x51,
	0xbf, 0x80,
	0xc7, 0x10,
	0xb6, 0x66,
	0xb8, 0xA5,
	0xb7, 0x64,
	0xb9, 0x7C,
	0xb3, 0xaf,
	0xb4, 0x97,
	0xb5, 0xFF,
	0xb0, 0xC5,
	0xb1, 0x94,
	0xb2, 0x0f,
	0xc4, 0x5c,
	//¸ù¾Ý·Ö±æÂʲ»Í¬¶øÉèÖÃ
	0xc0, 0x64,
	0xc1, 0x4B,
	0x8c, 0x00,
	0x86, 0x3D,
	0x50, 0x00,
	0x51, 0xC8,
	0x52, 0x96,
	0x53, 0x00,
	0x54, 0x00,
	0x55, 0x00,
	0x5a, 0xC8,
	0x5b, 0x96,
	0x5c, 0x00,
	
	0xd3, 0x02,//autoÉèÖÃҪСÐÄ
	//
	0xc3, 0xed,
	0x7f, 0x00,
	
	0xda, 0x09,
	
	0xe5, 0x1f,
	0xe1, 0x67,
	0xe0, 0x00,
	0xdd, 0x7f,
	0x05, 0x00,
};   
const u8 ov2640_jpeg_reg_tbl[][2]=
{
	0xff, 0x01, 
	0xe0, 0x14,
	0xe1, 0x77,
	0xe5, 0x1f,
	0xd7, 0x03,
	0xda, 0x10,
	0xe0, 0x00, 
};
const u8 ov2640_rgb565_reg_tbl[][2]=
{
	0xFF, 0x00,
	0xDA, 0x09,
	0xD7, 0x03,
	0xDF, 0x02,
	0x33, 0xa0,
	0x3C, 0x00,
	0xe1, 0x67,
	
	0xff, 0x01, 
	0xe0, 0x00,
	0xe1, 0x00,
	0xe5, 0x00,
	0xd7, 0x00, 
	0xda, 0x00,
	0xe0, 0x00,  
};
const u8 ov2640_yuv422_reg_tbl[][2]= 
{
	0xFF, 0x00, 
	0xDA, 0x10,
	0xD7, 0x03,
	0xDF, 0x00,
	0x33, 0x80,
	0x3C, 0x40,
	0xe1, 0x77,
	0x00, 0x00,
};

#endif

这是dcmi.c

#include "common.h"
#include "dcmi.h" 
#include "lcd.h" 
#include "led.h" 
#include "ov2640.h"

u8 ov_frame=0;  						//Ö¡ÂÊ

DCMI_InitTypeDef DCMI_InitStructure;

void DCMI_DMA_Init(u32 DMA_Memory0BaseAddr,u16 DMA_BufferSize,u32 DMA_MemoryDataSize,u32 DMA_MemoryInc)
{ 
	DMA_InitTypeDef  DMA_InitStructure;
	
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2ʱÖÓʹÄÜ 
	DMA_DeInit(DMA2_Stream1);
	while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}//µÈ´ýDMA2_Stream1¿ÉÅäÖà 
	
  DMA_InitStructure.DMA_Channel = DMA_Channel_1;  //ͨµÀ1 DCMIͨµÀ 
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&DCMI->DR;//ÍâÉèµØַΪ:DCMI->DR
  DMA_InitStructure.DMA_Memory0BaseAddr = DMA_Memory0BaseAddr;//DMA ´æ´¢Æ÷0µØÖ·
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//ÍâÉèµ½´æ´¢Æ÷ģʽ
  DMA_InitStructure.DMA_BufferSize = DMA_BufferSize;//Êý¾Ý´«ÊäÁ¿ 
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//ÍâÉè·ÇÔöÁ¿Ä£Ê½
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc;//´æ´¢Æ÷ÔöÁ¿Ä£Ê½
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//ÍâÉèÊý¾Ý³¤¶È:32λ
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize;//´æ´¢Æ÷Êý¾Ý³¤¶È 
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// ʹÓÃÑ­»·Ä£Ê½ 
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;//¸ßÓÅÏȼ¶
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; //FIFOģʽ        
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;//ʹÓÃÈ«FIFO 
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//ÍâÉèÍ»·¢µ¥´Î´«Êä
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//´æ´¢Æ÷Í»·¢µ¥´Î´«Êä
  DMA_Init(DMA2_Stream1, &DMA_InitStructure);//³õʼ»¯DMA Stream
	
} 
//DCMI³õʼ»¯
void My_DCMI_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOE, ENABLE);//ʹÄÜGPIOA B C E ʱÖÓ
	RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI,ENABLE);//ʹÄÜDCMIʱÖÓ
  //PA4/6³õʼ»¯ÉèÖÃ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_6;//PA4/6   ¸´Óù¦ÄÜÊä³ö
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //¸´Óù¦ÄÜÊä³ö
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­
  GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_6;// PB6/7   ¸´Óù¦ÄÜÊä³ö
  GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_11;//PC6/7/8/9/11 ¸´Óù¦ÄÜÊä³ö
  GPIO_Init(GPIOC, &GPIO_InitStructure);//³õʼ»¯	

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;//PE5/6  ¸´Óù¦ÄÜÊä³ö 
  GPIO_Init(GPIOE, &GPIO_InitStructure);//³õʼ»¯	

	GPIO_PinAFConfig(GPIOA,GPIO_PinSource4,GPIO_AF_DCMI); //PA4,AF13  DCMI_HSYNC 
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_DCMI); //PA6,AF13  DCMI_PCLK  
 	GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_DCMI); //PB7,AF13  DCMI_VSYNC 
 	GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_DCMI); //PC6,AF13  DCMI_D0  
 	GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_DCMI); //PC7,AF13  DCMI_D1 
	GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_DCMI); //PC8,AF13  DCMI_D2
	GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_DCMI); //PC9,AF13  DCMI_D3
	GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_DCMI);//PC11,AF13 DCMI_D4 
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_DCMI); //PB6,AF13  DCMI_D5 
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource5,GPIO_AF_DCMI); //PE5,AF13  DCMI_D6
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource6,GPIO_AF_DCMI); //PE6,AF13  DCMI_D7

	
	DCMI_DeInit();//Çå³ýÔ­À´µÄÉèÖà 
 
 
	DCMI_InitStructure.DCMI_CaptureMode=DCMI_CaptureMode_Continuous;//Á¬Ðøģʽ
	DCMI_InitStructure.DCMI_CaptureRate=DCMI_CaptureRate_All_Frame;//È«Ö¡²¶»ñ
	DCMI_InitStructure.DCMI_ExtendedDataMode= DCMI_ExtendedDataMode_8b;//8λÊý¾Ý¸ñʽ  
	DCMI_InitStructure.DCMI_HSPolarity= DCMI_HSPolarity_Low;//HSYNC µÍµçƽÓÐЧ
	DCMI_InitStructure.DCMI_PCKPolarity= DCMI_PCKPolarity_Rising;//PCLK ÉÏÉýÑØÓÐЧ
	DCMI_InitStructure.DCMI_SynchroMode= DCMI_SynchroMode_Hardware;//Ó²¼þͬ²½HSYNC,VSYNC
	DCMI_InitStructure.DCMI_VSPolarity=DCMI_VSPolarity_Low;//VSYNC µÍµçƽÓÐЧ
	DCMI_Init(&DCMI_InitStructure);

	DCMI_ITConfig(DCMI_IT_FRAME,ENABLE);//¿ªÆôÖ¡ÖÐ¶Ï 
	
	DCMI_Cmd(ENABLE);	//DCMIʹÄÜ

  NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//ÇÀÕ¼ÓÅÏȼ¶1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;		//×ÓÓÅÏȼ¶3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQͨµÀʹÄÜ
	NVIC_Init(&NVIC_InitStructure);	//¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷¡¢
} 

//DCMI,Æô¶¯´«Êä
void DCMI_Start(void)
{  
  LCD_SetCursor(0,0);  
	LCD_WriteGRAM();		//¿ªÊ¼Ð´ÈëGRAM
	DMA_Cmd(DMA2_Stream1, ENABLE);//¿ªÆôDMA2,Stream1 
	DCMI_CaptureCmd(ENABLE);//DCMI²¶»ñʹÄÜ  
}
//DCMI,¹Ø±Õ´«Êä
void DCMI_Stop(void)
{ 
  DCMI_CaptureCmd(DISABLE);//DCMI²¶»ñʹ¹Ø±Õ	
	
	while(DCMI->CR&0X01);		//µÈ´ý´«Êä½áÊø 
	 	
	DMA_Cmd(DMA2_Stream1,DISABLE);//¹Ø±ÕDMA2,Stream1
} 

//ÒÔÏÂÁ½¸öº¯Êý,¹©usmartµ÷ÓÃ,ÓÃÓÚµ÷ÊÔ´úÂë

//DCMIÉèÖÃÏÔʾ´°¿Ú
//sx,sy;LCDµÄÆðʼ×ø±ê
//width,height:LCDÏÔʾ·¶Î§.
void DCMI_Set_Window(u16 sx,u16 sy,u16 width,u16 height)
{
	DCMI_Stop(); 
	LCD_Clear(WHITE);
	LCD_Open_Window(sx,sy,width,height);
	OV2640_OutSize_Set(width,height);
  LCD_SetCursor(0,0);  
	LCD_WriteGRAM();		//¿ªÊ¼Ð´ÈëGRAM
	
	DMA_Cmd(DMA2_Stream1,ENABLE);	//¿ªÆôDMA2,Stream1 
	
	DCMI_CaptureCmd(ENABLE);//DCMI²¶»ñʹÄÜ 
	
}
   

void DCMI_CR_Set(u8 pclk,u8 hsync,u8 vsync)
{
	DCMI_DeInit();//Çå³ýÔ­À´µÄÉèÖà 
 
  DCMI_InitStructure.DCMI_CaptureMode=DCMI_CaptureMode_Continuous;//Á¬Ðøģʽ
	DCMI_InitStructure.DCMI_CaptureRate=DCMI_CaptureRate_All_Frame;//È«Ö¡²¶»ñ
	DCMI_InitStructure.DCMI_ExtendedDataMode= DCMI_ExtendedDataMode_8b;//8λÊý¾Ý¸ñʽ  
	DCMI_InitStructure.DCMI_HSPolarity= hsync<<6;//HSYNC µÍµçƽÓÐЧ
	DCMI_InitStructure.DCMI_PCKPolarity= pclk<<5;//PCLK ÉÏÉýÑØÓÐЧ
	DCMI_InitStructure.DCMI_SynchroMode= DCMI_SynchroMode_Hardware;//Ó²¼þͬ²½HSYNC,VSYNC
	DCMI_InitStructure.DCMI_VSPolarity=vsync<<7;//VSYNC µÍµçƽÓÐЧ
	DCMI_Init(&DCMI_InitStructure);

	DCMI_CaptureCmd(ENABLE);//DCMI²¶»ñʹÄÜ 
	DCMI_Cmd(ENABLE);	//DCMIʹÄÜ
  
}

这是dcmi.h

#include "common.h"
#include "dcmi.h" 
#include "lcd.h" 
#include "led.h" 
#include "ov2640.h"

u8 ov_frame=0;  						//Ö¡ÂÊ

DCMI_InitTypeDef DCMI_InitStructure;

void DCMI_DMA_Init(u32 DMA_Memory0BaseAddr,u16 DMA_BufferSize,u32 DMA_MemoryDataSize,u32 DMA_MemoryInc)
{ 
	DMA_InitTypeDef  DMA_InitStructure;
	
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2ʱÖÓʹÄÜ 
	DMA_DeInit(DMA2_Stream1);
	while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}//µÈ´ýDMA2_Stream1¿ÉÅäÖà 
	
  DMA_InitStructure.DMA_Channel = DMA_Channel_1;  //ͨµÀ1 DCMIͨµÀ 
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&DCMI->DR;//ÍâÉèµØַΪ:DCMI->DR
  DMA_InitStructure.DMA_Memory0BaseAddr = DMA_Memory0BaseAddr;//DMA ´æ´¢Æ÷0µØÖ·
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//ÍâÉèµ½´æ´¢Æ÷ģʽ
  DMA_InitStructure.DMA_BufferSize = DMA_BufferSize;//Êý¾Ý´«ÊäÁ¿ 
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//ÍâÉè·ÇÔöÁ¿Ä£Ê½
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc;//´æ´¢Æ÷ÔöÁ¿Ä£Ê½
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//ÍâÉèÊý¾Ý³¤¶È:32λ
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize;//´æ´¢Æ÷Êý¾Ý³¤¶È 
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// ʹÓÃÑ­»·Ä£Ê½ 
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;//¸ßÓÅÏȼ¶
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; //FIFOģʽ        
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;//ʹÓÃÈ«FIFO 
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//ÍâÉèÍ»·¢µ¥´Î´«Êä
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//´æ´¢Æ÷Í»·¢µ¥´Î´«Êä
  DMA_Init(DMA2_Stream1, &DMA_InitStructure);//³õʼ»¯DMA Stream
	
} 
//DCMI³õʼ»¯
void My_DCMI_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOE, ENABLE);//ʹÄÜGPIOA B C E ʱÖÓ
	RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI,ENABLE);//ʹÄÜDCMIʱÖÓ
  //PA4/6³õʼ»¯ÉèÖÃ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_6;//PA4/6   ¸´Óù¦ÄÜÊä³ö
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //¸´Óù¦ÄÜÊä³ö
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­
  GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_6;// PB6/7   ¸´Óù¦ÄÜÊä³ö
  GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_11;//PC6/7/8/9/11 ¸´Óù¦ÄÜÊä³ö
  GPIO_Init(GPIOC, &GPIO_InitStructure);//³õʼ»¯	

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;//PE5/6  ¸´Óù¦ÄÜÊä³ö 
  GPIO_Init(GPIOE, &GPIO_InitStructure);//³õʼ»¯	

	GPIO_PinAFConfig(GPIOA,GPIO_PinSource4,GPIO_AF_DCMI); //PA4,AF13  DCMI_HSYNC 
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_DCMI); //PA6,AF13  DCMI_PCLK  
 	GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_DCMI); //PB7,AF13  DCMI_VSYNC 
 	GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_DCMI); //PC6,AF13  DCMI_D0  
 	GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_DCMI); //PC7,AF13  DCMI_D1 
	GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_DCMI); //PC8,AF13  DCMI_D2
	GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_DCMI); //PC9,AF13  DCMI_D3
	GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_DCMI);//PC11,AF13 DCMI_D4 
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_DCMI); //PB6,AF13  DCMI_D5 
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource5,GPIO_AF_DCMI); //PE5,AF13  DCMI_D6
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource6,GPIO_AF_DCMI); //PE6,AF13  DCMI_D7

	
	DCMI_DeInit();//Çå³ýÔ­À´µÄÉèÖà 
 
 
	DCMI_InitStructure.DCMI_CaptureMode=DCMI_CaptureMode_Continuous;//Á¬Ðøģʽ
	DCMI_InitStructure.DCMI_CaptureRate=DCMI_CaptureRate_All_Frame;//È«Ö¡²¶»ñ
	DCMI_InitStructure.DCMI_ExtendedDataMode= DCMI_ExtendedDataMode_8b;//8λÊý¾Ý¸ñʽ  
	DCMI_InitStructure.DCMI_HSPolarity= DCMI_HSPolarity_Low;//HSYNC µÍµçƽÓÐЧ
	DCMI_InitStructure.DCMI_PCKPolarity= DCMI_PCKPolarity_Rising;//PCLK ÉÏÉýÑØÓÐЧ
	DCMI_InitStructure.DCMI_SynchroMode= DCMI_SynchroMode_Hardware;//Ó²¼þͬ²½HSYNC,VSYNC
	DCMI_InitStructure.DCMI_VSPolarity=DCMI_VSPolarity_Low;//VSYNC µÍµçƽÓÐЧ
	DCMI_Init(&DCMI_InitStructure);

	DCMI_ITConfig(DCMI_IT_FRAME,ENABLE);//¿ªÆôÖ¡ÖÐ¶Ï 
	
	DCMI_Cmd(ENABLE);	//DCMIʹÄÜ

  NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//ÇÀÕ¼ÓÅÏȼ¶1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;		//×ÓÓÅÏȼ¶3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQͨµÀʹÄÜ
	NVIC_Init(&NVIC_InitStructure);	//¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷¡¢
} 

//DCMI,Æô¶¯´«Êä
void DCMI_Start(void)
{  
  LCD_SetCursor(0,0);  
	LCD_WriteGRAM();		//¿ªÊ¼Ð´ÈëGRAM
	DMA_Cmd(DMA2_Stream1, ENABLE);//¿ªÆôDMA2,Stream1 
	DCMI_CaptureCmd(ENABLE);//DCMI²¶»ñʹÄÜ  
}
//DCMI,¹Ø±Õ´«Êä
void DCMI_Stop(void)
{ 
  DCMI_CaptureCmd(DISABLE);//DCMI²¶»ñʹ¹Ø±Õ	
	
	while(DCMI->CR&0X01);		//µÈ´ý´«Êä½áÊø 
	 	
	DMA_Cmd(DMA2_Stream1,DISABLE);//¹Ø±ÕDMA2,Stream1
} 

//ÒÔÏÂÁ½¸öº¯Êý,¹©usmartµ÷ÓÃ,ÓÃÓÚµ÷ÊÔ´úÂë

//DCMIÉèÖÃÏÔʾ´°¿Ú
//sx,sy;LCDµÄÆðʼ×ø±ê
//width,height:LCDÏÔʾ·¶Î§.
void DCMI_Set_Window(u16 sx,u16 sy,u16 width,u16 height)
{
	DCMI_Stop(); 
	LCD_Clear(WHITE);
	LCD_Open_Window(sx,sy,width,height);
	OV2640_OutSize_Set(width,height);
  LCD_SetCursor(0,0);  
	LCD_WriteGRAM();		//¿ªÊ¼Ð´ÈëGRAM
	
	DMA_Cmd(DMA2_Stream1,ENABLE);	//¿ªÆôDMA2,Stream1 
	
	DCMI_CaptureCmd(ENABLE);//DCMI²¶»ñʹÄÜ 
	
}
   

void DCMI_CR_Set(u8 pclk,u8 hsync,u8 vsync)
{
	DCMI_DeInit();//Çå³ýÔ­À´µÄÉèÖà 
 
  DCMI_InitStructure.DCMI_CaptureMode=DCMI_CaptureMode_Continuous;//Á¬Ðøģʽ
	DCMI_InitStructure.DCMI_CaptureRate=DCMI_CaptureRate_All_Frame;//È«Ö¡²¶»ñ
	DCMI_InitStructure.DCMI_ExtendedDataMode= DCMI_ExtendedDataMode_8b;//8λÊý¾Ý¸ñʽ  
	DCMI_InitStructure.DCMI_HSPolarity= hsync<<6;//HSYNC µÍµçƽÓÐЧ
	DCMI_InitStructure.DCMI_PCKPolarity= pclk<<5;//PCLK ÉÏÉýÑØÓÐЧ
	DCMI_InitStructure.DCMI_SynchroMode= DCMI_SynchroMode_Hardware;//Ó²¼þͬ²½HSYNC,VSYNC
	DCMI_InitStructure.DCMI_VSPolarity=vsync<<7;//VSYNC µÍµçƽÓÐЧ
	DCMI_Init(&DCMI_InitStructure);

	DCMI_CaptureCmd(ENABLE);//DCMI²¶»ñʹÄÜ 
	DCMI_Cmd(ENABLE);	//DCMIʹÄÜ
  
}

这是sccb.c

#include "sccb.h"
//#include "SysTick.h"
#include "common.h"


//³õʼ»¯SCCB½Ó¿Ú 
void SCCB_Init(void)
{				
  GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//ʹÄÜGPIODʱÖÓ
  //GPIOF9,F10³õʼ»¯ÉèÖÃ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//PD6,7 ÍÆÍìÊä³ö
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;  //PD6,7 ÍÆÍìÊä³ö
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­
  GPIO_Init(GPIOD, &GPIO_InitStructure);//³õʼ»¯
 
	GPIO_SetBits(GPIOD,GPIO_Pin_6|GPIO_Pin_7);
	SCCB_SDA_OUT();	   
}		


void SCCB_Start(void)
{
    SCCB_SDA=1;     //Êý¾ÝÏ߸ߵçƽ	   
    SCCB_SCL=1;	    //ÔÚʱÖÓÏ߸ߵÄʱºòÊý¾ÝÏßÓɸßÖÁµÍ
    delay_us(50);  
    SCCB_SDA=0;
    delay_us(50);	 
    SCCB_SCL=0;	    //Êý¾ÝÏ߻ָ´µÍµçƽ£¬µ¥²Ù×÷º¯Êý±ØÒª	  
}

//SCCBÍ£Ö¹ÐźÅ
//µ±Ê±ÖÓΪ¸ßµÄʱºò,Êý¾ÝÏߵĵ͵½¸ß,ΪSCCBÍ£Ö¹ÐźÅ
//¿ÕÏÐ×´¿öÏÂ,SDA,SCL¾ùΪ¸ßµçƽ
void SCCB_Stop(void)
{
    SCCB_SDA=0;
    delay_us(50);	 
    SCCB_SCL=1;	
    delay_us(50); 
    SCCB_SDA=1;	
    delay_us(50);
}  
//²úÉúNAÐźÅ
void SCCB_No_Ack(void)
{
	delay_us(50);
	SCCB_SDA=1;	
	SCCB_SCL=1;	
	delay_us(50);
	SCCB_SCL=0;	
	delay_us(50);
	SCCB_SDA=0;	
	delay_us(50);
}

//SCCB,дÈëÒ»¸ö×Ö½Ú
//·µ»ØÖµ:0,³É¹¦;1,ʧ°Ü. 
u8 SCCB_WR_Byte(u8 dat)
{
	u8 j,res;	 
	for(j=0;j<8;j++) //Ñ­»·8´Î·¢ËÍÊý¾Ý
	{
		if(dat&0x80)SCCB_SDA=1;	
		else SCCB_SDA=0;
		dat<<=1;
		delay_us(50);
		SCCB_SCL=1;	
		delay_us(50);
		SCCB_SCL=0;		   
	}			 
	SCCB_SDA_IN();		//ÉèÖÃSDAΪÊäÈë 
	delay_us(50);
	SCCB_SCL=1;			//½ÓÊÕµÚ¾Åλ,ÒÔÅжÏÊÇ·ñ·¢Ëͳɹ¦
	delay_us(50);
	if(SCCB_READ_SDA)res=1;  //SDA=1·¢ËÍʧ°Ü£¬·µ»Ø1
	else res=0;         //SDA=0·¢Ëͳɹ¦£¬·µ»Ø0
	SCCB_SCL=0;		 
	SCCB_SDA_OUT();		//ÉèÖÃSDAΪÊä³ö    
	return res;  
}	 

//SCCB ¶ÁÈ¡Ò»¸ö×Ö½Ú
//ÔÚSCLµÄÉÏÉýÑØ,Êý¾ÝËø´æ
//·µ»ØÖµ:¶Áµ½µÄÊý¾Ý
u8 SCCB_RD_Byte(void)
{
	u8 temp=0,j;    
	SCCB_SDA_IN();		//ÉèÖÃSDAΪÊäÈë  
	for(j=8;j>0;j--) 	//Ñ­»·8´Î½ÓÊÕÊý¾Ý
	{		     	  
		delay_us(50);
		SCCB_SCL=1;
		temp=temp<<1;
		if(SCCB_READ_SDA)temp++;   
		delay_us(50);
		SCCB_SCL=0;
	}	
	SCCB_SDA_OUT();		//ÉèÖÃSDAΪÊä³ö    
	return temp;
} 							    
//д¼Ä´æÆ÷
//·µ»ØÖµ:0,³É¹¦;1,ʧ°Ü.
u8 SCCB_WR_Reg(u8 reg,u8 data)
{
	u8 res=0;
	SCCB_Start(); 					//Æô¶¯SCCB´«Êä
	if(SCCB_WR_Byte(SCCB_ID))res=1;	//дÆ÷¼þID	  
	delay_us(100);
  	if(SCCB_WR_Byte(reg))res=1;		//д¼Ä´æÆ÷µØÖ·	  
	delay_us(100);
  	if(SCCB_WR_Byte(data))res=1; 	//дÊý¾Ý	 
  	SCCB_Stop();	  
  	return	res;
}		  					    
//¶Á¼Ä´æÆ÷
//·µ»ØÖµ:¶Áµ½µÄ¼Ä´æÆ÷Öµ
u8 SCCB_RD_Reg(u8 reg)
{
	u8 val=0;
	SCCB_Start(); 				//Æô¶¯SCCB´«Êä
	SCCB_WR_Byte(SCCB_ID);		//дÆ÷¼þID	  
	delay_us(100);	 
  	SCCB_WR_Byte(reg);			//д¼Ä´æÆ÷µØÖ·	  
	delay_us(100);	  
	SCCB_Stop();   
	delay_us(100);	   
	//ÉèÖüĴæÆ÷µØÖ·ºó£¬²ÅÊǶÁ
	SCCB_Start();
	SCCB_WR_Byte(SCCB_ID|0X01);	//·¢ËͶÁÃüÁî	  
	delay_us(100);
  	val=SCCB_RD_Byte();		 	//¶ÁÈ¡Êý¾Ý
  	SCCB_No_Ack();
  	SCCB_Stop();
  	return val;
}

这是sccb.h

#ifndef __SCCB_H
#define __SCCB_H

//#include "system.h"
#include "common.h"


//IO·½ÏòÉèÖÃ
#define SCCB_SDA_IN()  {GPIOD->MODER&=~(3<<(7*2));GPIOD->MODER|=0<<7*2;}	//PD7 ÊäÈë
#define SCCB_SDA_OUT() {GPIOD->MODER&=~(3<<(7*2));GPIOD->MODER|=1<<7*2;} 	//PD7 Êä³ö

//IO²Ù×÷º¯Êý	 
#define SCCB_SCL    		PDout(6)	 	//SCL
#define SCCB_SDA    		PDout(7) 		//SDA	 

#define SCCB_READ_SDA    	PDin(7)  		//ÊäÈëSDA    
#define SCCB_ID   			0X60  			//OV2640µÄID

///
void SCCB_Init(void);
void SCCB_Start(void);
void SCCB_Stop(void);
void SCCB_No_Ack(void);
u8 SCCB_WR_Byte(u8 dat);
u8 SCCB_RD_Byte(void);
u8 SCCB_WR_Reg(u8 reg,u8 data);
u8 SCCB_RD_Reg(u8 reg);

#endif

这是common.h

#ifndef __COMMON_H
#define __COMMON_H 			   
#include "stm32f4xx.h" 

//  

typedef uint32_t  u32;
typedef uint16_t  u16;
typedef uint8_t   u8;

typedef struct
{
	u16 data0:1;
	u16 data1:1;
	u16 data2:1;
	u16 data3:1;
	u16 data4:1;
	u16 data5:1;
	u16 data6:1;
	u16 data7:1;
	u16 data8:1;
	u16 data9:1;
	u16 data10:1;
	u16 data11:1;
	u16 data12:1;	
	u16 data13:1;
	u16 data14:1;
	u16 data15:1;	
}_gpio_group;

//λ´ø²Ù×÷,ʵÏÖ51ÀàËƵÄGPIO¿ØÖƹ¦ÄÜ
//¾ßÌåʵÏÖ˼Ïë,²Î¿¼<<CM3ȨÍþÖ¸ÄÏ>>µÚÎåÕÂ(87Ò³~92Ò³).M4ͬM3ÀàËÆ,Ö»ÊǼĴæÆ÷µØÖ·±äÁË.
//IO¿Ú²Ù×÷ºê¶¨Òå
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 
//IO¿ÚµØÖ·Ó³Éä
#define GPIOA_ODR_Addr    (GPIOA_BASE+20) //0x40020014
#define GPIOB_ODR_Addr    (GPIOB_BASE+20) //0x40020414 
#define GPIOC_ODR_Addr    (GPIOC_BASE+20) //0x40020814 
#define GPIOD_ODR_Addr    (GPIOD_BASE+20) //0x40020C14 
#define GPIOE_ODR_Addr    (GPIOE_BASE+20) //0x40021014 
#define GPIOF_ODR_Addr    (GPIOF_BASE+20) //0x40021414    
#define GPIOG_ODR_Addr    (GPIOG_BASE+20) //0x40021814   
#define GPIOH_ODR_Addr    (GPIOH_BASE+20) //0x40021C14    
#define GPIOI_ODR_Addr    (GPIOI_BASE+20) //0x40022014     

#define GPIOA_IDR_Addr    (GPIOA_BASE+16) //0x40020010 
#define GPIOB_IDR_Addr    (GPIOB_BASE+16) //0x40020410 
#define GPIOC_IDR_Addr    (GPIOC_BASE+16) //0x40020810 
#define GPIOD_IDR_Addr    (GPIOD_BASE+16) //0x40020C10 
#define GPIOE_IDR_Addr    (GPIOE_BASE+16) //0x40021010 
#define GPIOF_IDR_Addr    (GPIOF_BASE+16) //0x40021410 
#define GPIOG_IDR_Addr    (GPIOG_BASE+16) //0x40021810 
#define GPIOH_IDR_Addr    (GPIOH_BASE+16) //0x40021C10 
#define GPIOI_IDR_Addr    (GPIOI_BASE+16) //0x40022010 
 
//IO¿Ú²Ù×÷,Ö»¶Ôµ¥Ò»µÄIO¿Ú!
//È·±£nµÄֵСÓÚ16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //Êä³ö 
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //ÊäÈë 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //Êä³ö 
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //ÊäÈë 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //Êä³ö 
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //ÊäÈë 

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //Êä³ö 
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //ÊäÈë 

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //Êä³ö 
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //ÊäÈë

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //Êä³ö 
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //ÊäÈë

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //Êä³ö 
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //ÊäÈë

#define PHout(n)   BIT_ADDR(GPIOH_ODR_Addr,n)  //Êä³ö 
#define PHin(n)    BIT_ADDR(GPIOH_IDR_Addr,n)  //ÊäÈë

#define PIout(n)   BIT_ADDR(GPIOI_ODR_Addr,n)  //Êä³ö 
#define PIin(n)    BIT_ADDR(GPIOI_IDR_Addr,n)  //ÊäÈë

#define SYSCLK 168    //ϵͳʱÖÓ

//ÒÔÏÂΪ»ã±àº¯Êý
void WFI_SET(void);		   //Ö´ÐÐWFIÖ¸Áî
void INTX_DISABLE(void); //¹Ø±ÕËùÓÐÖжÏ
void INTX_ENABLE(void);	 //¿ªÆôËùÓÐÖжÏ
void MSR_MSP(u32 addr);	 //ÉèÖöÑÕ»µØÖ· 

void GPIO_group_OUT(_gpio_group *group,u16 outdata);
void GPIO_bits_OUT(GPIO_TypeDef* GPIOx, u8 start_bit, u8 bit_size,u16 outdata);
	
void delay_init(void);
void delay_ms(u16 nms);
void delay_us(u32 nus);

#endif


在主函数里调用一下rgb565_test();就行了。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值