DCMI接口之OV2640摄像头

article/2025/9/20 15:32:05

一、OV2640简介

OV2640是OmniVision公司生产的一颗1/4寸的CMOS UXGA(1632 * 1232)图像传感器。该传感器体积小、工作电压低,提供单片UXGA摄像头和影像处理器的所有功能。通过SCCB 总线控制,可以输出整帧、子采样、缩放和取窗口等方式的各种分辨率8/10位影像数据。UXGA最高15帧/秒(SVGA可达30帧,CIF可达60帧)。用户可以完全控制图像质量、数据格式和传输方式。所有图像处理功能过程包括伽玛曲线、白平衡、对比度、色度等都可以通过SCCB接口编程。
特点

  • ①高灵敏度、低电压适合嵌入式应用。
  • ②标准的SCCB接口,兼容IIC接口。
  • ③支持RawRGB、RGB(RGB565/RGB555)、GRB422、YUV(422/420)和YCbCr(422)输出格式。
  • ④支持UXGA、SXGA、SVGA以及按比例缩小到从SXGA到40*30的任何尺寸 。
  • ⑤支持自动曝光控制、自动增益控制、自动白平衡、自动消除灯光条纹、自动黑电平校准等自动控制功能。同时支持色饱和度、色相、伽马、锐度等设置。
  • ⑥支持图像缩放和闪光灯。
  • ⑦支持图像压缩,即可输出JPEG图像数据。

二、OV2640时序

OV2640行输出时序
在这里插入图片描述
其中:PCLK最高为36MHz。图像数据在HREF为高的时候输出,当HREF变高后,每一个PCLK时钟,输出一个字节数据。比如我们采用UXGA时序,RGB565格式输出,每2个字节组成一个像素的颜色(低字节在前,高字节在后),这样每行输出总共有16002个PCLK周期,输出16002个字节。
OV2640帧输出时序
在这里插入图片描述
注意:OV2640支持RGB565或JPEG输出。RGB565输出时,时序如图所示。JPEG输出时,PCLK大大减少,且HREF不连续,数据流以0XFF,0XD8开头,以0XFF,0XD9结束,将此间数据保存为.jpg即可在电脑打开查看。

三、输出图像窗口设置

在这里插入图片描述
其中:
1、最外层为传感器窗口设置(OV2640_Window_Set),传感器窗口设置允许用户设置整个传感器区域,即在传感器里进行开窗,范围是2 * 2 ~ 1632 * 1220都可以设置。要求传感器尺寸大于图像尺寸。
2、图像尺寸设置(OV2640_ImageSize_Set)即DSP输出图像的最大尺寸。通过0XC0、0XC1、0X8C等寄存器设置。
3、图像窗口设置(OV2640_ImageWin_Set)图像窗口设置其实和前面的传感器窗口设置类似,只是这个窗口是在我们前面设置的图像尺寸里面,再一次设置窗口大小,该窗口必须小于等于前面设置的图像尺寸。该窗口设置后的图像范围,将用于输出到外部。图像窗口设置通过:0X51、0X52、0X53、0X54、0X55、0X57等寄存器设置。
4、图像输出大小设置(OV2640_OutSize_Set) 图像输出大小设置,控制最终输出到外部的图像尺寸。该设置将图像窗口设置所决定的窗口大小,通过内部DSP处理,缩放成我们输出到外部的图像大小。该设置将会对图像进行缩放处理,如果设置的图像输出大小不等于图像窗口设置图像大小,那么图像就会被缩放处理,只有这两者设置一样大的时候,输出比例才是1:1的。图像输出大小通过:0X5A/0X5B/0X5C等寄存器设置。

四、引脚说明以及操作流程

在这里插入图片描述
在这里插入图片描述
OV2640初始化流程
在这里插入图片描述
单片机读取OV2640模块图像数据过程
在这里插入图片描述

五、STM32F4的DCMI

