在摄像头例程的基础上修改了以下代码:每捕获一行后将数据发送到lcd显示,lcd是800*480,画面就400*400的显示,也就是隔两行显示一次,每一行隔两个像素显示。双缓冲读取数据。
我将rgb565_buf_size设为800,隔一行显示一次,每一行隔一个像素显示画面是正常的。
是OV2640_ImageWin_Set 和OV2640_OutSize_Set设置有问题吗?
main.c代码:
[mw_shl_code=c,true]#define rgb565_buf_size 1200 //定义JPEG数据缓存rgb565_buf的大小(*4字节)1160
__align(4) u32 rgb565_buf0[rgb565_buf_size/2]; //JPEG数据缓存buf
__align(4) u32 rgb565_buf1[rgb565_buf_size/2]; //JPEG数据缓存buf
volatile u32 jpeg_data_len=0; //buf中的JPEG有效数据长度
volatile u8 line_data_ok=0;
u32 line_cnt=0;
u8 start_new_frame=0;
#define t 2
u16 showsize=rgb565_buf_size/t;
int main(void)
{
u16 i;
u16 *p;
u16 pic;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
LED_Init(); //初始化LED
LCD_Init(); //LCD初始化
POINT_COLOR=RED;//设置字体为红 {MOD}
while(OV2640_Init())//初始化OV2640
{
LCD_ShowString(30,130,240,16,16,"OV2640 ERR");
delay_ms(200);
LCD_Fill(30,130,239,170,WHITE);
delay_ms(200);
}
OV2640_RGB565_Mode(); //RGB565模式
My_DCMI_Init(); //DCMI配置
DCMI_DMA_Init((u32)&rgb565_buf0,(u32)&rgb565_buf1,rgb565_buf_size/2,DMA_MemoryDataSize_Word,DMA_MemoryInc_Enable);//DCMI DMA配置
OV2640_ImageWin_Set((1600-rgb565_buf_size)/2,(1200-rgb565_buf_size)/2,rgb565_buf_size,rgb565_buf_size);
OV2640_OutSize_Set(rgb565_buf_size,rgb565_buf_size);
// OV2640_Color_Bar(1);
OV2640_Auto_Exposure(0);//0-4
DCMI_Start(); //启动传输
LED1=0;
while(1)
{
if(line_data_ok==2) //采集完一行图像
{
if(start_new_frame)
{
LED1=1;
LED0=!LED0;
start_new_frame=0;
LCD_SetCursor(0,0);
LCD_WriteRAM_Prepare();
}
if(DMA_GetCurrentMemoryTarget(DMA2_Stream1)==1)
p=(u16*)rgb565_buf0;
else
p=(u16*)rgb565_buf1;
if((line_cnt%3==0))
{
for(i=0;i<400;i++) //lcd写一行图像
{
pic=p[i*3];
LCD->LCD_RAM=pic;
}
for(i=400;i<480;i++)
LCD->LCD_RAM=0xffff;
}
line_data_ok=0; //标记jpeg数据处理完了,可以让DMA去采集下一帧了.
}
}
}
[/mw_shl_code]
dcmi.c代码:
[mw_shl_code=c,true]//DCMI中断服务函数
void DCMI_IRQHandler(void)
{
if(DCMI_GetITStatus(DCMI_IT_LINE)==SET)//捕获到一行图像
{
DCMI_ClearITPendingBit(DCMI_IT_LINE);//清除行中断
line_cnt++;
line_data_ok=2;
}
if(DCMI_GetITStatus(DCMI_IT_FRAME)==SET)
{
DCMI_ClearITPendingBit(DCMI_IT_FRAME);//清除帧中断
start_new_frame=1;
line_cnt=0;
}
[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>