OpenEdv-开源电子网

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

STM32F407+OV2640的jpeg模式,串口输出显示速度很慢

[复制链接]

15

主题

88

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2012-12-5
在线时间
1 小时
发表于 2014-5-12 20:18:23 | 显示全部楼层 |阅读模式
5金钱
各位大大,小弟最近在做视频采集,STM32F4+OV2640,配置STM32的FSMC,并开启DMA模式刷屏到LCD上显示速度很快,但是同样的分辨率,当配置成JPEG模式时,DMA将图像数据传到内部RAM的数组中,再用串口将数据发送到上位机,但320*240分辨率的JPEG图像在上位机上显示速度只有0.6帧左右,感觉DMA输出到内部RAM再取出显示速度太慢,请问各位大大有没有什么好的解决办法。

以下是我的代码:

#define IMAGE_BUFFER_SIZE 100  //以字为单位  经试验,增大这个数值速度并未提升

u32 Image_Buffer1[IMAGE_BUFFER_SIZE]={0};
u32 Image_Buffer2[IMAGE_BUFFER_SIZE]={0};

//OV2640 JPEG模式接口配置
void OV2640_JpegDcmiInit(void)
{
DCMI_InitTypeDef DCMI_InitStructure;
DMA_InitTypeDef  DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure; //NVIC
/*** Configures the DCMI to interface with the OV2640 camera module ***/
/* Enable DCMI clock */
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE);

/* DCMI configuration */ 
DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous;//单张DCMI_CaptureMode_Continuous;
DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware;
DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Rising;//
DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_Low;
DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_Low;
DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame;
DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b;
//初始化DCMI
DCMI_Init(&DCMI_InitStructure);
//使能JPG
DCMI_JPEGCmd(ENABLE);

/* Configures the DMA2 to transfer Data from DCMI */
/* Enable DMA2 clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);

/* DMA2 Stream1 Configuration */  
DMA_DeInit(DMA2_Stream1);

DMA_InitStructure.DMA_Channel = DMA_Channel_1;  
DMA_InitStructure.DMA_PeripheralBaseAddr = DCMI_DR_ADDRESS;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&Image_Buffer1;//传输到内部数组
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = IMAGE_BUFFER_SIZE; //以字为单位
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//使能增长模式
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;//DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
/*DMA double buffer mode*///双缓冲区模式
DMA_DoubleBufferModeConfig(DMA2_Stream1,(uint32_t)&Image_Buffer2,DMA_Memory_0);//DMA_Memory_0首先被传输
DMA_DoubleBufferModeCmd(DMA2_Stream1,ENABLE);
DMA_Init(DMA2_Stream1, &DMA_InitStructure); //初始化DMA

Dma_FreeBuf_Ok = 0;//此时没有数据准备完成
// DMA_Cmd(DMA2_Stream1,ENABLE);//启动DMA2_Stream1

//中断使能
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn; 
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure); 
DCMI_ITConfig(DCMI_IT_FRAME,ENABLE); //中断使能

NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_ITConfig(DMA2_Stream1,DMA_IT_TC,ENABLE);
}

//DMA传输完成中断
void DMA2_Stream1_IRQHandler(void)
{
DMA_InitTypeDef DMA_InitStructure;
if(DMA_GetITStatus(DMA2_Stream1,DMA_IT_TCIF1) != RESET)
{
DMA_ClearITPendingBit(DMA2_Stream1,DMA_IT_TCIF1);
Dma_FreeBuf_Ok = 1;//有准备好的数据了
}
}


