OpenEdv-开源电子网

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

关于STM32+Ov7670+电脑显示的问题,涉及串口、USB等

[复制链接]

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2012-12-13
在线时间
0 小时
发表于 2013-2-28 11:34:53 | 显示全部楼层 |阅读模式
我参考的是原子哥实验36 摄像头实验的代码,主要需要实现的功能是STM32从OV7670采集一帧的数据,在接到电脑发来的信号后,再将数据传送到电脑并显示。电脑端用PySerial或PyUSB(Python的两种不同传输方法)进行读写,先给板子写一个值(作为STM32发送数据的触发装置),再读取(循环接收)每个像素的RGB值,最后把每个像素显示出来得到完整的一帧图像
问题:
1.我尝试过用printf 串口发送一帧数据,但是需要320*240*2 bytes,数据量大,传输速度不够,经常一发送就导致串口接收的python程序死机。
2.例程里用的是直接将一帧数据输出到液晶屏,我想用个全局buffer[76800][3]存储每个像素的rgb分量以取保电脑给信号后接收到的是同步好的完整的一帧图像,但是老报内存不足的问题,用的板子是STM32F103ZE,Program memory 512K,RAM 64K。
3.最近在看DMA的例程,网上有说这个能提高串口传输速度,如果我用DMA的send_buffer做一帧的存储,可行吗?
4.之前企图用USB协议(电脑端用PyUSB做接收程序)传输一帧图像,但是没太明白STM32上是如何发送数据的……是说只需要指定好buffer的具体位置,电脑上给出端点、命令等信息就行吗?电脑端如何知道从板子的哪个地址(指定的buffer位置)读取所需数据呢?跪求USB相关例程,标准例程里有可参考的不?还是说我应该直接弃了USB这种方法?

唉,最近这些问题真是太头疼了,拜谢大家了先!m(_ _)m

小女子一枚,热爱前沿科技。 毕设机器人,跪求绝处逢生。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-2-28 16:32:46 | 显示全部楼层
回复【楼主位】草野晶:
---------------------------------
1,说明你的串口程序有待改进了。换SSCOM试试。
2,当然内存不做了,76800是多少K?你得外扩SRAM,才可以。
3,这个其实与你的串口死机关系不大,不过用DMA的好处,是可以让你的CPU有更多的时间去处理重要的事情。你可以设置小块(大块内存不够啊,呵呵),分块发送。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2012-12-13
在线时间
0 小时
 楼主| 发表于 2013-3-4 01:42:13 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥~有没有可能自己控制摄像头的读写呢?比如说STM32接到串口发来的命令,然后手动控制OV_VSYNC让摄像头FIFO存储一帧,最后再通过camera_refresh()获得这一帧的图像?感觉上有点像照相机,呵呵……
如果行的话,得怎么改例程呢?
多谢啦先~
小女子一枚,热爱前沿科技。 毕设机器人,跪求绝处逢生。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-4 09:53:49 | 显示全部楼层
回复【3楼】草野晶:
---------------------------------
我们的摄像头模块直接带了FIFO,一直在存储的.你只要 在需要的时候,读取数据就可以了,所以你说的功能,完全可以实现.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2012-12-13
在线时间
0 小时
 楼主| 发表于 2013-3-4 11:48:21 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
但是我读出来的图像跟乱码似的,由于用printf发送到串口导致帧率从原来的7-8fps 变成了 0fps,会不会因为我读取得过慢导致一帧还没读取完FIFO就被覆盖了呢?还是说我生产的rgb有问题呢?多谢!

修改版main.c如下:

//更新LCD显示
void camera_refresh(void)
{
u32 j,i;
  u8 color,color1;
u8 r,g,b;  
if(ov_sta==2)
{
OV7670_RRST=0; //开始复位读指针 
OV7670_RCK=0;
OV7670_RCK=1;
OV7670_RCK=0;
OV7670_RRST=1; //复位读指针结束 
OV7670_RCK=1;
for(i=0;i<240;i++){ 
for(j=0;j<320;j++)
{
OV7670_RCK=0;
color=GPIOC->IDR&0XFF; //读数据
OV7670_RCK=1; 
  
OV7670_RCK=0;
color1=GPIOC->IDR&0XFF; //读数据
OV7670_RCK=1;
// printf("%x\n",color);
// printf("%x",color1);

if(i==120){
r= color & 0xF8;
g=((color &0x07 )<<3 | (color1 & 0xe0 ) >>5 ) << 2;
b=(color1 & 0x1f )<<3;
// printf("%d-",j);
printf("%d,",r);
printf("%d,",g);
printf("%d\n",b);

    }
}
}  
EXTI->R=1<<8;      //清除LINE8上的中断标志位
ov_sta=0; //开始下一次采集
  ov_frame++; 
// LCD_Scan_Dir(DFT_SCAN_DIR); //恢复默认扫描方向 
}
}   
int main(void)
{
u8 lightmode=0,saturation=2,brightness=2,contrast=2;
u8 effect=0;  
u8 len;
u8 t;

usmart_dev.init(72); //初始化 
OV7670_Init();     
delay_ms(1500);      
OV7670_Light_Mode(lightmode);
OV7670_Color_Saturation(saturation);
OV7670_Brightness(brightness);
OV7670_Contrast(contrast);
  OV7670_Special_Effects(effect);  

TIM6_Int_Init(10000,7199); //10Khz计数频率,1秒钟中断   
EXTI8_Init(); //使能定时器捕获
OV7670_Window_Set(10,174,240,320); //设置窗口   
   OV7670_CS=0;

delay_init();       //延时函数初始化   
NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600);   //串口初始化为9600
 
