关于OV2640的问题

2019-07-20 09:09发布

本帖最后由 一匹夫尓 于 2018-3-15 23:25 编辑

    请教一个问题:现在是这样的,我要用一个触发信号控制F4用0V2640拍照,获取一帧数据之后彩信发出去,我修改了原子哥的程序,但是用串口看得数据 一直都是有两帧(Size:VGA),其他图片大小的也是两帧。    我想请教一下,我要如何才能这个触发信号来了,就拍一次照片,每次只要一张照片,然后不需要一直DMA传输,相当于一个触发信号就做一次数据处理,处理完就关掉。不知道描述的有没有问题,但大意是这样的。
以下是我的代码 修改自原子哥的程序(做毕业设计 应该不算其他用途吧)只修改了这两部分:
void jpeg_test(void)
{
    u32 i;
    u8 *p;
    u8 key;
    u8 effect=0,saturation=2,contrast=2;
    u8 size=1;                //默认是QVGA 320*240尺寸
    u8 msgbuf[15];        //消息缓存区
    LCD_Clear(WHITE);
    POINT_COLOR=RED;
    LCD_ShowString(30,50,200,16,16,"ALIENTEK STM32F4");
    LCD_ShowString(30,70,200,16,16,"OV2640 JPEG Mode");
    LCD_ShowString(30,100,200,16,16,"KEY0:Contrast");                        //对比度
    LCD_ShowString(30,120,200,16,16,"KEY1:Saturation");                 // {MOD}彩饱和度
    LCD_ShowString(30,140,200,16,16,"KEY2:Effects");                         //特效
    LCD_ShowString(30,160,200,16,16,"KEY_UP:Size");                                //分辨率设置
    sprintf((char*)msgbuf,"JPEG Size:%s",JPEG_SIZE_TBL[size]);
    LCD_ShowString(30,180,200,16,16,msgbuf);                                        //显示当前JPEG分辨率

    OV2640_JPEG_Mode();                //JPEG模式
    My_DCMI_Init();                        //DCMI配置
    DCMI_DMA_Init((u32)&jpeg_buf,jpeg_buf_size,DMA_MemoryDataSize_Word,DMA_MemoryInc_Enable);//DCMI DMA配置
    OV2640_OutSize_Set(jpeg_img_size_tbl[size][0],jpeg_img_size_tbl[size][1]);//设置输出尺寸
    DCMI_Start();                 //启动传输
    if(jpeg_data_ok==1)        //已经采集完一帧图像了
    {
                DCMI_Stop();
        BEEP = 1;
        p=(u8*)jpeg_buf;
        LCD_ShowString(30,210,210,16,16,"Sending JPEG data..."); //提示正在传输数据
        for(i=0; i<jpeg_data_len*4; i++)                //dma传输1次等于4字节,所以乘以4.
        {
            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);        //循环发送,直到发送完毕
            USART_SendData(USART1,p);
            key=KEY_Scan(0);
            if(key)break;
        }
        BEEP = 0;
                jpeg_data_len = 0;
                LCD_ShowString(30,210,210,16,16,"Send data complete!!");//提示传输结束设置
        jpeg_data_ok=2;        //标记jpeg数据处理完了,可以让DMA去采集下一帧了.
    }
}


int main(void)
{
    u8 key;
    u8 t;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    delay_init(168);  //初始化延时函数
    uart_init(115200);                //初始化串口波特率为115200
    usart2_init(42,115200);                //初始化串口2波特率为115200
    LED_Init();                                        //初始化LED
    BEEP_Init();                //蜂鸣器初始化
    LCD_Init();                                        //LCD初始化
    KEY_Init();                                        //按键初始化
    //TIM3_Int_Init(10000-1,8400-1);//10Khz计数,1秒钟中断一次

    usmart_dev.init(84);                //初始化USMART
    POINT_COLOR=RED;//设置字体为红 {MOD}
    LCD_ShowString(30,50,200,16,16,"Test Code ");
    LCD_ShowString(30,70,200,16,16,"Code ver 1.0");
    LCD_ShowString(30,90,200,16,16,"xxxxxxxxx");
    LCD_ShowString(30,110,200,16,16,"2018/3/14");
    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);
    }
    LCD_ShowString(30,130,200,16,16,"OV2640 OK");
    LCD_ShowString(30,150,200,16,16,"SIM800C OK");
    LCD_ShowString(30,170,200,16,16,"KEY0:Run Mode");
    LCD_ShowString(30,190,200,16,16,"KEY1ebug Mode");
    while(1)
    {
        key=KEY_Scan(0);
        if(key==KEY0_PRES)                        //RGB565模式
        {
            rgb565_test();
        }
        else if(key==KEY1_PRES)        //JPEG模式
        {
            ov2640_mode = 1;
            jpeg_test();

        }
    }
}

望不吝赐教
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
正点原子
1楼-- · 2019-07-20 15:01
例程拍照就是获取一帧数据拍照啊,只是前面要丢掉一两帧数据而已。为了得到完整的图像。
一匹夫尓
2楼-- · 2019-07-20 18:44
 精彩回答 2  元偷偷看……
一匹夫尓
3楼-- · 2019-07-21 00:34
 精彩回答 2  元偷偷看……
一匹夫尓
4楼-- · 2019-07-21 03:35
正点原子 发表于 2018-3-15 23:22
例程拍照就是获取一帧数据拍照啊,只是前面要丢掉一两帧数据而已。为了得到完整的图像。

        DCMI_Start();                         //启动传输
        while(jpeg_data_ok!=1);        //等待第一帧图片采集完
        jpeg_data_ok=2;                        //忽略本帧图片,启动下一帧采集
        while(jpeg_data_ok!=1);        //等待第二帧图片采集完
        jpeg_data_ok=2;                        //忽略本帧图片,启动下一帧采集
        while(jpeg_data_ok!=1);        //等待第三帧图片采集完,第三帧,才保存到SD卡去.
这里三帧保存最后一帧的意思是保证数据的完整性吗

一周热门 更多>