OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9546|回复: 39

实在没办法,要上来求教关于f407控制ov2640的问题

[复制链接]

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
发表于 2014-9-30 12:56:25 | 显示全部楼层 |阅读模式
5金钱
我根据厂家提供的例程修改,调试了10多天的程序,对比过很多例程,翻阅了不少M4的资料,也问过一些人,但还是解决不了问题,串口始终没有输出图像,真的是无奈,所以上来希望能够得到大家的帮助。
我先把情况交代清楚,串口可以打印数据,如图

,可以进入外部中断,而DCMI的中断有时可以进去,有时又不能进去,DCMI和DMA都打开了,但是始终是没有图像,例程是厂家提供的,他说程序在他们的f407开发板上可以用,所以配置应该没问题。

下面贴关键代码:
int main(void)
{
OV2640_IDTypeDef OV2640ID;
RCC_ClocksTypeDef SYS_Clocks;
uint32_t i=0;
if (SysTick_Config(SystemCoreClock / 1000))
  {     /* Capture error */ 
   while (1);
  }
RCC_GetClocksFreq(&SYS_Clocks);
USART_Configuration();
printf("\r\nSYSCLK:%dM\r\n",SYS_Clocks.SYSCLK_Frequency/1000000);
printf("HCLK:%dM\r\n",SYS_Clocks.HCLK_Frequency/1000000);
printf("PCLK1:%dM\r\n",SYS_Clocks.PCLK1_Frequency/1000000);
printf("PCLK2:%dM\r\n",SYS_Clocks.PCLK2_Frequency/1000000);
OV2640_Init();
if(DCMI_OV2640_ReadID(&OV2640ID)==0)
{
if(OV2640ID.Manufacturer_ID1==0x7f && OV2640ID.Manufacturer_ID2==0xa2 
&& OV2640ID.Version==0x26 && OV2640ID.PID==0x42){
  printf("OV2640 ID:0x%x 0x%x 0x%x 0x%x\r\n",
  OV2640ID.Manufacturer_ID1, OV2640ID.Manufacturer_ID2, OV2640ID.PID, OV2640ID.Version);
}
else{
  printf("OV2640 ID is Error!\r\n");
}
}
OV2640_JPEGConfig(JPEG_320x240);
OV2640_BrightnessConfig(0x20);
OV2640_AutoExposure(2);
  EXTI_Config();
Delay(10);
printf("\r\n Please press the button to take photos \r\n");
while (1)
{
if(jpg_flag&&key_flag)
{
DCMI_Cmd(DISABLE); 
DCMI_CaptureCmd(DISABLE);
DMA_Cmd(DMA2_Stream1, DISABLE);
if( (JpegBuffer[0]==0xFF)&&(JpegBuffer[1]==0xD8) )
{
 //USART3_Transmit(0xff);
while ( !( (JpegBuffer[JpegBufferLen - JpegDataCnt-2]==0xFF) && (JpegBuffer[JpegBufferLen-JpegDataCnt-1]==0xD9) ) ) //
{
JpegDataCnt++;
}
for(i = 0; i < (JpegBufferLen - JpegDataCnt); i++) //sizeof(JpegBuffer)
{
USART3_Transmit(JpegBuffer);

}
JpegDataCnt = 0;
jpg_flag = 0;
key_flag = 0;
}
  }
}


void OV2640_DCMI_Config(void)
{
  DCMI_InitTypeDef DCMI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
 

  /* Enable DCMI GPIOs clocks */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | 
                         RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE,ENABLE); 

  /* Enable DCMI clock */
  RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE);

  /* Connect DCMI pins to AF13 ************************************************/
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_DCMI);      //PCLK

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_DCMI);      //DCMI_HSYNC
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_DCMI);      //DCMI_DO
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_DCMI);      //DCMI_D1
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_DCMI);      //DCMI_D2
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_DCMI);      //DCMI_D3
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource4, GPIO_AF_DCMI);      //DCMI_D4

  GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_DCMI);      //DCMI_VSYNC
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource5, GPIO_AF_DCMI);      //DCMI_D6
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_DCMI);      //DCMI_D7
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_DCMI);      //DCMI_D5
  
  /* DCMI GPIO configuration **************************************************/
  /* D0..D4(PH9/10/11/12/14), HSYNC(PH8) */
  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_UP ;  
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* D5..D7(PI4/6/7), VSYNC(PI5) */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_5;
  GPIO_Init(GPIOE, &GPIO_InitStructure);

  /* PCLK(PA6) */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
 
  /* DCMI configuration *******************************************************/ 
  DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_SnapShot;//DCMI_CaptureMode_Continuous
  DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware;//DCMI_SynchroMode_Hardware
  DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Rising;//DCMI_PCKPolarity_Falling
  DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_Low; //DCMI_VSPolarity_High
  DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_Low; //DCMI_HSPolarity_High
  DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame;//DCMI_CaptureRate_All_Frame
  DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b; //?
  
  DCMI_Init(&DCMI_InitStructure);

