• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

ov7670摄像头颜色异常

TDA2030 2017-09-23 浏览量:2113

用STM32F4的DCMI+DMA传输OV7670 QVGA输出的数据到屏幕,寄存器改来改去始终颜色不对,求教各位大神

效果图在代码后面


//初始化寄存器序列及其对应的值
const u8 ov7670_init_reg_tbl[][2]= 
{   
	{0x3a, 0x04},
	{0x40, 0xd0}, 
	{0x12, 0x14}, //COM7 
	
	//输出窗口设置
	{0x32, 0x80},//HREF control	bit[2:0] HREF start 3 LSB	 bit[5:3] HSTOP HREF end 3LSB 
	{0x17, 0x16},//HSTART start high 8-bit MSB
	{0x18, 0x04},//HSTOP end high 8-bit
	{0x19, 0x02},//VSTART start high 8-bit MSB 
	{0x1a, 0x7A},//VSTOP end high 8-bit	
	{0x03, 0x05},//帧竖直方向控制VRFE
	
	{0x0c, 0x0C},  
	{0x3e, 0x00},//
	{0x42, 0x00},//0X08:彩条测试
	{0x70, 0x3A},//彩条测试
	{0x71, 0x35},//0X85:彩条测试
	{0x72, 0x11},
	{0x73, 0x00},
	
	{0xa2, 0x02},
	{0x6b, 0x4a},//PLL 重要参数 0x0a:不倍频,0x4a:4倍频	
	{0x11, 0x83},//0x01:不分频
	{0x7a, 0x20},
	{0x7b, 0x1c},  
	{0x7c, 0x28}, 
	
	{0x7d, 0x3c},  
	{0x7e, 0x55},  
	{0x7f, 0x68},  
	{0x80, 0x76},  
	{0x81, 0x80}, 
	
	{0x82, 0x88},  
	{0x83, 0x8f},  
	{0x84, 0x96},  
	{0x85, 0xa3},  
	{0x86, 0xaf},  
	
	{0x87, 0xc4},  
	{0x88, 0xd7},  
	{0x89, 0xe8}, 
	{0x13, 0xe0},  
	{0x00, 0x00},//AGC  
	
	{0x10, 0x00}, 
	{0x0d, 0x00},//全窗口, 位[5:4]: 01 半窗口,10 1/4窗口,11 1/4窗口 
	{0x14, 0x28},//0x38, limit the max gain 
	{0xa5, 0x05}, 
	{0xab, 0x07},
	
	{0x24, 0x75}, 
	{0x25, 0x63}, 
	{0x26, 0xA5}, 
	{0x9f, 0x78}, 
	{0xa0, 0x68}, 
	
	{0xa1, 0x03},//0x0b, 
	{0xa6, 0xdf},//0xd8, 
	{0xa7, 0xdf},//0xd8, 
	{0xa8, 0xf0}, 
	{0xa9, 0x90}, 
	
	{0xaa, 0x94}, 
	{0x13, 0xe5}, 
	{0x0e, 0x61}, 
	{0x0f, 0x4b}, 
	{0x16, 0x02}, 
	
	{0x1e, 0x27},//0x07,//图像输出镜像控制.0x07
	{0x21, 0x02}, 
	{0x22, 0x91}, 
	{0x29, 0x07}, 
	{0x33, 0x0b}, 
	
	{0x35, 0x0b}, 
	{0x37, 0x1d}, 
	{0x38, 0x71}, 
	{0x39, 0x2a}, 
	{0x3c, 0x78}, 
	
	{0x4d, 0x40}, 
	{0x4e, 0x20}, 
	{0x69, 0x55},//0X55	
	{0x74, 0x19}, 
	{0x8d, 0x4f}, 
	
	{0x8e, 0x00}, 
	{0x8f, 0x00}, 
	{0x90, 0x00}, 
	{0x91, 0x00}, 
	{0x92, 0x00},//0x19,//0x66 
	
	{0x96, 0x00}, 
	{0x9a, 0x80}, 
	{0xb0, 0x84}, 
	{0xb1, 0x0c}, 
	{0xb2, 0x0e}, 
	
	{0xb3, 0x82}, 
	{0xb8, 0x0a}, 
	{0x43, 0x14}, 
	{0x44, 0xf0}, 
	{0x45, 0x34}, 
	
	{0x46, 0x58}, 
	{0x47, 0x28}, 
	{0x48, 0x3a}, 
	{0x59, 0x88}, 
	{0x5a, 0x88}, 
	
	{0x5b, 0x44}, 
	{0x5c, 0x67}, 
	{0x5d, 0x49}, 
	{0x5e, 0x0e}, 
	{0x64, 0x04}, 
	{0x65, 0x20}, 
	
	{0x66, 0x05}, 
	{0x94, 0x04}, 
	{0x95, 0x08}, 
	{0x6c, 0x0a}, 
	{0x6d, 0x55}, 
	
	{0x4f, 0x80},
	{0x50, 0x80},
	{0x51, 0x00},
	{0x52, 0x22},
	{0x53, 0x5e},
	{0x54, 0x80},

	{0x09, 0x03},//驱动能力最大
	
	{0x6e, 0x11},//
	{0x6f, 0x9f},//0x9e for advance AWB 
	
	{0x6a, 0x40}, 
	{0x01, 0x40}, 
	{0x02, 0x40}, 
	{0x13, 0xe7}, 
	{0x15, 0x00}, //重要参数(改)HSYNC\VSYNC\HREF电平控制
	
	{0x55, 0x0a},//亮度
	{0x56, 0x4F},//对比度 0x40
	{0x58, 0x9e},
	{0x41, 0x08},
	{0x3f, 0x00},//边缘增强调整
	{0x75, 0x05},
	{0x76, 0xe1},
	{0x4c, 0x00},//噪声抑制强度 
	{0x77, 0x01},
	{0x3d, 0xc2},//0xc0, 
	
	{0x4b, 0x09}, 
	{0xc9, 0x60}, 
	{0x41, 0x38}, 
	{0x34, 0x11}, 
	{0x3b, 0x02},//0x00,//0x02, 
	{0xa4, 0x89},//0x88, 
	{0x96, 0x00}, 
	{0x97, 0x30}, 
	{0x98, 0x20}, 
	{0x99, 0x30}, 
	{0x9a, 0x84}, 
	{0x9b, 0x29}, 
	{0x9c, 0x03}, 
	{0x9d, 0x4c}, 
	{0x9e, 0x3f}, 
	{0x78, 0x04},         
	{0x79, 0x01}, 
	{0xc8, 0xf0}, 
	{0x79, 0x0f}, 
	{0xc8, 0x00}, 
	{0x79, 0x10}, 
	{0xc8, 0x7e}, 
	{0x79, 0x0a}, 
	{0xc8, 0x80}, 
	{0x79, 0x0b}, 
	{0xc8, 0x01}, 
	{0x79, 0x0c}, 
	{0xc8, 0x0f}, 
	{0x79, 0x0d}, 
	{0xc8, 0x20}, 
	{0x79, 0x09}, 
	{0xc8, 0x80}, 
	{0x79, 0x02}, 
	{0xc8, 0xc0}, 
	{0x79, 0x03}, 
	{0xc8, 0x40}, 
	{0x79, 0x05}, 
	{0xc8, 0x30}, 
	{0x79, 0x26}, 
	{0x09, 0x02}, 
	{0x3b, 0x42},//0x82,//0xc0,//0xc2,        //night mode 
//	

		
///////////////////////////////////////////////////////////////////////
	
}; 
//DCMI中断服务函数
void DCMI_IRQHandler(void)
{  
	if(DCMI->MISR&0X01)//捕获到一帧图像
	{
		//jpeg_data_process();//jpeg数据处理
		DCMI->ICR|=1<<0;	//清除帧中断
		LED1=!LED1;
		ov_frame++;  
	}										 
} 
//DCMI DMA配置
//mem0addr:存储器地址0  将要存储摄像头数据的内存地址(也可以是外设地址)
//mem1addr:存储器地址1  当只使用mem0addr的时候,该值必须为0
//memsize:存储器长度    0~65535
//memblen:存储器位宽    0,8位,1,16位,2,32位
//meminc:存储器增长方式,0,不增长;1,增长
void DCMI_DMA_Init(u32 mem0addr,u32 mem1addr,u16 memsize,u8 memblen,u8 meminc)
{ 
	RCC->AHB1ENR|=1<<22;		//DMA2时钟使能 
 	while(DMA2_Stream1->CR&0X01);//等待DMA2_Stream1可配置 
	DMA2->LIFCR|=0X3D<<6*1;		//清空通道1上所有中断标志
	//DMA2_Stream1->FCR=0X00000021;//设置为默认值	
	DMA2_Stream1->FCR=0X0000000C;//设置为默认值	
	
	DMA2_Stream1->PAR=(u32)&DCMI->DR;//外设地址为:DCMI->DR
	DMA2_Stream1->M0AR=mem0addr;	//mem0addr作为目标地址0
	DMA2_Stream1->M1AR=mem1addr;	//mem1addr作为目标地址1
	DMA2_Stream1->NDTR=memsize;		//传输长度为memsize
	DMA2_Stream1->CR=0;				//先全部复位CR寄存器值
	DMA2_Stream1->CR|=0<<6;			//外设到存储器模式
	DMA2_Stream1->CR|=1<<8;			//循环模式
	DMA2_Stream1->CR|=0<<9;			//外设非增量模式
	DMA2_Stream1->CR|=meminc<<10;	//存储器增量模式
	DMA2_Stream1->CR|=2<<11;		//外设数据长度:32位
	DMA2_Stream1->CR|=memblen<<13;	//存储器位宽,8/16/32bit
	DMA2_Stream1->CR|=2<<16;	//高优先级
	DMA2_Stream1->CR|=0<<21;	//外设突发单次传输
	DMA2_Stream1->CR|=0<<23;	//存储器突发单次传输
	DMA2_Stream1->CR|=1<<25;	//通道1 DCMI通道
	if(mem1addr)//双缓冲的时候,才需要开启
	{
		DMA2_Stream1->CR|=1<<18;				//双缓冲模式
		DMA2_Stream1->CR|=1<<4;					//开启传输完成中断
		MY_NVIC_Init(0,0,DMA2_Stream1_IRQn,2);	//抢占1,子优先级3,组2  
	}
}   

