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是已经全开的了。。
不知道我的思路对不对,已经卡在这里很久很久了,上面要进度,我的进度太慢了。。
因为初学就要赶着做这个,很多都是要用到哪个才学哪个的。希望有会的大哥大姐能帮我看看,是我代码有问题还是哪里没设置好,万分感谢了!!!!
---------------------------------
可以哦
---------------------------------
哈喽,我试了用祯中断做处理,图像是320*240,隔行采集,Rgb565模式,那么我的数组是320*240/2*16bit=75k字节,而sram是115k字节,数据提取并直接显示是可以的,但是要进行二值化处理的话还需要一个同样大的数组来存二值化后的数据,这样sram就不够了。。我在板子上也试了,加二值化数组后跑不动,你有什么好方法吗~
320*240的图片应该是150k吧,ov2640,RGB565不是一个像素两个字节吗?
320*240*2/1024=150.对吗,不作处理也不够吧。。
一周热门 更多>