//主循环
while(1)
{
//uip_polling();
if(Dma_FreeBuf_Ok == 1)//DMA有空闲缓冲区了
{
usart_sendJPEGdata();
Dma_FreeBuf_Ok = 0;
}


//串口传输
void usart_sendJPEGdata(void)
{
u32 i;
if(DMA_GetCurrentMemoryTarget(DMA2_Stream1) == 1)
{
for(i=0;i<IMAGE_BUFFER_SIZE;i++)
{
USART_SendData(USART2,Image_Buffer1);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
USART_SendData(USART2,Image_Buffer1>>8);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
USART_SendData(USART2,Image_Buffer1>>16);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
USART_SendData(USART2,Image_Buffer1>>24);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
}
}
else
{
for(i=0;i<IMAGE_BUFFER_SIZE;i++)
{
USART_SendData(USART2,Image_Buffer2);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
USART_SendData(USART2,Image_Buffer2>>8);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
USART_SendData(USART2,Image_Buffer2>>16);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
USART_SendData(USART2,Image_Buffer2>>24);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
}
}
}

//以下是图像显示效果


最佳答案

查看完整内容[请看2#楼]

0.6帧确实有点慢,不过你用115200的波特率,顶多也就每秒钟11K字节的数据。 按照一帧图像6~8K数据的容量,你一秒钟不会超过2帧.... 0.6是低了点,但是再高,也就那样了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2014-5-12 20:18:24 | 显示全部楼层
0.6帧确实有点慢,不过你用115200的波特率,顶多也就每秒钟11K字节的数据。
按照一帧图像6~8K数据的容量,你一秒钟不会超过2帧....
0.6是低了点,但是再高,也就那样了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

88

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2012-12-5
在线时间
1 小时
 楼主| 发表于 2014-5-13 10:11:40 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,目前320*240的分辨率,一帧图像大概4KB左右,为什么按照这种方式只能0.6帧的速度?就算能达到2帧也行啊,还请原子哥多多指教。
回复

使用道具 举报

15

主题

88

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2012-12-5
在线时间
1 小时
 楼主| 发表于 2014-5-13 10:47:50 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
还有,原子哥,当不用串口使用uip的时候,发出的数据也比较慢,1s大概能发4kbyte,差不多就一帧的样子,感觉跟串口输出的速度很接近。不知道这是什么原因造成的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2014-5-13 22:56:26 | 显示全部楼层
回复【4楼】玄心空月:
---------------------------------
这个就得优化uip了...
另外,我测试了下,F4驱动OV2640,JPEG输出,320*240的图片,数据量在10KB左右...
你的怎么这么小?难道把jpeg质量降低了?
我测试320*240就要10KB左右了
800*600,40多KB
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

88

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2012-12-5
在线时间
1 小时
 楼主| 发表于 2014-5-14 10:30:07 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
嗯,我从输出的数据看到320*240的分辨率情况下FF D8-----FF D9之间一般情况下都在4K多个数据,颜色少的话还能少点。然后FF D9后边会跟若干个0。原子哥说的uip优化是什么意思?我现在用的udp,配置的1ms定时器,DMA传输完成将Dma_FreeBuf_Ok置1后,在主循环中是这样的。
while(1)
{
uip_polling();
if(Dma_FreeBuf_Ok == 1)//DMA有空闲缓冲区了
{
if(udp_client_sta & 1<<7)//如果udp连接存在
udp_client_sta |= 1<<5;//标记有数据要发送
Dma_FreeBuf_Ok = 0;
}
       }
学习原子哥的代码,将udp_client_sta第5位置1.然后在uip回调函数udp_appcall里
void udp_appcall(void)
{
struct udp_client_appstate *s = (struct udp_client_appstate *)&uip_udp_conn->appstate;
if(udp_client_sta & 1<<5)//有数据需要发送
{
if(uip_udp_conn->rport == HTONS(UDP_RPORT))
{
if(DMA_GetCurrentMemoryTarget(DMA2_Stream1) == 0)//当前DMA正在向Memory_0即Image_Buffer1传输数据,  
                                                                                                               //Memory_1即Image_Buffer2空闲
{
s->textptr = Image_Buffer2;
s->textlen = IMAGE_BUFFER_SIZE*4;
uip_send(s->textptr,s->textlen);
                                udp_client_sta &= ~(1<<5); //清除数据发送标记
}
else
{
s->textptr = Image_Buffer1;
s->textlen = IMAGE_BUFFER_SIZE*4;
uip_send(s->textptr,s->textlen);
udp_client_sta &= ~(1<<5); //清除数据发送标记
}
}
}
uip研究的不够深入,还请原子哥多指教。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2014-5-14 10:51:05 | 显示全部楼层
回复【6楼】玄心空月:
---------------------------------
uip我也研究不多,呵呵
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
发表于 2014-10-26 15:15:16 | 显示全部楼层
回复【6楼】玄心空月:
---------------------------------
你好,请问一下,你说可以把颜色弄少一点就可以把图片的大小减小,是怎样弄的?怎样可以把输出的jpeg图片大小再弄小,我现在输出也是10K左右,不知道怎样弄成5K左右
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

62

主题

275

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1155
金钱
1155
注册时间
2012-3-4
在线时间
80 小时
发表于 2014-11-11 15:46:22 | 显示全部楼层
回复【8楼】ljjdglg520:
---------------------------------
又看到你了啊,哈哈哈,进度如何啊
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
发表于 2014-11-11 22:31:11 | 显示全部楼层
回复【9楼】l1234564555:
---------------------------------
搞定了,现在已经把板发出去了,其实真的不难,我之前之所以老是调不出来,是因为不知道M3跟M4的DMA设置不一样,我在网上查到的所谓M4的DMA其实都是M3的,坑死了
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

62

主题

275

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1155
金钱
1155
注册时间
2012-3-4
在线时间
80 小时
发表于 2014-11-14 14:04:36 | 显示全部楼层
回复【10楼】ljjdglg520:
---------------------------------
请问思路,用的什么wifi模块么?还是有线的呢?
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
发表于 2014-11-14 23:24:25 | 显示全部楼层
回复【11楼】l1234564555:
---------------------------------
我现在暂时用SPI接口的WIFI,不过我觉得SPI还不够快,反正现在是测试嘛,将来量产可能换成SDIO接口的WIFI,有没有线是要看你们自己的需求,反正我现在没有用线
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

11

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
492
金钱
492
注册时间
2015-3-3
在线时间
114 小时
发表于 2015-3-8 15:05:29 | 显示全部楼层
你使用的是串口2 啊,怎么不用串口1呢,
回复

使用道具 举报

9

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
285
金钱
285
注册时间
2015-4-19
在线时间
75 小时
发表于 2016-6-11 12:19:48 | 显示全部楼层
大神请问用这个上位机,串口需要发什么格式数据让他显示图片呢
学习学习。。
回复

使用道具 举报

5

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
391
金钱
391
注册时间
2014-8-25
在线时间
157 小时
发表于 2016-11-25 17:47:31 | 显示全部楼层
不错,双缓冲学习了,多谢
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2018-10-15
在线时间
32 小时
发表于 2019-8-7 20:33:23 | 显示全部楼层
双Buffer 学习了,mark一下
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2019-8-8
在线时间
3 小时
发表于 2019-8-8 17:05:19 | 显示全部楼层
能识别颜色吗
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2022-4-6
在线时间
7 小时
发表于 2022-4-12 20:19:13 | 显示全部楼层
有木有源码呀  大佬
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 20:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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