DCMI_JPEGCmd(ENABLE);
      
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
NVIC_Init(&NVIC_InitStructure); 

  /* DCMI Interrupts config ***************************************************/
// DCMI_ITConfig(DCMI_IT_VSYNC, ENABLE);
// DCMI_ITConfig(DCMI_IT_LINE, ENABLE);
     DCMI_ITConfig(DCMI_IT_FRAME, ENABLE);
//   DCMI_ITConfig(DCMI_IT_ERR, ENABLE);
}


void MCO1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_ClockSecuritySystemCmd(ENABLE);

/* Enable GPIOs clocks */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_MCO);

/* Configure MCO (PA8) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  //UP
GPIO_Init(GPIOA, &GPIO_InitStructure);

RCC_MCO1Config(RCC_MCO1Source_HSI, RCC_MCO1Div_1);// 16MHZ
}


void OV2640_DMA_Init(void)
{
  DMA_InitTypeDef  DMA_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

/* Configures the DMA2 to transfer Data from DCMI to the LCD ****************/
  /* Enable DMA2 clock */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);  
  
  /* DMA2 Stream1 Configuration */  
  DMA_DeInit(DMA2_Stream1);

  DMA_InitStructure.DMA_Channel = DMA_Channel_1;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = DCMI_DR_ADDRESS;
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)JpegBuffer;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = 1024*8;  
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//?ò??????????×é???ù????????×???
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//DCMI????????????32????
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//??×é????????????8????
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  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_Init(DMA2_Stream1, &DMA_InitStructure); 

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  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 OV2640_Init(void)
{
SCCB_GPIO_Config();
MCO1_Init();
OV2640_DCMI_Config();
OV2640_DMA_Init();
OV2640_Reset();
  Delay_ms(0xfff);
}


void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line15) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line15);
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==1)
{
return;
}
 key_flag = 1;
DCMI_Cmd(ENABLE);
DCMI_CaptureCmd(ENABLE);
DMA_Cmd(DMA2_Stream1, ENABLE);
}
}

void DCMI_IRQHandler(void)
{     
if (DCMI_GetITStatus(DCMI_IT_FRAME) != RESET) 
{
DCMI_ClearITPendingBit(DCMI_IT_FRAME);
jpg_flag = 1;
}
}





STM32.rar

3.62 MB, 下载次数: 261

最佳答案