DCMI信号说明
1,数据据输入(D[0:13]),接摄像头的数据输出。
2,水平同步(行同步)输入(HSYNC),接摄像头的HSYNC/HREF信号。
3,垂直同步(场同步)输入(VSYNC),接摄像头的VSYNC信号。
4,像素时钟输入(PIXCLK),接摄像头的PCLK信号。
在这里插入图片描述
DCMI接口的数据与PIXCLK(即PCLK)保持同步,并根据像素时钟的极性在像素时钟上升沿/下降沿发生变化。HSYNC(HREF)信号指示行的开始/结束,VSYNC信号指示帧的开始/结束。
在这里插入图片描述
图中对应设置为:DCMI_PIXCLK的捕获沿为下降沿,DCMI_HSYNC和DCMI_VSYNC的有效状态为1。
注意:这里的有效状态实际上对应的是指示数据在并行接口上无效时,HSYNC/VSYNC引脚上面的引脚电平。
DCMI数据说明
DCMI接收到的数据,存储在DCMI_DR寄存器(32位)里面,我们接ATK-OV2640采用8位数据宽度,所以每4个像素时钟,才会捕获完32位数据,第一个字节存放在LSB位置,第四个字节存放在MSB位置,如下图所示:
在这里插入图片描述
注意:低字节在前,高字节在后。
DCMI之DMA说明
DCMI支持DMA传输,当DCMI_CR寄存器中的CAPTURE位置1时,激活DMA接口。
摄像头接口每次在其寄存器(DCMI_DR)中收到一个完整的32位数据块时,都将发一个DMA请求,由DMA将DCMI_DR寄存器的值搬运到目的地址(比如LCD/SRAM)。
在这里插入图片描述DCMI的DMA请求是映射在DMA2通道1的数据流1上面的,所以配置DMA时,应该配置这个。另外,如果是直接DCMI -> DMA -> LCD的传输方式,因为LCD是16位宽(RGB565),而DCMI_DR是32位宽。所以,一次DCMI引起的DMA传输,将引发往LCD写2次数据。

六、DCMI寄存器说明

1、DCMI控制寄存器(DCMI_CR)
在这里插入图片描述

  • ENABLE,用于设置是否使能DCMI。在使能之前,必须将其他配置设置好。
  • FCRC[1:0],这两个位用于帧率控制,我们捕获所有帧,所以设置为00即可。
  • VSPOL,用于设置垂直同步极性,也就是VSYNC引脚上面,数据无效时的电平状态,根据前面说所,我们应该设置为0。
  • HSPOL,用于设置水平同步极性,也就是HSYNC引脚上面,数据无效时的电平状态,同样应该设置为0。
  • PCKPOL,用于设置像素时钟极性,我们用上升沿捕获,所以设置为1。
  • CM,用于设置捕获模式,我们用连续采集模式,所以设置为0即可。
  • CAPTURE,用于使能捕获,我们设置为1。该位使能后,将激活DMA,
    DCMI等待第一帧开始,然后生成DMA请求将收到的数据传输到目标存储器中。
    注意:CAPTURE位必须在其他所有配置(包括DMA)完成后,才使能!
    2、DCMI中断使能寄存器(DCMI_IER)
    在这里插入图片描述
  • FRAME_IE,捕获完成中断使能位。实际上就是帧中断。

七、初始化流程

  • ①配置相关引脚的复用功能,使能DCMI时钟。要用DCMI,先要使能DCMI的时钟。其次要设置DCMI的相关引脚为复用输出,以便连接OV2640模块。
  • ②设置DCMI工作模式及PCLK/HSYNC/VSYNC等参数。DCMI接口,使用8位接口,连续模式,根据OV2640模块的输出时序图,设置:PCLK为上升沿有效,HSYNC和VSYNC为低电平有效。同时还要设置帧中断(jpeg数据采集用)等参数。
  • ③设置DMA。DCMI数据,一般采用DMA来搬运,所以,设置好DCMI相关参数后,需要设置DMA,以便采集数据。
  • ④启动DCMI传输。最后,设置DCMI->CR的最低位为1,即可启动DCMI捕获图像数据。

