本人萌新学生,最近在学stm32f4.做到了摄像头。淘宝6块买了个不带fifo的ov7670和一块电阻式触摸屏,做了个简易摄像机,功能暂时只能实时显示摄像头的图像,按键可以截屏,后续有新功能会补上的,下面是部分初始化

u8 OV7670_Init(void)
 {
 u16 i=0;
//设置IO     	   
GPIO_InitTypeDef  GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
//GPIOG9,15初始化设置pow和reset
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_15;//PG9,15推挽输出
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);//初始化
OV7670_PWDN=0;	//POWER ON
delay_ms(10);
OV7670_RST=0;	//复位OV7670
delay_ms(10);
OV7670_RST=1;	//结束复位 
SCCB_Init();        		//初始化SCCB 的IO口	
SCCB_WR_Reg(0X12, 0x80);	//软复位OV7670
delay_ms(50); 


//初始化 OV7670,采用QVGA分辨率(320*240)  
for(i=0;i<sizeof(ov7670_init_reg_tbl)/sizeof(ov7670_init_reg_tbl[0]);i++)
{
   	SCCB_WR_Reg(ov7670_init_reg_tbl[i][0],ov7670_init_reg_tbl[i][1]);
} 
return 0x00; 	//ok
}
//初始化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();
}
//DCMI 初始化
 void DCMI_DMA_Init(void)
 {
 DMA_InitTypeDef DMA_InitStructure;
 NVIC_InitTypeDef NVIC_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 = (u32)&LCD->LCD_RAM;//DMA 存储器0地址 lcd
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//外设到存储器模式 搬运数据:摄像头->lcd
DMA_InitStructure.DMA_BufferSize = 10;//数据传输量 
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//存储器增量模式 关闭
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//外设数据长度:32位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord ;//存储器数据长度 16bit 
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
	
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);	//根据指定的参数初始化VIC寄存器、
}
//DCMI初始化
 void DCMI_Initxx(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_Falling;//PCLK 上升沿有效
DCMI_InitStructure.DCMI_SynchroMode= DCMI_SynchroMode_Hardware;//硬件同步HSYNC,VSYNC
DCMI_InitStructure.DCMI_VSPolarity=DCMI_VSPolarity_High;//VSYNC 低电平有效
DCMI_Init(&DCMI_InitStructure);

DCMI_ITConfig(DCMI_IT_FRAME,ENABLE);//开启帧中断 
DCMI_ITConfig(DCMI_IT_LINE,ENABLE); //开启行中断
DCMI_ITConfig(DCMI_IT_VSYNC,ENABLE); //开启场中断	
DCMI_Cmd(ENABLE);	//DCMI使能

NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;		//子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
NVIC_Init(&N

主程序

#include “sys.h”
 #include “delay.h”
 #include “usart.h”
 #include “led.h”
 #include “key.h”
 #include “lcd.h”#include “timer.h”
 #include “ov7670.h”
 #include “dcmi.h”
 #include “key.h”
 #include “spi.h”
 #include “touch.h”
 #include “w25q128xx.h”//清空屏幕并在右上角显示"RST"
 void Load_Drow_Dialog(void)
 {
 LCD_Clear(WHITE);//清屏
 POINT_COLOR=BLUE;//设置字体为蓝色
 LCD_ShowString(lcddev.width-24,0,200,16,16,“RST”);//显示清屏区域
 POINT_COLOR=RED;//设置画笔蓝色
 }void ov7670_test(void)
 {
 //u8 key=0;
 //DCMI_Start(); //开启cam
 u8 key;
 u8 i=0; 
 while(1)
 {
 key=KEY_Scan(0);
 tp_dev.scan(0); 
 if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下
 { 
 if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
 { 
 if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)Load_Drow_Dialog();//清除
 else TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED); //画图 
 }
 }else delay_ms(10); //没有按键按下的时候 
 if(keyKEY0_PRES) //KEY0按下,则执行校准程序
 {
 LCD_Clear(WHITE); //清屏
 TP_Adjust(); //屏幕校准
 TP_Save_Adjdata(); 
 Load_Drow_Dialog();
 }
 i++;
 //if(i%200)LED0=!LED0;
 }}
 int main(void)
 {
 //u32 a1;
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
 SystemInit();
 delay_Init();//初始化延时函数 
 usart1_init(115200);//串口1初始化 
 LED_Init();//初始化LED
 LCD_Init();//LCD初始化 
 TIM1_PWM_Init();//定时器1初始化
 KEY_Initxx();//初始化按键
 EXTI_Initxx();//初始化按键中断
 SPI_GPIOInit();//SPI模式0
 tp_dev.init(); //触摸屏阻塞
 printf(“OV7670初始化开启”);
 int ret=OV7670_Init();
 if(ret){
 LCD_ShowString(30,130,240,16,16,“OV7670 ERROR!!”);
 }
 POINT_COLOR=RED;//设置字体为红色
 //if(tp_dev.touchtype!=0XFF)LCD_ShowString(30,130,200,16,16,“Press KEY0 to Adjust”);//电阻屏才显示 
 /*
 if(tp_dev.touchtype!=0XFF)LCD_ShowString(30,130,200,16,16,“Press KEY0 to Adjust”);//电阻屏才显示
 //delay_ms(500);
 Load_Drow_Dialog(); //清屏 */
 /*while()//初始化OV7670
 {
 LCD_ShowString(30,130,240,16,16,“OV7670 ERROR!!”);
 //LED0=0;
 delay_ms(200);
 LCD_Fill(30,130,239,170,WHITE);
 //LED0=1;
 delay_ms(200);
}
LCD_ShowString(40,150,200,20,20,"OV7670 OK!!!!!!"); 
delay_ms(300);	//延时一

//OV7670_Window_Set(12,176,240,320);//OV7670设置输出窗口*/
DCMI_Initxx();	//DCMI初始化
DCMI_DMA_Init();//初始化DMA
DCMI_Start(); 	//开启cam
//ov7670_test();

while(1)
{	
	//LCD_ShowString(30,60,210,20,20,"INIT SUCCESS!!!!");	
	//a1=DCMI_ReadData();
	printf("0x\r\n");
	
	LED1(0);
	
	delay_ms(300);
	LED1(1);
	delay_ms(300);
}