简介:
特点如下:
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();就行了。