八、代码流程

1、初始化OV2640

//初始化OV2640 
//配置完以后,默认输出是1600*1200尺寸的图片!! 
//返回值:0,成功
//    其他,错误代码
u8 OV2640_Init(void)
{ u16 i=0;u16 reg;//设置IO     	   GPIO_InitTypeDef  GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);//GPIOG9,15初始化设置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;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化OV2640_PWDN=0;	//POWER ONdelay_ms(10);OV2640_RST=0;	//复位OV2640delay_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);	//软复位OV2640delay_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
} 

2、JPEG模式

void jpeg_test(void)
{u32 i; u8 *p;u8 key;u8 effect=0,saturation=2,contrast=2;u8 size=3;		//默认是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模式My_DCMI_Init();			//DCMI配置DCMI_DMA_Init((u32)&jpeg_buf,jpeg_buf_size,DMA_MemoryDataSize_Word,DMA_MemoryInc_Enable);//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(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);	//循环发送,直到发送完毕  		USART_SendData(USART2,p[i]); 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:	//饱和度Saturationsaturation++;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>8)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去采集下一帧了.}		}    
} 

3、RGB565模式

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模式My_DCMI_Init();			//DCMI配置DCMI_DMA_Init((u32)&LCD->LCD_RAM,1,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Disable);//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:	//饱和度Saturationsaturation++;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);		}    
} 

4、DCMI初始化

//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;//100MHzGPIO_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_HSYNCGPIO_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_D2GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_DCMI); //PC9,AF13  DCMI_D3GPIO_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_D6GPIO_PinAFConfig(GPIOE,GPIO_PinSource6,GPIO_AF_DCMI); //PE6,AF13  DCMI_D7DCMI_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,VSYNCDCMI_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=0;//抢占优先级1NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;		//子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器、} 

5、DCMI配置

//DCMI DMA配置
//DMA_Memory0BaseAddr:存储器地址    将要存储摄像头数据的内存地址(也可以是外设地址)
//DMA_BufferSize:存储器长度    0~65535
//DMA_MemoryDataSize:存储器位宽  
//DMA_MemoryDataSize:存储器位宽    @defgroup DMA_memory_data_size :DMA_MemoryDataSize_Byte/DMA_MemoryDataSize_HalfWord/DMA_MemoryDataSize_Word
//DMA_MemoryInc:存储器增长方式  @defgroup DMA_memory_incremented_mode  /** @defgroup DMA_memory_incremented_mode : DMA_MemoryInc_Enable/DMA_MemoryInc_Disable
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 Stream */DMA_InitStructure.DMA_Channel = DMA_Channel_1;  //通道1 DCMI通道 DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&DCMI->DR;//外设地址为:DCMI->DRDMA_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} 

6、DCMI开始传输

void DCMI_Start(void)
{  LCD_SetCursor(0,0);  LCD_WriteRAM_Prepare();		//开始写入GRAMDMA_Cmd(DMA2_Stream1, ENABLE);//开启DMA2,Stream1 DCMI_CaptureCmd(ENABLE);//DCMI捕获使能  
}

7、DCMI停止传输

//DCMI,关闭传输
void DCMI_Stop(void)
{ DCMI_CaptureCmd(DISABLE);//DCMI捕获使关闭	while(DCMI->CR&0X01);		//等待传输结束 DMA_Cmd(DMA2_Stream1,DISABLE);//关闭DMA2,Stream1
} 

8、DCMI中断服务函数

//DCMI中断服务函数
void DCMI_IRQHandler(void)
{if(DCMI_GetITStatus(DCMI_IT_FRAME)==SET)//捕获到一帧图像{jpeg_data_process(); 	//jpeg数据处理	DCMI_ClearITPendingBit(DCMI_IT_FRAME);//清除帧中断LED1=!LED1;ov_frame++;  }
} 

