7744|9

1234

帖子

4

TA的资源

纯净的硅(高级)

楼主
 

还是那个摄像头ov2640 [复制链接]

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接口为何还不能指定了存数据吗?
各位大神,你们是怎么把完整的数据存起来的
此帖出自stm32/stm8论坛

最新回复

你好,我想请教一下你的OV2640存到sdram然后再给显示屏  详情 回复 发表于 2016-12-10 15:37
点赞 关注
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 

回复
举报

1803

帖子

0

TA的资源

五彩晶圆(高级)

推荐
 
本帖最后由 Study_Stellaris 于 2016-3-23 13:58 编辑
ywlzh 发表于 2016-3-23 13:39
多次传送,DMA跟不上DCMI的速度,等DMA中断了后,将目标地址改了,发现DCMI已经捕获完了,不知道 ...

你可以参考一下这个:
链接已隐藏,如需查看请登录或者注册
不过他采用了 chibios ,没有用 DCMI 接口。

还有一点可以采用  double buffer模式, DMA开传输完成中断,中断中检测当前访问区块,然后更改另一区块内存基址.double buffer模式是不需要关闭DMA就可以重新配置非active区块的.
此帖出自stm32/stm8论坛

点评

我想用cpld来做ov和sram之间的存储,不知道github有否类似的参考,非常感谢! 现在关于这个框架一片浆糊中,谢谢指点,不胜感激!  详情 回复 发表于 2016-5-29 06:20
好的 谢谢,关于double buffer,我也试了一下,我恨不得有三个缓存区,LCD上还差1/3的地方没有数据,我试了下在DMA做另一块传送的时候,让CPU去处理上一块的数据,可是,哎,cpu还在处理呢,DMA就赶超过来了,导致lc  详情 回复 发表于 2016-3-23 14:49
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

沙发
 
这个应该的由于DMA的缓冲大小决定的。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 
STM32 DMA 最多支持 65536 个数据,这是手册上就有的。所以一帧的数据通过一次 DMA 传输不了,只能想办法通过多次传输。
此帖出自stm32/stm8论坛

点评

多次传送,DMA跟不上DCMI的速度,等DMA中断了后,将目标地址改了,发现DCMI已经捕获完了,不知道有什么方式可以,我刚采取了用FIFO的方式,竟然是循环的覆盖的,地址却没有增加  详情 回复 发表于 2016-3-23 13:39
 
 
 

回复

1234

帖子

4

TA的资源

纯净的硅(高级)

4
 
Study_Stellaris 发表于 2016-3-23 10:47
STM32 DMA 最多支持 65536 个数据,这是手册上就有的。所以一帧的数据通过一次 DMA 传输不了,只能想办法通 ...

多次传送,DMA跟不上DCMI的速度,等DMA中断了后,将目标地址改了,发现DCMI已经捕获完了,不知道有什么方式可以,我刚采取了用FIFO的方式,竟然是循环的覆盖的,地址却没有增加
此帖出自stm32/stm8论坛

点评

你可以参考一下这个: https://github.com/iqyx/ov2640-stm32  详情 回复 发表于 2016-3-23 13:45
 
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 
 

回复

1234

帖子

4

TA的资源

纯净的硅(高级)

6
 
Study_Stellaris 发表于 2016-3-23 13:45
你可以参考一下这个:
https://github.com/iqyx/ov2640-stm32不过他采用了 chibios ,没有用 DCMI 接口 ...

好的 谢谢,关于double buffer,我也试了一下,我恨不得有三个缓存区,LCD上还差1/3的地方没有数据,我试了下在DMA做另一块传送的时候,让CPU去处理上一块的数据,可是,哎,cpu还在处理呢,DMA就赶超过来了,导致lcd出现了两块大“碎屏”
此帖出自stm32/stm8论坛
 
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 
 

回复

1706

帖子

4

TA的资源

纯净的硅(初级)

7
 
还是玩0V3640或者ov5640
此帖出自stm32/stm8论坛

点评

朋友是使用什么驱动OV?我想用cpld或者fpga来驱动,我想尽量提高fps,愿多多交流! 谢谢!  详情 回复 发表于 2016-5-29 06:31
 
 
 

回复

423

帖子

0

TA的资源

一粒金砂(高级)

8
 
Study_Stellaris 发表于 2016-3-23 13:45
你可以参考一下这个:
https://github.com/iqyx/ov2640-stm32不过他采用了 chibios ,没有用 DCMI 接口 ...

我想用cpld来做ov和sram之间的存储,不知道github有否类似的参考,非常感谢!

现在关于这个框架一片浆糊中,谢谢指点,不胜感激!
此帖出自stm32/stm8论坛
 
 
 

回复

423

帖子

0

TA的资源

一粒金砂(高级)

9
 
DavidZH 发表于 2016-3-24 09:10
还是玩0V3640或者ov5640



朋友是使用什么驱动OV?我想用cpld或者fpga来驱动,我想尽量提高fps,愿多多交流!
谢谢!
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
你好,我想请教一下你的OV2640存到sdram然后再给显示屏
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表