OpenEdv-开源电子网

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

STM32F407 OV2640 DCMI+DMA RGB565格式的图像上传给上位机,基于正点JPEG程序修改可是有错误,希望论坛里的朋友和原子哥指导一下

[复制链接]

12

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2012-10-28
在线时间
18 小时
发表于 2015-11-4 16:31:48 | 显示全部楼层 |阅读模式
5金钱

如题,先说说我要完成的功能,就是用OV2640采集图像,然后将图像像素点缩放成200×200,以RGB格式上传给上位机 ,参考实验35 摄像头实验 例程,里面的JPEG格式是用OV2640采集完成后通过串口上传给PC端的,所以就根据这个改本来以为改改 OV2640的输出格式就行了那,结果问题多多啊。

我更改的位置:

可是实际输出的结果却不行,和想象中的完全不一样、

输出的图像

debug的时候发现jepg_data_len的长度是20008,

就算×2也才是40000,可是按照设想,传给上位机的数据长度应该是40000×2=80000 正好是200×200像素点一共200×200×2个字节。

希望原子哥帮帮小弟,我已经调试几天,没有思路了。。@正点原子


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

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2082
金钱
2082
注册时间
2014-12-19
在线时间
711 小时
发表于 2015-11-4 17:46:24 | 显示全部楼层
没有完整源码,无法分析
回复

使用道具 举报

12

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2012-10-28
在线时间
18 小时
 楼主| 发表于 2015-11-4 19:56:04 | 显示全部楼层
回复【2楼】lvehe:
---------------------------------我是按照索者STM32F4开发板例程代码 库函数实验35 摄像头实验 改的。我只改了以上的部分

#define jpeg_buf_size 200*200 //定义rgb的数据缓存buf
u16 jpeg_buf[jpeg_buf_size]; //rgb数据缓存buf
volatile u32 jpeg_data_len=0;    //buf中的JPEG有效数据长度
volatile u8 jpeg_data_ok=0;    //JPEG数据采集完成标志
          //0,数据没有采集完;
          //1,数据采集完了,但是还没处理;
          //2,数据已经处理完成了,可以开始下一帧接收
//处理JPEG数据
//当采集完一帧JPEG数据后,调用此函数,切换JPEG BUF.开始下一帧采集.
void jpeg_data_process(void)
{
 
  if(jpeg_data_ok==0) //jpeg数据还未采集完?
  { 
   DMA_Cmd(DMA2_Stream1, DISABLE);//停止当前传输
   while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}//等待DMA2_Stream1可配置 
   jpeg_data_len=jpeg_buf_size-DMA_GetCurrDataCounter(DMA2_Stream1);//得到此次数据传输的长度
    
   jpeg_data_ok=1;     //标记JPEG数据采集完按成,等待其他函数处理
  }
  if(jpeg_data_ok==2) //上一次的jpeg数据已经被处理了
  {
   DMA2_Stream1->NDTR=jpeg_buf_size; 
   DMA_SetCurrDataCounter(DMA2_Stream1,jpeg_buf_size);//传输长度为jpeg_buf_size*4字节
   DMA_Cmd(DMA2_Stream1, ENABLE);   //重新传输
   jpeg_data_ok=0;      //标记数据未采集
  }
}
//JPEG测试
//JPEG数据,通过串口2发送给电脑.
void jpeg_test(void)
{
 u32 i;
 u8 *p;
  OV2640_RGB565_Mode();  //RGB模式
 My_DCMI_Init();   //DCMI配置
 DCMI_DMA_Init((u32)&jpeg_buf,jpeg_buf_size,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable);//DCMI DMA配置  
 OV2640_OutSize_Set(200,200);
 DCMI_Start();   //启动传输
 while(1)
 {
  if(jpeg_data_ok==1) //已经采集完一帧图像了
  { 
   p=(u8*)jpeg_buf;
   for(i=0;i<jpeg_data_len*2;i++)  //dma传输1次等于2字节,所以乘以2.
   {
        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕    
    USART_SendData(USART2,p);
   }
   while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
   USART_SendData(USART2,'J');
    while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
   USART_SendData(USART2,'E');
   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
  LCD_Init();     //LCD初始化 
  KEY_Init();     //按键初始化
 TIM3_Int_Init(10000-1,8400-1);//10Khz计数,1秒钟中断一次
  usmart_dev.init(84);  //初始化USMART
 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");    
 
 jpeg_test();
 
}
这个就是主程序的代码,代码附件我也一并上传了,麻烦你帮我看看,谢谢了。

STM32f407摄像头实验.zip

7.14 MB, 下载次数: 753

回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2082
金钱
2082
注册时间
2014-12-19
在线时间
711 小时
发表于 2015-11-5 09:15:48 | 显示全部楼层
回复【3楼】z755924843:
---------------------------------
你这个显示RGB565图像的上位机是自己编写的吗?
建议将缓冲区再弄大点,刚好200x200可能少了点。
回复

使用道具 举报

12

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2012-10-28
在线时间
18 小时
 楼主| 发表于 2015-11-5 19:00:22 | 显示全部楼层
回复【4楼】lvehe:
---------------------------------
是自己编写的,上位机的缓冲大一点吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2015-11-5 23:06:04 | 显示全部楼层
先显示在lcd看看正常不。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2016-9-25
在线时间
31 小时
发表于 2017-3-2 10:07:44 | 显示全部楼层
请问能提供显示rgb565的上位机软件吗?
回复

使用道具 举报

4

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2013-5-10
在线时间
49 小时
发表于 2017-5-9 00:34:42 | 显示全部楼层
请问你这个问题解决了吗?我现在用ov5640在做rgb565格式上传,能给点建议不?
回复

使用道具 举报

95

主题

550

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3299
金钱
3299
注册时间
2016-1-7
在线时间
541 小时
发表于 2017-7-10 12:52:03 | 显示全部楼层
楼主的问题解决了吗?
回复

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-9-12
在线时间
19 小时
发表于 2017-7-30 13:22:01 | 显示全部楼层
你好,能说一下你用的上位机吗
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2017-8-28
在线时间
1 小时
发表于 2017-8-28 22:09:34 | 显示全部楼层
我刚好遇到这个问题楼主 如果我想的没错 那应该是 你的缓冲区 jepg_buf 200*200 太大了 会出现错误 但是编译不报错
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2020-8-27
在线时间
7 小时
发表于 2020-11-6 19:57:27 | 显示全部楼层
后来解决了吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-29 22:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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