http://chatgpt.dhexx.cn/article/7kBrrBoO.shtml

相关文章

OV2640 DCMI

OV2640 简介&#xff1a; 1/4寸CMOSUXGA (1632 * 1232)图像传感器。体积小、工作电压低,提供单片UXGA摄像头和影像处理器的所有功能。通过SCCB总线控制&#xff0c;可以输出整帧、子采样、缩放和取窗口等方式的各种分辨率8/10位影像数据。&#xff08;此处一般选8位&#xff0…

STM32F429之DCMI 数字相机接口

嵌入式系列文章 参考&#xff1a;《STM32F429_DM00031020_ENV19.pdf》 本文目的&#xff1a;翻译STM32F429的PRM&#xff0c;深入理解DCMI接口的工作原理&#xff0c;最后将DCMI工作原理转换成驱动代码。 DCMI&#xff1a;Digital camera interface&#xff0c;数字摄像头接口 …

DCMI接口

目录 DCMI数字摄像头接口 DCMI引脚 摄像头引脚 操作过程与通信方式 硬件连接图 写操作 读操作 图像输出 数据格式 rawRGB YUV RGB JPEG 代码实现过程简述 学习过程的问题 YUV是亮度和色度的格式&#xff0c;为什么UV中取Cb蓝和Cr红作为色度&#xff1f; 提问MIPI、DVP、DCMI是什…

stm32f4的数字摄像头接口(DCMI)使用

DCMI简介 STM32F4的DCMI接口包括如下信号 1&#xff0c;数据据输入&#xff08;D[0:13]&#xff09;&#xff0c;接摄像头的数据输出。 2&#xff0c;水平同步&#xff08;行同步&#xff09;输入&#xff08;HSYNC&#xff09;&#xff0c;接摄像头的HSYNC/HREF信号&#xff…

Java开发技术

1、基础技术 数据结构与算法 逻辑结构&#xff1a;数据对象中的数据元素之间的逻辑关系 1.集合结构&#xff1a;集合结构中的数据元素除了同属一个集合外&#xff0c;没有其他关系。 2.线性结构&#xff1a;线性结构中的数据元素之间是一对一的关系。 3.树形结构&#xff1a;树…

JAVA 中的代码生成包 CGLIB (Code Generation Library)

JAVA 中的代码生成包 CGLIB &#xff08;Code Generation Library&#xff09; CGLIB 是一个功能强大&#xff0c;高性能的代码生成包。它为没有实现接口的类提供代理&#xff0c;为 JDK 的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理&#xff0c;但当要代…

Java开发实战讲解!java开发CPU最低要求

前言 本人是底层 211 本科,刚毕业,⽆科研经历,但是有些项⽬经历。 在国内监控行业某头部企业做过一段时间的实习。 想着投下字节,可以积累⼀下⾯试经验和为金九银十面招做准备。投了简历之后,过了一段时 间,HR 就打电话跟我约时间, 说明一下&#xff0c;我投的是北京 office。…

Java面试题技术类一

前端技术导航大全 1、面向对象编程的三大特性是什么? 2、String 和StringBuffer的区别 3、说出ArrayList,Vector, LinkedList的存储性能和特性 4、Collection 和 Collections的区别 5、HashMap和Hashtable的区别 6、final, finally, finalize的区别 7、Overload和Overri…

Java专项练习(三)

JAVA选择题 401、下列类定义代码&#xff0c;当用来声明对象car&#xff0c;并用Car carnew Car();实例化后&#xff0c;可以通过car对象直接赋值的字段是&#xff08;&#xff09;402、以下哪个不是Collection的子接口&#xff1f;403、下列说法正确的是( )404、下面的程序将来…

Java学习汇总

6/28日已更新&#xff0c;错误已修改~~~有错误的地方&#xff0c;欢迎大家留言&#xff01; 目录 一、Java基础篇 1.接口和抽象类的区别 2.重载和重写的区别 3.和equals的区别 4.异常处理机制 5.HashMap原理 6.想要线程安全的HashMap怎么办&#xff1f; 7.ConcurrentHa…