while(1)
{
if(USART_RX_STA&0x8000)
{    
len=USART_RX_STA&0x3f;//得到此次接收到的数据长度
// printf("\r\n您发送的消息为:\r\n\r\n");
for(t=0;t<len;t++)
{
USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
           camera_refresh();

delay_ms(10);
}else
{
//   printf("请输入数据,以回车键结束\n"); 
  delay_ms(10);  
}
   
}
   
}>
小女子一枚,热爱前沿科技。 毕设机器人,跪求绝处逢生。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-4 13:55:26 | 显示全部楼层
串口输出速度慢,加上你这打印方法,1帧有2*(320*240*3)=460K数据.
9600的波特率,1秒钟最多传输1K字节左右,所以你要打印一帧,需要460秒钟.
也就是大概8分钟,你电脑上才能收完1帧数据.
所以,慢慢等吧...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-4 13:56:55 | 显示全部楼层
刚刚算错了,漏了点,接收一帧大概要12分钟...我勒个去...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

53

主题

324

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2012-6-18
在线时间
7 小时
发表于 2013-3-4 15:00:55 | 显示全部楼层
我勒个去
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2012-12-13
在线时间
0 小时
 楼主| 发表于 2013-3-4 17:01:07 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
是的,我昨晚已经用实际行动证明了这个我嘞个去……(TAT)  还有什么好方法能提速么?而且为什么我输出的图像会是混乱的呢?根本看不出来是个图……
小女子一枚,热爱前沿科技。 毕设机器人,跪求绝处逢生。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-4 17:09:49 | 显示全部楼层
1,提高串口速度.
2,你那个i==120才输出,是出于什么目的? 
你说的图像混乱是液晶么?还是你放到电脑后解码?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2012-12-13
在线时间
0 小时
 楼主| 发表于 2013-3-4 17:21:44 | 显示全部楼层
回复【10楼】 正点原子 :
---------------------------------
1.好,我改成256000试试
2.那是因为240行全打出来太费时了,先找一行试试色块
不是液晶,在旗舰的液晶上没问题,就是电脑解码后不行。。。不知道我那么转换rgb565对不对
生成图如下:



小女子一枚,热爱前沿科技。 毕设机器人,跪求绝处逢生。
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2012-12-13
在线时间
0 小时
 楼主| 发表于 2013-3-4 18:01:35 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
原子哥~除了楼上回复的,有的时候还会发生同样的代码,有的时候跑出来的数据就是各种颜色的,有的时候则是无论怎么跑都是248,252,248这类似全白的,这是为什么呢?
小女子一枚,热爱前沿科技。 毕设机器人,跪求绝处逢生。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-4 22:50:47 | 显示全部楼层
估计是你的rgb转换问题了,先测试下这个.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2012-12-13
在线时间
0 小时
 楼主| 发表于 2013-3-4 23:31:46 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
在战舰的板子上运行后终于能出图像啦~不过不知道为什么出来的是黑白的。。。传回来的RGB数据就是黑白的。。。
难道说跟u16有关?


  u16 color,color1,color2;
