STM32F4,OV2640图像提取处理并传到LCD,遇到问题,求解惑~····

2019-07-20 02:42发布

STM32F407,OV2640,是按照例程里摄像头实验(库函数版)改的。目的是从摄像头提取RGB565的数据,处理之后,传到LCD屏。采用的是RGB565,320*240分辨率。
我现在到了这一步:将RGB565通过DMA提出来放到一个数组fps(由于sram有限,采取的是行中断,每次显示一行的图像),再将这个数组传到LCD上。
先上代码(改动了main.c与DCMI.c):
1.下面是中断函数,设置了全局变量extern int cnt; 快照模式,开行中断与帧中断, [mw_shl_code=c,true]void DCMI_IRQHandler(void) { if(DCMI_GetITStatus(DCMI_IT_FRAME)==SET) { DCMI_ClearITPendingBit(DCMI_IT_FRAME); } if(DCMI_GetITStatus(DCMI_IT_LINE)!=RESET)//捕捉到一行数据,使能此中断 { jpeg_data_process(); //grb565处理,将数据写到LCD屏,函数在main.c DCMI_ClearITPendingBit(DCMI_IT_LINE);//开中断 DCMI_CaptureCmd(ENABLE); } if(DCMI_GetITStatus(DCMI_IT_VSYNC)!=RESET)//帧中断 { cnt=0; //,全局变量,第cnt行,一幅图显示完置零 DCMI_ClearITPendingBit(DCMI_IT_VSYNC);// DCMI_CaptureCmd(ENABLE); LED1=!LED1; } } [/mw_shl_code] [mw_shl_code=c,true][/mw_shl_code] [mw_shl_code=c,true]//下面是在main.c里[/mw_shl_code] [mw_shl_code=c,true]void jpeg_data_process(void) //在例程基础上修改,此函数功能是将存放图像数据的数组一个个显示在LCD上 { int i; if(ov2640_mode==0)//RGB565模式下 { for(i=1;i<320;i++) { LCD_SetCursor(320-i,cnt);                      LCD_WriteRAM_Prepare();         LCD->LCD_RAM=fps; }                                    写第cnt行图像到LCD cnt++; //下一行做准备 } }[/mw_shl_code] [mw_shl_code=c,true]void rgb565_test(void) { LCD_Clear(WHITE); POINT_COLOR=RED; OV2640_RGB565_Mode(); / My_DCMI_Init(); // DCMI_DMA_Init((uint32_t)fps,320,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable);//DCMI到数组fps,而不是例程里的直传到LCD[/mw_shl_code] [mw_shl_code=c,true] OV2640_ImageSize_Set(1600,1200); OV2640_ImageWin_Set(0,0,1600,1200); OV2640_OutSize_Set(320,240); DCMI_Start(); while(1)     {     } } [/mw_shl_code]
按理来说,我得到的图应该是320*240的,结果出来是:

横的是320是对的,竖行的绝对没有240.。。大概就是60多。

我调试了好久,试了很多种方法,最后大概明白为什么,但比较模糊,先上两张对比图
下面第一张是OV2640_OutSize_Set(320,1200);的图片,第二张是OV2640_OutSize_Set(60,240);的图片

其中60*240的图片可以显示240行。我初步推断是我用数组写LCD数据所花的时间过长,摄像头采集过快,所以导致不能完全写240行。

问题是:我不知道接下来要怎么做?
1.能不能摄像头扫描的时候每一次DCMI行中断,传感器暂停扫描,等我处理完了再继续扫。
2.在网上也找了别人的做法,我这有可能是速度不匹配, 我想用FIFO开大一点,但在dcmi.c里,FIFO是已经全开的了。。
不知道我的思路对不对,已经卡在这里很久很久了,上面要进度,我的进度太慢了。。
因为初学就要赶着做这个,很多都是要用到哪个才学哪个的。希望有会的大哥大姐能帮我看看,是我代码有问题还是哪里没设置好,万分感谢了!!!!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。