查看完整内容[请看2#楼]

给你个参考: DCMI配置: [mw_shl_code=c,true]#include "sys.h" #include "dcmi.h" #include "lcd.h" #include "led.h" #include "ov2640.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK STM32F407开发板 //DCMI 驱动代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //创建日期:2 ...
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-30 12:56:26 | 显示全部楼层
给你个参考:
DCMI配置:
[mw_shl_code=c,true]#include "sys.h" #include "dcmi.h" #include "lcd.h" #include "led.h" #include "ov2640.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK STM32F407开发板 //DCMI 驱动代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //创建日期:2014/5/14 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2014-2024 //All rights reserved ////////////////////////////////////////////////////////////////////////////////// u8 ov_frame=0; //帧率 extern void jpeg_data_process(void); //JPEG数据处理函数 //DCMI中断服务函数 void DCMI_IRQHandler(void) { if(DCMI->MISR&0X01)//捕获到一帧图像 { jpeg_data_process(); //jpeg数据处理 DCMI->ICR|=1<<0; //清除帧中断 LED1=!LED1; ov_frame++; } } //DCMI DMA配置 //memaddr:存储器地址 将要存储摄像头数据的内存地址(也可以是外设地址) //memsize:存储器长度 0~65535 //memblen:存储器位宽 0,8位,1,16位,2,32位 //meminc:存储器增长方式,0,不增长;1,增长 void DCMI_DMA_Init(u32 memaddr,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=0X0000021;//设置为默认值 DMA2_Stream1->AR=(u32)&DCMI->DR;//外设地址为CMI->DR DMA2_Stream1->M0AR=memaddr; //memaddr作为目标地址 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通道 } //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|=1<<5; //PCLK 上升沿有效 DCMI->CR|=0<<6; //HSYNC 低电平有效 DCMI->CR|=0<<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_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 } //////////////////////////////////////////////////////////////////////////////// //以下两个函数,供usmart调用,用于调试代码 //DCMI设置显示窗口 //sx,sy;LCD的起始坐标 //width,heightCD显示范围. void DCMI_Set_Window(u16 sx,u16 sy,u16 width,u16 height) { DCMI_Stop(); LCD_Clear(WHITE); LCD_Set_Window(sx,sy,width,height); OV2640_OutSize_Set(width,height); LCD_SetCursor(0,0); LCD_WriteRAM_Prepare(); //开始写入GRAM DMA2_Stream1->CR|=1<<0; //开启DMA2,Stream1 DCMI->CR|=1<<0; //DCMI捕获使能 } //通过usmart调试,辅助测试用. //pclk/hsync/vsync:三个信号的有限电平设置 void DCMI_CR_Set(u8 pclk,u8 hsync,u8 vsync) { DCMI->CR=0; DCMI->CR|=pclk<<5; //PCLK 有效边沿设置 DCMI->CR|=hsync<<6; //HSYNC 有效电平设置 DCMI->CR|=vsync<<7; //VSYNC 有效电平设置 DCMI->CR|=1<<14; //DCMI使能 DCMI->CR|=1<<0; //DCMI捕获使能 } [/mw_shl_code]
OV2640配置:
[mw_shl_code=c,true]#include "sys.h" #include "ov2640.h" #include "ov2640cfg.h" #include "timer.h" #include "delay.h" #include "usart.h" #include "sccb.h" #include "exti.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK STM32F407开发板 //OV2640 驱动代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //创建日期:2014/5/14 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2014-2024 //All rights reserved ////////////////////////////////////////////////////////////////////////////////// //初始化OV2640 //配置完以后,默认输出是1600*1200尺寸的图片!! //返回值:0,成功 // 其他,错误代码 u8 OV2640_Init(void) { u16 i=0; u16 reg; //设置IO RCC->AHB1ENR|=1<<6; //使能外设PORTG时钟 GPIO_Set(GPIOG,PIN9|PIN15,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU); //PG9,15推挽输出 OV2640_PWDN=0; //POWER ON 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_uxga_init_reg_tbl)/2;i++) { SCCB_WR_Reg(ov2640_uxga_init_reg_tbl[0],ov2640_uxga_init_reg_tbl[1]); } return 0x00; //ok } //OV2640切换为JPEG模式 void OV2640_JPEG_Mode(void) { u16 i=0; //设置:YUV422格式 for(i=0;i<(sizeof(ov2640_yuv422_reg_tbl)/2);i++) { SCCB_WR_Reg(ov2640_yuv422_reg_tbl[0],ov2640_yuv422_reg_tbl[1]); } //设置:输出JPEG数据 for(i=0;i<(sizeof(ov2640_jpeg_reg_tbl)/2);i++) { SCCB_WR_Reg(ov2640_jpeg_reg_tbl[0],ov2640_jpeg_reg_tbl[1]); } } //OV2640切换为RGB565模式 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[0],ov2640_rgb565_reg_tbl[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,0X00);//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); } //亮度设置 //00X00)-2 //10X10)-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; } //该函数设置图像尺寸大小,也就是所选格式的输出分辨率 //UXGA:1600*1200,SVGA:800*600,CIF:352*288 //width,height:图像宽度和图像高度 //返回值: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; } [/mw_shl_code]

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-30 12:56:26 | 显示全部楼层
CFG.H内容:
[mw_shl_code=c,true]#ifndef _OV2640CFG_H #define _OV2640CFG_H #include "ov2640.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK STM32F407开发板 //OV2640 驱动代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //创建日期:2014/5/14 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2014-2024 //All rights reserved ////////////////////////////////////////////////////////////////////////////////// //OV2640 UXGA初始化寄存器序列表 //此模式下帧率为15帧 //UXGA(1600*1200) const u8 ov2640_uxga_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_yuv422_reg_tbl[][2]= { 0xFF, 0x00, 0xDA, 0x10, 0xD7, 0x03, 0xDF, 0x00, 0x33, 0x80, 0x3C, 0x40, 0xe1, 0x77, 0x00, 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, }; #endif [/mw_shl_code]
JPEG和RGB565测试代码:
[mw_shl_code=c,true]//处理JPEG数据 //当采集完一帧JPEG数据后,调用此函数,切换JPEG BUF.开始下一帧采集. void jpeg_data_process(void) { if(ov2640_mode)//只有在JPEG格式下,才需要做处理. { if(jpeg_data_ok==0) //jpeg数据还未采集完? { DMA2_Stream1->CR&=~(1<<0); //停止当前传输 while(DMA2_Stream1->CR&0X01); //等待DMA2_Stream1可配置 jpeg_data_len=jpeg_buf_size-DMA2_Stream1->NDTR;//得到此次数据传输的长度 jpeg_data_ok=1; //标记JPEG数据采集完按成,等待其他函数处理 } if(jpeg_data_ok==2) //上一次的jpeg数据已经被处理了 { DMA2_Stream1->NDTR=jpeg_buf_size; //传输长度为jpeg_buf_size*4字节 DMA2_Stream1->CR|=1<<0; //重新传输 jpeg_data_ok=0; //标记数据未采集 } } } //JPEG测试 //JPEG数据,通过串口2发送给电脑. void jpeg_test(void) { u32 i; u8 *p; u8 key; u8 effect=0,saturation=2,contrast=2; u8 size=2; //默认是QVGA 320*240尺寸 u8 msgbuf[15]; //消息缓存区 LCD_Clear(WHITE); POINT_COLOR=RED; LCD_ShowString(30,50,200,16,16,"ALIENTEK STM32F4"); LCD_ShowString(30,70,200,16,16,"OV2640 JPEG Mode"); LCD_ShowString(30,100,200,16,16,"KEY0:Contrast"); //对比度 LCD_ShowString(30,120,200,16,16,"KEY1:Saturation"); //色彩饱和度 LCD_ShowString(30,140,200,16,16,"KEY2:Effects"); //特效 LCD_ShowString(30,160,200,16,16,"KEY_UP:Size"); //分辨率设置 sprintf((char*)msgbuf,"JPEG Size:%s",JPEG_SIZE_TBL[size]); LCD_ShowString(30,180,200,16,16,msgbuf); //显示当前JPEG分辨率 OV2640_JPEG_Mode(); //JPEG模式 DCMI_Init(); //DCMI配置 DCMI_DMA_Init((u32)&jpeg_buf,jpeg_buf_size,2,1);//DCMI DMA配置 OV2640_OutSize_Set(jpeg_img_size_tbl[size][0],jpeg_img_size_tbl[size][1]);//设置输出尺寸 DCMI_Start(); //启动传输 while(1) { if(jpeg_data_ok==1) //已经采集完一帧图像了 { p=(u8*)jpeg_buf; LCD_ShowString(30,210,210,16,16,"Sending JPEG data..."); //提示正在传输数据 for(i=0;i<jpeg_data_len*4;i++) //dma传输1次等于4字节,所以乘以4. { while((USART2->SR&0X40)==0); //循环发送,直到发送完毕 USART2->DR=p; key=KEY_Scan(0); if(key)break; } if(key) //有按键按下,需要处理 { LCD_ShowString(30,210,210,16,16,"Quit Sending data ");//提示退出数据传输 switch(key) { case KEY0_PRES: //对比度设置 contrast++; if(contrast>4)contrast=0; OV2640_Contrast(contrast); sprintf((char*)msgbuf,"Contrast:%d",(signed char)contrast-2); break; case KEY1_PRES: //饱和度Saturation saturation++; if(saturation>4)saturation=0; OV2640_Color_Saturation(saturation); sprintf((char*)msgbuf,"Saturation:%d",(signed char)saturation-2); break; case KEY2_PRES: //特效设置 effect++; if(effect>6)effect=0; OV2640_Special_Effects(effect);//设置特效 sprintf((char*)msgbuf,"%s",EFFECTS_TBL[effect]); break; case WKUP_PRES: //JPEG输出尺寸设置 size++; if(size>12)size=0; OV2640_OutSize_Set(jpeg_img_size_tbl[size][0],jpeg_img_size_tbl[size][1]);//设置输出尺寸 sprintf((char*)msgbuf,"JPEG Size:%s",JPEG_SIZE_TBL[size]); break; } LCD_Fill(30,180,239,190+16,WHITE); LCD_ShowString(30,180,210,16,16,msgbuf);//显示提示内容 delay_ms(800); }else LCD_ShowString(30,210,210,16,16,"Send data complete!!");//提示传输结束设置 jpeg_data_ok=2; //标记jpeg数据处理完了,可以让DMA去采集下一帧了. } } } //RGB565测试 //RGB数据直接显示在LCD上面 void rgb565_test(void) { u8 key; u8 effect=0,saturation=2,contrast=2; u8 scale=1; //默认是全尺寸缩放 u8 msgbuf[15]; //消息缓存区 LCD_Clear(WHITE); POINT_COLOR=RED; LCD_ShowString(30,50,200,16,16,"ALIENTEK STM32F4"); LCD_ShowString(30,70,200,16,16,"OV2640 RGB565 Mode"); LCD_ShowString(30,100,200,16,16,"KEY0:Contrast"); //对比度 LCD_ShowString(30,130,200,16,16,"KEY1:Saturation"); //色彩饱和度 LCD_ShowString(30,150,200,16,16,"KEY2:Effects"); //特效 LCD_ShowString(30,170,200,16,16,"KEY_UP:FullSize/Scale"); //1:1尺寸(显示真实尺寸)/全尺寸缩放 OV2640_RGB565_Mode(); //RGB565模式 DCMI_Init(); //DCMI配置 DCMI_DMA_Init((u32)&LCD->LCD_RAM,1,1,0);//DCMI DMA配置 OV2640_OutSize_Set(lcddev.width,lcddev.height); DCMI_Start(); //启动传输 while(1) { key=KEY_Scan(0); if(key) { DCMI_Stop(); //停止显示 switch(key) { case KEY0_PRES: //对比度设置 contrast++; if(contrast>4)contrast=0; OV2640_Contrast(contrast); sprintf((char*)msgbuf,"Contrast:%d",(signed char)contrast-2); break; case KEY1_PRES: //饱和度Saturation saturation++; if(saturation>4)saturation=0; OV2640_Color_Saturation(saturation); sprintf((char*)msgbuf,"Saturation:%d",(signed char)saturation-2); break; case KEY2_PRES: //特效设置 effect++; if(effect>6)effect=0; OV2640_Special_Effects(effect);//设置特效 sprintf((char*)msgbuf,"%s",EFFECTS_TBL[effect]); break; case WKUP_PRES: //1:1尺寸(显示真实尺寸)/缩放 scale=!scale; if(scale==0) { OV2640_ImageWin_Set((1600-lcddev.width)/2,(1200-lcddev.height)/2,lcddev.width,lcddev.height);//1:1真实尺寸 OV2640_OutSize_Set(lcddev.width,lcddev.height); sprintf((char*)msgbuf,"Full Size 1:1"); }else { OV2640_ImageWin_Set(0,0,1600,1200); //全尺寸缩放 OV2640_OutSize_Set(lcddev.width,lcddev.height); sprintf((char*)msgbuf,"Scale"); } break; } LCD_ShowString(30,50,210,16,16,msgbuf);//显示提示内容 delay_ms(800); DCMI_Start();//重新开始传输 } delay_ms(10); } } [/mw_shl_code]

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2014-9-30 19:01:39 | 显示全部楼层
继续求大神指教...
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-30 23:36:12 | 显示全部楼层
帮顶....
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2014-10-1 23:05:30 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥不是要推出ov2640的摄像头吗?还没写程序吗?
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-1 23:54:24 | 显示全部楼层
回复【4楼】ljjdglg520:
---------------------------------
写了,到时候你参考我们例程就是。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2014-10-2 11:23:55 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
那还得等1个月噢...原子哥现在指点一下嘛,竟然程序都已经写好了,我现在需求也不大,只要串口能出图像就行了,真的弄了好久没弄出来...
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2014-10-3 18:50:52 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
谢谢原子哥
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2014-10-13 10:51:39 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
原子哥,如果我要弄成视频,是不是要外扩flash?卖摄像头的厂家说要外扩才能做,因为407vet本身flash小(512K),但是2640如果输出320*240的JPEG格式图片,每张图片4-6K,要24帧的话也就100多K,感觉不用外扩也行吖。
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-13 23:49:00 | 显示全部楼层
回复【10楼】ljjdglg520:
---------------------------------
那你就存储一秒钟么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2014-10-14 11:16:48 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
我存完马上发走可以吗?用f407的串口1速度有42M,再通过WIFI模块的串口发数据,42M的速度应该能把100多k的数据在1秒内把数据发走,我这样想对吗?
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-14 23:17:35 | 显示全部楼层
回复【12楼】ljjdglg520:
---------------------------------
可以。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2014-10-22 15:03:21 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
原子哥,你的程序是出视频的吗?请问一下,连续模式的时候,前一张图片和后一张图片你是怎样处理的?我看到
void jpeg_data_process(void) 这个函数说是要切换jpeg buf,是要换数组装图片吗?能不能讲得详细一点,我现在就卡在这里。。。
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-22 23:36:18 | 显示全部楼层
回复【14楼】ljjdglg520:
---------------------------------
到时候看F4的教程吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2014-10-23 15:31:07 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
原子哥,我现在真的很急啊,我就想知道,出视频的时候,假如每秒24帧,每张图片是怎样处理的?就讲个思路就行了,谢谢啦
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-23 23:09:33 | 显示全部楼层
保存起来。
至于怎么保存,那就是你要去解决的问题了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

91

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2014-10-28
在线时间
14 小时
发表于 2014-10-28 19:57:18 | 显示全部楼层
回复【12楼】ljjdglg520:
---------------------------------
这个407 USART1可以达到42M 我怎么看都只有10.5 MBps 额,什么情况
我也想用OV2640拍视频传,看看速率貌似必须SDIO的wifi,因为我要传些应用数据,就不想用AV模拟图传,
看看你进展怎么样了,我以后想挂航拍
成功必然有成功的原因,
回复

使用道具 举报

5

主题

91

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2014-10-28
在线时间
14 小时
发表于 2014-10-28 20:01:09 | 显示全部楼层
407的SDIO要挂OV2640 那还可以同时接WIFI么
成功必然有成功的原因,
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2014-10-28 20:32:12 | 显示全部楼层
回复【18楼】simplelifeNick:
---------------------------------
关键是保存数据要用DMA双缓冲+乒乓模式,DMA要一直开着,数据传输还没弄,2640干嘛要挂在SDIO上?这个我不清楚,反正我是挂在DCMI的数据接口上
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

5

主题

91

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2014-10-28
在线时间
14 小时
发表于 2014-10-28 21:47:08 | 显示全部楼层
回复【20楼】ljjdglg520:
---------------------------------
引脚是我搞错了,还没有开始用,提前准备下,那你的USART1可以达到那么高波特率么?高速传输usart不行吧
成功必然有成功的原因,
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2014-10-28 21:53:59 | 显示全部楼层
回复【21楼】simplelifeNick:
---------------------------------
输出图像肯定不能用串口,太慢了,要用其他接口的WIFI模块,传输那块我还没做到呢。。。
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

5

主题

91

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2014-10-28
在线时间
14 小时
发表于 2014-10-28 23:58:12 | 显示全部楼层
回复【22楼】ljjdglg520:
---------------------------------
准备sdio的wifi,这个看原子还有网上说的  先找了个54mbps,不过不知道407行不行啊,不行准备单独在搞板子了
成功必然有成功的原因,
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2014-10-31 09:24:11 | 显示全部楼层
原子哥,DMA双缓冲乒乓模式的我搞定了,但是像下面这样输出图片,只有第一张图片是正常的,后面开始都是很模糊的,请问一下怎样怎样输出图片才正确?

if( Dma_FreeBuf_Ok ==1 )       
    {
       if(DMA_GetCurrentMemoryTarget(DMA2_Stream1) == 0)
{
for(i=0;i<jpeg_buf_size;i++)
{
USART_SendData(USART3,JpegBuffer1);
while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
USART_SendData(USART3,JpegBuffer1>>8);
while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
USART_SendData(USART3,JpegBuffer1>>16);
while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
USART_SendData(USART3,JpegBuffer1>>24);
while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
}
  }
else
{
for(i=0;i<jpeg_buf_size;i++)
{
USART_SendData(USART3,JpegBuffer2);
while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
USART_SendData(USART3,JpegBuffer2>>8);
while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
USART_SendData(USART3,JpegBuffer2>>16);
while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
USART_SendData(USART3,JpegBuffer2>>24);
while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET); 
}
}
Dma_FreeBuf_Ok=0;
}


