OV2640二值化的分辨率提升 呼唤原子哥

2019-07-20 00:56发布

因为摄像头实验例程里,DMA_BufferSize为16位的,最大支持65536,超过该大小的数据会编译不过。分辨率被限制在220*280左右。

然后自己的想法是分多次传输存储到外部SRAM。
外部SRAM地址从0x6800 0000开始,定义一个sram_buf[400*300/2] at0x6800 0000de 的数组用来存储数据

下面代码的基本思路是:有数据时触发中断,每次传输200*150/2的数据,传输完以后地址增加,再穿下一帧。但画面始终不对
是思路错了?还是设置有问题?

[mw_shl_code=applescript,true]void DMA2_Stream1_IRQHandler(void)
{
        //u32 addr=0x68000000;
        if(DMA_GetFlagStatus(DMA2_Stream1,DMA_FLAG_TCIF1)==SET)//DMA2_Steam1,传输完成标志
        {
                 DCMI_DMA_Init(addr,200*150/2,DMA_MemoryDataSize_Word,DMA_MemoryInc_Enable);
                 addr += 200*150/2;
DMA_ClearFlag(DMA2_Stream1,DMA_FLAG_TCIF1);//清除传输完成中断       
        }
        if(addr >= 0x6803A97C)
                addr = 0x68000000;

} [/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
2hen9x1
1楼-- · 2019-07-20 06:05
 精彩回答 2  元偷偷看……
2hen9x1
2楼-- · 2019-07-20 11:25
原子哥能不能给点提示啊,就是想要传输大于65535数据时,该怎么处理
正点原子
3楼-- · 2019-07-20 11:47
 精彩回答 2  元偷偷看……
2hen9x1
4楼-- · 2019-07-20 14:19
 精彩回答 2  元偷偷看……
正点原子
5楼-- · 2019-07-20 17:41
2hen9x1 发表于 2017-7-26 21:12
哥,根据你的提示,利用照相机实验进行了修改,代码如下。
但是白屏。貌似中断没进去
思路错了吗

慢慢改,方法就是这样
2hen9x1
6楼-- · 2019-07-20 23:08
正点原子 发表于 2017-7-27 00:03
慢慢改,方法就是这样

原子哥,利用内部SRAM接近成功了
画面的顶部(高度有几个像素高的横条)会一直闪烁
就差一点点了,帮忙看看是不是哪里逻辑错了
下面是DMA的中断函数
[mw_shl_code=c,true]void DMA2_Stream1_IRQHandler(void)
{
        u16 i=0;
        u16 temp_h,temp_l;
        delay_us(300);
        if(DMA_GetFlagStatus(DMA2_Stream1,DMA_FLAG_TCIF1)==SET){//DMA2_Steam1,传输完成标志
                 if(DMA2_Stream1->CR&(1<<19)){//buf0已满,正常处理buf1
                         for(i=0;i<bufsize;i++){
                                 temp_l=(u16)(yuv422_to_Gray(jpeg_buf0));
                                if(temp_l>0x7FFF)        temp_l = 0xffff;
                                else                                                        temp_l=0x00;                               
                                LCD_WriteRAM(temp_l);       
                               
                                temp_h=(u16)(yuv422_to_Gray(jpeg_buf0)>>16);
                                if(temp_h>0x7FFF)        temp_h = 0xffff;
                                else                                                        temp_h=0x00;
                                LCD_WriteRAM(temp_h);       
                        }
                }                 
                 else{//buf1已满,正常处理buf0
                       
                         for(i=0;i<bufsize;i++){
                                 temp_l=(u16)(yuv422_to_Gray(jpeg_buf1));
                                if(temp_l>0x7FFF) temp_l = 0xffff;
                                else                                                        temp_l=0x00;
                                LCD_WriteRAM(temp_l);                               
                                temp_h=(u16)(yuv422_to_Gray(jpeg_buf1)>>16);                               
                                if(temp_h>0x7FFF)        temp_h = 0xffff;
                                else                                                        temp_h=0x00;
                                LCD_WriteRAM(temp_h);
                        }                       
                        }                                       
        }
        DMA_ClearFlag(DMA2_Stream1,DMA_FLAG_TCIF1);//清除传输完成中断
}[/mw_shl_code]

main函数基本就是初始化了
[mw_shl_code=c,true]void sw_ov2640_mode(void)
{
        OV2640_PWDN=0;//OV2640 Power Up
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_DCMI);  //PC8,AF13  DCMI_D2
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_DCMI);  //PC9,AF13  DCMI_D3
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_DCMI); //PC11,AF13 DCMI_D4  

}   
int main(void)
{
        sw_ov2640_mode();
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);  //初始化延时函数
        uart_init(115200);                //初始化串口波特率为115200
        LED_Init();                                        //初始化LED
        TIM3_Int_Init(10000-1,8400-1);//10Khz计数,1秒钟中断一次
        LCD_Init();                                        //LCD初始化  
        FSMC_SRAM_Init();                        //初始化外部SRAM.
        KEY_Init();                                        //按键初始化   
        POINT_COLOR=RED;
        while(font_init())                 //检查字库
        {            
                LCD_ShowString(30,50,200,16,16,"Font Error!");
                delay_ms(200);                                  
                LCD_Fill(30,50,240,66,WHITE);//清除显示             
                delay_ms(200);                                  
        }       
        Show_Str(30,50,200,16,"Explorer STM32F4开发板",16,0);                                              
        Show_Str(30,70,200,16,"照相机实验",16,0);                                             
        Show_Str(30,90,200,16,"KEY0:拍照(bmp格式)",16,0);                                     
        Show_Str(30,110,200,16,"KEY1:拍照(jpg格式)",16,0);                                                     
        Show_Str(30,130,200,16,"WK_UP:FullSize/Scale",16,0);                                             
        Show_Str(30,150,200,16,"2014年5月16日",16,0);
               
        //jpeg_buf0=mymalloc(SRAMIN,bufsize);        //为jpeg dma接收申请内存       
        //jpeg_buf1=mymalloc(SRAMIN,bufsize);        //为jpeg dma接收申请内存       
        //sram_buf=mymalloc(SRAMEX,yuv_sram_buf_size);                //为jpeg文件申请内存(最大300KB)

        while(OV2640_Init())//初始化OV2640
        {
                Show_Str(30,190,240,16,"OV2640 错误!",16,0);
                delay_ms(200);
          LCD_Fill(30,190,239,206,WHITE);
                delay_ms(200);
        }       
        Show_Str(30,190,200,16,"OV2640 正常",16,0);
        LCD_Clear(WHITE);
        OV2640_YUV422_Mode();        //JPEG模式
        My_DCMI_Init();                        //DCMI配置
        //OV2640_ImageWin_Set((1600-480)/2,(1600-800)/2,480,800);//1:1真实尺寸       
        OV2640_OutSize_Set(width1,height1);
        LCD_Set_Window(0,0,width1,height1);
        DCMI_DMA_Init((u32)&jpeg_buf0,(u32)&jpeg_buf1,bufsize,DMA_MemoryDataSize_Word,DMA_MemoryInc_Enable);//DCMI DMA配置       
        DCMI_Stop();                         //启动传输
        while(1)
        {       
                DCMI_Stop();
                DCMI_Start();               
                LCD_WriteRAM_Prepare();
        }
}[/mw_shl_code]

一周热门 更多>