OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4997|回复: 6

STM32关于OV7670图传问题

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2017-3-9
在线时间
11 小时
发表于 2017-3-9 20:28:39 | 显示全部楼层 |阅读模式
1金钱
因为想要做一个跟随的项目,需要将实时图片以每秒1到2帧的速度无线传输到电脑上,我想的是用OV7670采集图像(分辨率320*240),但是遇到了些问题:
一、我想用sip_WIFI  于是先用W25q16模拟了一下spi的速度,然后发现,基本上我一帧图像需要几秒才能写入一帧,我想问一下是怎么回事,我把SPI分频设的2分频,照理说不应该这么慢,而且我为了避免w25q16反复擦除,我都是直接写一次,也就是写2k就换一页,按理说会快一点。但是结果还是很慢。
[mw_shl_code=c,true]void SPI_SENDPACK(void)
{
    u32 j;
    u32 i;

    if(ov_sta)//有帧中断更新?
    {
        OV7670_RRST=0;                                //开始复位读指针
        OV7670_RCK_L;
        OV7670_RCK_H;
        OV7670_RCK_L;
        OV7670_RRST=1;                                //复位读指针结束
        OV7670_RCK_H;
        for(j=0; j<75; j++)
        {
            for(i=0; i<2048; i++)//1k个像素点
            {
                OV7670_RCK_L;
                camera_pack=GPIOC->IDR&0XFF;        //读数据
                OV7670_RCK_H;
            }
             W25QXX_Write(camera_pack,FLASH_SIZE-100*4096+j*4096,SIZE);
        }
                ov_sta=0;
        ov_frame++;
    }
}[/mw_shl_code]




二、我在写入之后,在把它读出来,写到lcd上,发现,如果摄像头面前有东西在动,图像就会花(出现了断层,就像是照相的时候手抖就会花)

这个要怎么解决。


还有呢,就是我觉得这种用单片机传,速度慢并且分辨率还不高,大家有没有比较好的方式作图传。航拍是怎么传的。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-3-12 18:57:50 | 显示全部楼层
不要在写入的时候执行擦除操作,否则就是很慢的了。。。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2017-3-9
在线时间
11 小时
 楼主| 发表于 2017-3-31 18:37:33 | 显示全部楼层
正点原子 发表于 2017-3-12 18:57
不要在写入的时候执行擦除操作,否则就是很慢的了。。。

额,那应该怎么办呢  ,不擦除?直接覆盖?求原子哥给思路
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-4-1 22:15:39 | 显示全部楼层
cqutliuxin 发表于 2017-3-31 18:37
额,那应该怎么办呢  ,不擦除?直接覆盖?求原子哥给思路

没有什么好办法。
找找专门为SPI FLASH准备的文件系统吧,百度搜索下
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2017-3-9
在线时间
11 小时
 楼主| 发表于 2017-4-4 14:26:41 | 显示全部楼层
正点原子 发表于 2017-4-1 22:15
没有什么好办法。
找找专门为SPI FLASH准备的文件系统吧,百度搜索下

原子哥,我还有一件事情想问你,就是我因为要发送嘛,所以可能就是很慢的从FIFO读取一帧,因为花了大量时间去发送,于是我就遇到了这样一个问题,就是新的图像一直在写入FIFO,而我上一帧的图像还没有读取完成,下一帧的图像就来了,图像会分层,于是我想了个办法,让它写FIFO 跟我读FIFO 频率同步起来,就是读完了新的一帧,才写入下一帧,我在帧中断函数里加了个标志位(用来判断我是不是已经把上一帧读取完了).
[mw_shl_code=c,true]void EXTI9_5_IRQHandler(void)
{                                 
        if(EXTI_GetITStatus(EXTI_Line8)==SET)        //是8线的中断
        {
        if(Readfinish==1)
                {        
                Readfinish=0;                        
                OV7670_WRST=0;        //复位写指针                                   
                OV7670_WRST=1;        
                OV7670_WREN=1;        //允许写入FIFO         
                ov_sta++;                //帧中断加1
                }
        }
        EXTI_ClearITPendingBit(EXTI_Line8);  //清除EXTI8线路挂起位                                                  
} [/mw_shl_code]

然后在做测试的时候,我在显示也就是读FIFO 里面去加了个延时让它读得很慢
[mw_shl_code=c,true]//更新LCD显示
void camera_refresh(void)
{
        u32 j;
         u16 color;         
        if(ov_sta)//有帧中断更新?
        {

                delay_ms(1000);        
                LCD_Scan_Dir(U2D_L2R);                //从上到下,从左到右  
                if(lcddev.id==0X1963)LCD_Set_Window((lcddev.width-240)/2,(lcddev.height-320)/2,240,320);//将显示区域设置到屏幕中央
                else if(lcddev.id==0X5510||lcddev.id==0X5310)LCD_Set_Window((lcddev.width-320)/2,(lcddev.height-240)/2,320,240);//将显示区域设置到屏幕中央
                LCD_WriteRAM_Prepare();     //开始写入GRAM        
                OV7670_RRST=0;                                //开始复位读指针
                OV7670_RCK_L;
                OV7670_RCK_H;
                OV7670_RCK_L;
                OV7670_RRST=1;                                //复位读指针结束
                OV7670_RCK_H;
                for(j=0;j<76800;j++)
                {
                        OV7670_RCK_L;
                        color=GPIOC->IDR&0XFF;        //读数据
                        OV7670_RCK_H;
                        color<<=8;  
                        OV7670_RCK_L;
                        color|=GPIOC->IDR&0XFF;        //读数据
                        OV7670_RCK_H;
                        LCD->LCD_RAM=color;   
                }
        
                 ov_sta=0;                                        //清零帧中断标记
                ov_frame++;
                LCD_Scan_Dir(DFT_SCAN_DIR);        //恢复默认扫描方向
                Readfinish=1;                //读完成标志置一           
        }
}           
[/mw_shl_code]



最后,发现,图像分成了分层,也就是两块,有点懵逼呀,原子哥,求解答.
回复

使用道具 举报

2

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-12-31
在线时间
12 小时
发表于 2017-4-5 09:59:39 | 显示全部楼层
楼主,我想要查看摄像头一帧图像数据的值,比如说通过串口打印,该怎么做?
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2017-3-9
在线时间
11 小时
 楼主| 发表于 2017-6-16 09:56:19 | 显示全部楼层
fkpeak 发表于 2017-4-5 09:59
楼主,我想要查看摄像头一帧图像数据的值,比如说通过串口打印,该怎么做?

首先,你必须要用带FIFO的摄像头,串口的打印速度很慢,跟不上摄像头的速度,利用FIFO就能解决这个问题,我建议你把这个程序拿过来看看,就是论坛里有一个24l01做图传的程序。然后的话,他的做法是在帧中断来的时候写入FIFO,然后下一个帧中断来的时候禁止写。你用一个数组不断地去接收,分多次用串口跟着打印。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-18 04:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表