void DMA2_Stream1_IRQHandler(void)
{
if(DMA_GetITStatus(DMA2_Stream1,DMA_IT_TCIF1) != RESET)   
{
DMA_ClearITPendingBit(DMA2_Stream1,DMA_IT_TCIF1);
Dma_FreeBuf_Ok = 1;
  }
}

成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2014-10-31 21:52:53 | 显示全部楼层
请大家帮帮忙,谢谢
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-5-22 13:37:18 | 显示全部楼层
回复【25楼】ljjdglg520:
---------------------------------
搞定了吗  搞定了 录个视频膜拜膜拜
合肥-文盲
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2015-5-22 16:00:01 | 显示全部楼层
回复【26楼】合肥-文盲:
---------------------------------
传输是没问题,但是不知道怎样解码,老师后来说不用做了,我就没管了。。
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-5-25 10:29:37 | 显示全部楼层
回复【27楼】ljjdglg520:
---------------------------------
我刚刚听我现在领导说200块钱搞定一套,50元买个AV接口的摄像头,30元买个2.4G无线发送模块,30元买个无线接收模块,50买个数据处理板卡,然后组装一下,电脑端软件找摄像头厂家要个免费的监控软件。。。。感觉好简单的样子啊    我有点被他打败了的感觉。。。。
合肥-文盲
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2015-5-27 16:34:10 | 显示全部楼层
回复【28楼】合肥-文盲:
---------------------------------
2.4G应该不行吧,就算像素调成渣渣画质也不行吧,硬要说成本,140左右就可以了,用的WIFI
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-5-28 08:37:40 | 显示全部楼层
回复【29楼】ljjdglg520:
---------------------------------
你去淘宝搜搜无线视频,立马就能搜到2.4G,据说画质很清晰,WIFI也能传模拟信号吗?WIFI不是和蓝牙一类吗?只能传数字信号吗?
合肥-文盲
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2015-5-28 08:42:21 | 显示全部楼层
回复【30楼】合肥-文盲:
---------------------------------
图像可以是数字量- -
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-5-28 13:03:23 | 显示全部楼层
回复【31楼】ljjdglg520:
---------------------------------
数字的成本太大    模拟的更稳定  更便宜  
合肥-文盲
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2015-5-28 19:45:17 | 显示全部楼层
回复【32楼】合肥-文盲:
---------------------------------
额,这个我不太懂噢
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-7-30
在线时间
1 小时
发表于 2015-7-30 12:34:47 | 显示全部楼层
回复【2楼】ljjdglg520:
---------------------------------
楼主,你好,我看了你的程序,貌似是PE4口没有进行IO口的初始化设置,我最近也在移植摄像头程序,我和你用的版本很相似,请问你现在能出图像了吗?能否发我一下你写好的程序?谢谢了959200256@qq.com
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2015-8-2 00:14:58 | 显示全部楼层
好久之前的了,程序不知放哪了,你找淘宝卖家,他会给你例程的,我当时用的程序也是改淘宝卖家给我的程序,我之前之所以不能输出图像是因为摄像头模块上晶振跟程序不搭,你写的程序设置的速度是跟摄像头模块上的晶振相关的,额,太久我都忘记了
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

