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是已经全开的了。。
不知道我的思路对不对,已经卡在这里很久很久了,上面要进度,我的进度太慢了。。
因为初学就要赶着做这个,很多都是要用到哪个才学哪个的。希望有会的大哥大姐能帮我看看,是我代码有问题还是哪里没设置好,万分感谢了!!!!
---------------------------------
我就是不做处理的,直接把从摄像头获得的数据一行行传给LCD的,然后就出现上面情况了。。
一周热门 更多>