u16 r,g,b;  
if(ov_sta==2)
{
LCD_Scan_Dir(U2D_L2R); //从上到下,从左到右 
LCD_SetCursor(0x00,0x0000); //设置光标位置 
LCD_WriteRAM_Prepare();     //开始写入GRAM
OV7670_RRST=0; //开始复位读指针 
OV7670_RCK=0;
OV7670_RCK=1;
OV7670_RCK=0;
OV7670_RRST=1; //复位读指针结束 
OV7670_RCK=1; 
for(j=0;j<76800;j++)
{
OV7670_RCK=0;
color1=GPIOC->IDR&0XFF; //读数据
OV7670_RCK=1; 
color=color1;
color<<=8;  
OV7670_RCK=0;
color2=GPIOC->IDR&0XFF; //读数据
OV7670_RCK=1;
color|=color2;
LCD->LCD_RAM=color;
// printf("%d,",color1);
// printf("%d\n",color2);
r= color1 & 0xF8;
g=((color1 &0x07 )<<3 | (color2 & 0xe0 ) >>5 ) << 2;
b=(color2 & 0x1f )<<3;
printf(",%d,%d,%d,\n",r,g,b);

    
}
小女子一枚,热爱前沿科技。 毕设机器人,跪求绝处逢生。
回复 支持 反对

使用道具 举报

7

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-3-2
在线时间
3 小时
发表于 2013-5-3 09:36:48 | 显示全部楼层
回复【14楼】草野晶:
---------------------------------您最后做出来了吗?用串口打印?
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2012-12-13
在线时间
0 小时
 楼主| 发表于 2013-5-5 16:33:09 | 显示全部楼层
回复【15楼】nanyechenxing:
---------------------------------
出来了,不过速度慢,得等一阵子才能收集完所有数据
小女子一枚,热爱前沿科技。 毕设机器人,跪求绝处逢生。
回复 支持 反对

使用道具 举报

10

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2013-7-14
在线时间
3 小时
发表于 2013-7-14 17:13:58 | 显示全部楼层
回复【16楼】草野晶:
---------------------------------
楼主调试成功了么,我也想在PC显示,跪求分享经验。
虽然走得慢,但总会向前走
回复 支持 反对

使用道具 举报

0

主题

15

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-5-20
在线时间
0 小时
发表于 2014-5-21 20:08:32 | 显示全部楼层
回复【16楼】草野晶:
---------------------------------
我也想在PC上显示,只是不知从何处入手。
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2014-6-7
在线时间
0 小时
发表于 2014-6-10 12:51:41 | 显示全部楼层
回复【18楼】亲王艾德瑞:
---------------------------------
请问你关于传输图像到PC显示有什么可行方案了吗
回复 支持 反对

使用道具 举报

11

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2014-9-5
在线时间
0 小时
发表于 2014-12-5 09:40:40 | 显示全部楼层
能分享软件吗,1509460955@qq.com
回复 支持 反对

使用道具 举报

3

主题

38

帖子

1

精华

高级会员

Rank: 4

积分
526
金钱
526
注册时间
2015-4-17
在线时间
59 小时
发表于 2015-4-19 10:25:15 | 显示全部楼层
请问lz现在解决用DMA传输数据的方法了吗? 现在我也在用串口打印color   速度很慢,!
努力搬砖
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2015-7-28
在线时间
0 小时
发表于 2015-7-28 10:24:06 | 显示全部楼层
用USB作传输吧
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-12-2
在线时间
0 小时
发表于 2015-12-7 21:09:14 | 显示全部楼层
请问楼主是因为用战舰的板子才成功的吗?
求大神,让我成为大神
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-2-28
在线时间
7 小时
发表于 2016-2-28 21:27:47 | 显示全部楼层
楼主...别怪我挖坟,我也是准备用串口发送数据,使用的波特率是115200,不过我不是打印,我是直接发送数据,但是我从串口得到的数据是错误的,和你算rgb的算法一样,但是拆开后得到的rgb的值都是几乎一样的,只会随着颜色的鲜艳程度变大变小,但是依旧保持三个分量的大小几乎差不多,楼主,能不能把你的程序给我参考一下,我弄了几天也找不到原因,我现在LCD还没到,不知道原数据对不对,还有,楼主你是怎么显示在电脑上的,是使用的彩色的上位机还是黑白上位机,如果是彩色的求楼主也发给我用下,求楼主了QQ邮箱1626716773qq.com
回复 支持 反对

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
发表于 2016-3-3 14:39:53 | 显示全部楼层
谢谢楼主分享,楼主辛苦了。
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-2-2
在线时间
2 小时
发表于 2016-3-3 16:56:56 | 显示全部楼层
谢谢楼主分享,这个探讨交流太有用了!
回复 支持 反对

使用道具 举报

13

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2014-3-20
在线时间
76 小时
发表于 2016-4-10 09:45:16 | 显示全部楼层
楼主您好,请问上位机用的是什么呀?也在搞这个
回复 支持 反对

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2016-5-7
在线时间
41 小时
发表于 2016-5-7 16:07:09 | 显示全部楼层
楼主,,你做出来没。。感觉太难了弄了好久好没弄好
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2015-11-22
在线时间
1 小时
发表于 2016-5-12 17:40:57 | 显示全部楼层
楼主您好,可以发个上位机软件么
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2018-10-13
在线时间
4 小时
发表于 2018-11-7 11:15:04 | 显示全部楼层
求楼主分享一下程序,谢谢!1187174926@qq.com
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 13:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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