9

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2015-8-27
在线时间
22 小时
发表于 2015-8-28 16:44:47 | 显示全部楼层
请问一下,寄存器0xe0的作用是什么?我看手册确实有点没看明白?在图像输出大小的设置函数中,为什么先将这个寄存器设置为默认值,最后又设置为0x00?
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2015-8-30 11:41:10 | 显示全部楼层
回复【36楼】wangyueming:
---------------------------------
额,我建议你先找个正确的数据手册研究一下吧,ov2640寄存器没有去到0xe0那么大
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

9

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2015-8-27
在线时间
22 小时
发表于 2015-8-31 20:51:21 | 显示全部楼层
回复【37楼】ljjdglg520:
---------------------------------
是有这个寄存器的,在bank1(0xff=0)中,你可以查一下,原子哥的程序中是先0xe0=0x04,然后设置图像大小,然后再0xe=0x00,这样配置我有点不明白怎么回事,你没遇到过吗?
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2015-9-1 10:58:40 | 显示全部楼层
回复【38楼】wangyueming:
---------------------------------
额,是我的错,我一拉到底看到0xff=1那个。
内个,原子哥的程序设置了很多东西,我的话只满足于够用,所以并不用写那么多寄存器。
对于你的问题,我的理解是,0XE0那个寄存器是设置拍照模式的,一开始设为RESERVED(0xe0=0x04)是为了防止如果被设为其他模式会影响下面的设置,等把输出位设置好后(所以把0xe0=0x04改为0xe0=0x08效果应该是一样的),最后才设置为CIF输出模式(0xe0=0x00)。这个我也不确定,你最好问下原子哥吧。我自己学习是绝对不会去研究这些初始化的,因为没必要,我是拿来就用,我如果要研究,也只会去研究怎样去改变相片的颜色,怎样让照片更清晰一些,或者怎样能让照片能够连续传输不卡帧(也就是拍视频)。
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

9

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2015-8-27
在线时间
22 小时
发表于 2015-9-1 15:44:09 | 显示全部楼层
回复【39楼】ljjdglg520:
---------------------------------
好的,多谢回答
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-15 22:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表