还是那个摄像头ov2640

2019-03-23 17:54发布

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接口为何还不能指定了存数据吗?
各位大神,你们是怎么把完整的数据存起来的
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
Study_Stellaris
1楼-- · 2019-03-23 23:35
/ 本帖最后由 Study_Stellaris 于 2016-3-23 13:58 编辑
ywlzh 发表于 2016-3-23 13:39
多次传送,DMA跟不上DCMI的速度,等DMA中断了后,将目标地址改了,发现DCMI已经捕获完了,不知道 ...

你可以参考一下这个:
https://github.com/iqyx/ov2640-stm32不过他采用了 chibios ,没有用 DCMI 接口。

还有一点可以采用  double buffer模式, DMA开传输完成中断,中断中检测当前访问区块,然后更改另一区块内存基址.double buffer模式是不需要关闭DMA就可以重新配置非active区块的.
zhaojun_xf
2楼-- · 2019-03-24 04:27
 精彩回答 2  元偷偷看……
Study_Stellaris
3楼-- · 2019-03-24 06:44
STM32 DMA 最多支持 65536 个数据,这是手册上就有的。所以一帧的数据通过一次 DMA 传输不了,只能想办法通过多次传输。
ywlzh
4楼-- · 2019-03-24 07:38
Study_Stellaris 发表于 2016-3-23 10:47
STM32 DMA 最多支持 65536 个数据,这是手册上就有的。所以一帧的数据通过一次 DMA 传输不了,只能想办法通 ...

多次传送,DMA跟不上DCMI的速度,等DMA中断了后,将目标地址改了,发现DCMI已经捕获完了,不知道有什么方式可以,我刚采取了用FIFO的方式,竟然是循环的覆盖的,地址却没有增加
ywlzh
5楼-- · 2019-03-24 11:33
 精彩回答 2  元偷偷看……
DavidZH
6楼-- · 2019-03-24 11:50
还是玩0V3640或者ov5640

一周热门 更多>