打印
[STM32F4]

存摄像头的数据

[复制链接]
2169|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ywlzh|  楼主 | 2016-3-22 17:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32f407 + OV2640 + 外部1M的sram

实验目的:
      用stm32将ov2640里没有个像素点的数据(32位)存入到外部sram中
实验过程:
      为了从sram中看到数据是否正确,我加了一块LCD(调试没有问题),ov2640用的是DCMI接口,采用DMA的方式,将摄像头的数据直接给LCD,用的RGB565模式,显示无误,但这样下来,我只知道数据就这样传着,却不知道数据“长啥样”,于是我加入外部sram(单一调试无误),为了看数据是否正确,我做了这几步:1,用DMA将摄像头的数据传给外部sram,当DCMI帧中断来的时候,我于是停止DMA传送,停止DCMI,2,将外部sram中的数据传给LCD。发现lcd花屏,我于是硬仿,发现外部sram的首地址数据变化外,以上的地址没有变,(怎么没有变,我在初始话的时候,将外部sram里的东西全部赋值为1)。检查一下DMA
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&DCMI->DR;     //外设地址为:DCMI->DR
  DMA_InitStructure.DMA_Memory0BaseAddr = DMA_Memory0BaseAddr;   //DMA 存储器0地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;   //外设到存储器模式
  DMA_InitStructure.DMA_BufferSize = 1;  //数据传输量
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
  DMA_InitStructure.DMA_MemoryInc = DMA_PeripheralInc_Enable ; //存储器增量模式
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//外设数据长度:32位
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;//存储器数据长度
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// 使用循环模式
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;//高优先级
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; //FIFO模式        
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;//使用全FIFO
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//外设突发单次传输
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//存储器突发单次传输
  DMA_Init(DMA2_Stream1, &DMA_InitStructure);//初始化DMA Stream
当中
   DMA_InitStructure.DMA_BufferSize = 1;  //数据传输量
  我怀疑是这句的问题,于是我改为:
   DMA_InitStructure.DMA_BufferSize = 60000;  //数据传输量
好家伙!什么也没有变,压根就写不进去
   我就重新配置DMA:
  DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)&DCMI->DR;//DMA外设地址
  DMA_InitStructure.DMA_Memory0BaseAddr = DMA_Memory0BaseAdd;//DMA 存储器0地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//存储器到外设模式
  DMA_InitStructure.DMA_BufferSize = 60000;//数据传输量
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//外设数据长度:32位
  DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Word;//存储器数据长度:32位
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等优先级
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
  DMA_Init(DMA_Streamx, &DMA_InitStructure);//初始化DMA Stream
将模式改为普通模式,FIFO失能,好了,可以只能存60000个数据,lcd中也只能看到一半的效果,
  心都要碎了!有什么方式可以让DMA把整个摄像头的数据传给外部sram中的吗,为什么DMA最多传65535个数据啊,可是我的摄像头有38W多的数据啊。
千万别跟我说换个像素低点的摄像头!stm32难道就这么的.......加了DCMI接口为何还不能指定了存数据吗?
各位大神,你们是怎么把完整的数据存起来的
沙发
mintspring| | 2016-3-22 23:52 | 只看该作者
应该是数据类型的问题吧,65535属于int类型,换成long int估计就行了。

使用特权

评论回复
板凳
mintspring| | 2016-3-22 23:58 | 只看该作者
是否为指针的范围受到类型的限制才造成的这种结构。

使用特权

评论回复
地板
ywlzh|  楼主 | 2016-3-23 09:17 | 只看该作者
mintspring 发表于 2016-3-22 23:52
应该是数据类型的问题吧,65535属于int类型,换成long int估计就行了。

是DMA一次最多能传的数据是65535

使用特权

评论回复
5
ywlzh|  楼主 | 2016-3-23 09:21 | 只看该作者
mintspring 发表于 2016-3-22 23:58
是否为指针的范围受到类型的限制才造成的这种结构。

我将指针赋值为0x68000000,没有问题,并且在DMA传送期间还能再往上加60000,在往上加应该没有问题(我猜测),但DMA的传送量却限制了,哎

使用特权

评论回复
6
xijiele| | 2016-3-23 09:34 | 只看该作者
看看DMA乒乓传输吧

使用特权

评论回复
7
ywlzh|  楼主 | 2016-3-23 09:38 | 只看该作者
xijiele 发表于 2016-3-23 09:34
看看DMA乒乓传输吧

有链接吗?发给我一下

使用特权

评论回复
8
ywlzh|  楼主 | 2016-3-23 09:57 | 只看该作者
xijiele 发表于 2016-3-23 09:34
看看DMA乒乓传输吧

刚才试了一下,DMA中断在响应的时候,DCMI的数据捕获就完了,导致我下一批要存的地方没有发生变化,DMA中断完了后,DCMI却不在触发DMA了,帧中断就来了,速度上达不到

使用特权

评论回复
9
xijiele| | 2016-3-23 10:27 | 只看该作者
ywlzh 发表于 2016-3-23 09:38
有链接吗?发给我一下
stmcu.org/module/forum/thread-583796-1-1.html

使用特权

评论回复
10
mintspring| | 2016-3-23 17:07 | 只看该作者
DMA默认的传输段长度应该就是个int类型。

使用特权

评论回复
11
Soraka| | 2016-3-23 20:40 | 只看该作者
不是数据类型的问题吗

使用特权

评论回复
12
xmshao| | 2016-3-23 22:15 | 只看该作者
DMA一次最多传输65535没错,图像数据这么多,使用循环模式是应该的。

你现在瓶颈应在速率上。 你的确可以考虑使用DMA双缓冲。

使用特权

评论回复
13
ywlzh|  楼主 | 2016-3-24 09:08 | 只看该作者
xmshao 发表于 2016-3-23 22:15
DMA一次最多传输65535没错,图像数据这么多,使用循环模式是应该的。

你现在瓶颈应在速率上。 你的确可以 ...

循环模式是满了就从头覆盖了,这不是我想要的,我还没有处理,数据就被覆盖了,使用双缓冲,速度也不行,恨不得有三个就好了

使用特权

评论回复
14
xmshao| | 2016-3-25 10:16 | 只看该作者
ywlzh 发表于 2016-3-24 09:08
循环模式是满了就从头覆盖了,这不是我想要的,我还没有处理,数据就被覆盖了,使用双缓冲,速度也不行, ...

呵呵 使用双缓冲会有所改善。 那个存储区是可以动态调整的,你真可以试试多开几个BUFFER。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:兴趣是开端,成就是积累的动力

15

主题

279

帖子

3

粉丝