//DCMI初始化
void DCMI_Init(void)
{
	//设置IO
	RCC->AHB1ENR|=1<<0;		//使能外设PORTA时钟
	RCC->AHB1ENR|=1<<1;		//使能外设PORTB时钟
 	RCC->AHB1ENR|=1<<2;		//使能外设PORTC时钟
  	RCC->AHB1ENR|=1<<4;		//使能外设PORTE时钟
	RCC->AHB2ENR|=1<<0;		//能DCMI时钟
	
	GPIO_Set(GPIOA,PIN4|PIN6,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);	//PA4/6   复用功能输出
	GPIO_Set(GPIOB,PIN6|PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);	//PB6/7   复用功能输出
	GPIO_Set(GPIOC,PIN6|PIN7|PIN8|PIN9|PIN11,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//PC6/7/8/9/11 复用功能输出
	GPIO_Set(GPIOE,PIN5|PIN6,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);	//PE5/6  复用功能输出 
	
	GPIO_AF_Set(GPIOA,4,13);	//PA4,AF13  DCMI_HSYNC
	GPIO_AF_Set(GPIOA,6,13);	//PA6,AF13  DCMI_PCLK  
	GPIO_AF_Set(GPIOB,7,13);	//PB7,AF13  DCMI_VSYNC 
 	GPIO_AF_Set(GPIOC,6,13);	//PC6,AF13  DCMI_D0
 	GPIO_AF_Set(GPIOC,7,13);	//PC7,AF13  DCMI_D1
 	GPIO_AF_Set(GPIOC,8,13);	//PC8,AF13  DCMI_D2
 	GPIO_AF_Set(GPIOC,9,13);	//PC9,AF13  DCMI_D3
 	GPIO_AF_Set(GPIOC,11,13);	//PC11,AF13 DCMI_D4 
	GPIO_AF_Set(GPIOB,6,13);	//PB6,AF13  DCMI_D5
	GPIO_AF_Set(GPIOE,5,13);	//PE5,AF13  DCMI_D6
	GPIO_AF_Set(GPIOE,6,13);	//PE6,AF13  DCMI_D7
	//清除原来的设置
	DCMI->CR=0x0;
	DCMI->IER=0x0;
	DCMI->ICR=0x1F;
	DCMI->ESCR=0x0;
	DCMI->ESUR=0x0;
	DCMI->CWSTRTR=0x0;
	DCMI->CWSIZER=0x0;
	
	DCMI->CR|=0<<1;		//连续模式
	DCMI->CR|=0<<2;		//全帧捕获
	DCMI->CR|=0<<4;		//硬件同步HSYNC,VSYNC
	DCMI->CR|=0<<5;		//PCLK 下降沿有效
	DCMI->CR|=0<<6;		//HSYNC 低电平有效
	DCMI->CR|=1<<7;		//VSYNC 低电平有效
	DCMI->CR|=0<<8;		//捕获所有的帧
	DCMI->CR|=0<<10; 	//8位数据格式
	DCMI->IER|=1<<0; 	//开启帧中断
	DCMI->CR|=1<<14; 	//DCMI使能
	MY_NVIC_Init(0,0,DCMI_IRQn,2);	//抢占1,子优先级2,组2 
} 
//DCMI,启动传输
void DCMI_Start(void)
{
	LCD_Scan_Dir(U2D_L2R);		   //从上到下,从左到右	
  	LCD_SetCursor(0,0);  
	
	LCD_WriteRAM_Prepare();		//开始写入GRAM
	DMA2_Stream1->CR|=1<<0;		//开启DMA2,Stream1 
	DCMI->CR|=1<<0; 			//DCMI捕获使能  
}
//DCMI,关闭传输
void DCMI_Stop(void)
{
	DCMI->CR&=~(1<<0); 			//DCMI捕获关闭   
	while(DCMI->CR&0X01);		//等待传输结束 
	DMA2_Stream1->CR&=~(1<<0);	//关闭DMA2,Stream1  	
} 
主函数主要部分:
while(OV7670_Init())//初始化OV2640
{
Show_Str(30,190,240,16,"OV7670 错误!",16,0);
delay_ms(200);
   LCD_Fill(30,190,239,206,WHITE);
delay_ms(200);
LED1=!LED1;
}
  Show_Str(30,190,200,16,"OV7670 正常",16,0);
delay_ms(500);
​OV7670_Window_Set(12,176,240,320); //设置窗口
LCD_Set_Window(0,0,240,320);
DCMI_Init(); //DCMI配置
DCMI_DMA_Init((u32)&LCD->LCD_RAM,0,1,1,0);//DCMI DMA配置
DCMI_Start(); //启动传输
  while(1)
{
}​

P70923-134813.jpgP70923-134801.jpg

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
TDA2030 回复了 汉云:屏幕显示正常 回复

其他答案 数量:2
  • 您可以嘗試把您的杜邦線用短一點的連接

    通常色彩跟訊號異常/強弱有關

    你這份Code應該沒什麼問題,範例Code才對

    所以從電路上下手,應是主要問題


    • 发布于2017-09-26
    • 举报
    • 评论 0
    • 0
    • 0

  • 感觉硬件上的问题的可能性要大一些,楼主还是做一块板子吧。这样做不好确定问题的。
    • 发布于2018-01-07
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :请参考:39036092型号 回复

相关问题

问题达人换一批

ov7670摄像头颜色异常