探索者+ov2640 OutSize_Set设置为1200*1200在lcd显示的问题

2019-07-20 03:47发布

在摄像头例程的基础上修改了以下代码:每捕获一行后将数据发送到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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。