java面经整理

面试问题 一、Java基础1.jdk1.7到jdk1.8HashMap发生了什么变化&#xff08;底层&#xff09;&#xff1f;2.jdk1.7到jdk1.8虚拟机发生了什么变化3.String、StringBuilder、StringBuffer4.ArrayList和LinkedList有什么区别&#xff1f;5.ConcurrentHashMap的扩容机制6.接口和抽象…

获得阿里Java开发P7岗“农村穷苦”小伙就得安于现状?

前言 相信大家看到这个标题其实就已经可以联想到我大概是个什么样的情况了&#xff0c;很多人都在生活中或者是网络上甚至是家庭中都大致听过这样的话&#xff0c;“你这样的出生&#xff0c;达到现在这样的生活已经很不错了&#xff0c;还是别为了不切实际的梦想去冒险了&…

Java基础 常见数据结构与算法 项目总结

Java基础 1 Java基础必知必会 1.1 Java语言有哪些特点&#xff1f; 面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff1b;平台无关性&#xff0c;平台无关性的具体表现在于&#xff0c;Java 是“一次编写&#xff0c;到处运行&#xff08;Wri…

Java面试知识点概览(持续更新)

Java 基础 说说自定义注解的场景及实现 利用自定义注解,结合SpringAOP可以完成权限控制、日志记录、统一异常处理、数字签名、数据加解密等功能。 实现场景&#xff08;API接口数据加解密&#xff09; 1&#xff09;自定义一个注解&#xff0c;在需要加解密的方法上添加该注…

java开发工程师面试总结

面试中常被问到的问题 介绍jvmjvm内存模型程序计数器虚拟机栈本地方法栈方法区堆 垃圾回收判断对象是否存活引用计数算法可达性分析算法 垃圾收集算法复制算法标记清除算法&#xff0c;标记整理算法 垃圾收集器新生代收集器SerialParNewParallel Scavenge 老年代收集器Serial O…

Java面试经验总结

目录 Java面试知识点基础常识前端基础知识Java基础知识1、**并行与并发**2、**线程与进程**3、**HashMap和HashTable区别**4、**new对象创建过程原理&#xff08;在JVM&#xff09;,从执行的角度(其他角度待续)**4、**Volatile和Synchronized**5、**线程创建的几种方法**6、**垃…

java怎么写api接口,绝对干货

正文 下文中截图来源于朋友一个pdf版本的面经,把所以知识点的答案整理了下来,耗费他至少1个月时间,在本文最后部分把这个pdf分享给大家,觉得有用的麻烦点赞关注走一波,谢谢!!!面经中有他的知识点的答案,如下图示例,非常详细(文末有领取方式)!!! 1.数据结构与算…

Java开发校招面经

面试 当前面经欠缺&#xff1a;docker&#xff0c;k8s容器&#xff0c;spark&#xff0c;flink&#xff0c;hbase&#xff0c;hive&#xff0c;java网络编程&#xff08;netty&#xff09; 一&#xff0c;JAVA 重写和重载 重写&#xff1a;方法签名要完全相同&#xff08;方…

数据结构:链表逆序输出

数据结构&#xff08;一&#xff09;&#xff1a;链表逆序输出 题目描述&#xff1a;创建一个链表&#xff0c;并将链表逆序输出&#xff0c;链表中以输入0作为结束 关键代码详解&#xff1a; 附&#xff1a;全部代码 #include<stdio.h> #include<stdlib.h> #…

链表逆序 java_链表逆序(JAVA实现)

题目:将一个有链表头的单向单链表逆序 分析: 链表为空或只有一个元素直接返回; 设置两个前后相邻的指针p,q,使得p指向的节点为q指向的节点的后继; 重复步骤2,直到q为空; 调整链表头和链表尾; 图解: 以链表A->B->C->D为例,逆序此链表。 0.初始状态 …