智能车制作

标题: DMA到底是什么?为什么采集图像要用DMA [打印本页]

作者: chlhyj    时间: 2012-9-21 20:43
标题: DMA到底是什么?为什么采集图像要用DMA
DMA到底是什么?为什么采集图像要用DMA
作者: 回不去的2010    时间: 2012-9-21 21:15
这是我在论坛里面找到的有个哥们写的,对我写DMA和了解DMA用处比较大,你看看吧!

K60的内核是Cortex-M4,不得不说这个内核比M3有了很大的长进,特别是核心对dsp内核的支持。玩过STM32的朋友知道32上也有dsp库,但最大的缺点是M3内核模拟的,速度算不上快,但比一般自己写代码快很多。
      下面来讲一下怎么读取摄像头数据,这个是关键只有获得了有效的数据才能处理啊。我用的摄像头是OV7620,买来的时候基本是出厂设置。OV7620视频输出格式通过YCrCb格式,这里我们只用Y通道,里面输出的是灰度。
      摄像头输出通过VS(场同步信号)、HS(行同步信号)、PCLK(像素时钟同步信号),和Y0~Y7组成。用示波器观察PCLK的时间是74ns,也就是13.5M的速度(用杜邦线小心,摄像头架的很高,线很长衰减很厉害)。这里我采用了中断和DMA相结合(有DMA这么好的资源干嘛不用呢),没接触过的人可能不知道那时什么功能,其实很简单只要你给它设置好相应的参数,它就会不通过CPU直接将你的数据从外设和内存之间相互搬运,或者内存到内存的搬运,什么时候搬运你就要告诉他。在程序开始的时候我们设置两个中断(为了保证必要的速度最好设置在两个不同的中断号中),一个是VS中断,一个是HS中断,并且配置DMA(建立外设和内存的搬运过程,搬运次数,触发方式)触发采用PCLK,并且使能VS中断,失能掉HS和DMA中断。
      (1)当一帧图像开始传输时VS触发中断(这里不判断奇偶场),在中断中我们初始化一些行计数之类的变量,并且失能VS开启HS中断。
      (2)当VS之后的第一个HS的到来表示第一行触发HS中断,在此你就要判断这一行的数据你是否需要(如果我们把一幅图像的所有数据都读进来RAM不够吧)。之后没来一个HS触发一次中断判断这一行你是否需要,如果需要就使能DMA传输和中断。当判断行计数大于你要的行数后,失能HS,来一个标志位说明一帧图像已经接收完毕。
      (3)DMA中断中其实很简单,开启一次DMA的传输和中断后,摄像头每来一个PCLK就会搬运一次数据到指定的RAM中,当一次搬运完你所设置的搬运次数后进入DMA中断,在中断中你要及时的将RAM中的数据移走,防止被覆盖,这里需要注意一下为了尽可能的快速移走数据你要好好考虑下你要搬运的次数。
      (4)上面提到的那个标志位就要用在主函数中,当判断标志位被标志后,我们要开始进行处理,滤波、黑线的判断、十字路口、停车是必不可少的。
       滤波和黑线的判断我们可以使用自带的DSP内核来完成,关于cortex-M4中的dsp内核,可以登入arm的官网下载相关资料  http://www.onarm.com/cmsis/download/   里面的库提供很丰富的处理方法。

作者: zhangwenqiang    时间: 2012-9-22 18:26
谢谢
作者: chlhyj    时间: 2012-9-22 20:45
明白一些  谢谢
作者: 王帅    时间: 2012-9-23 17:56

作者: qes    时间: 2012-9-23 21:49

作者: を圣邪む    时间: 2012-9-24 16:29
http://www.znczz.com/forum.php?mod=viewthread&tid=101553原稿。。。。。。
作者: cxn5127111    时间: 2012-11-20 14:48
谢谢,虽然我是新手不是很明白,但我认为早晚都要用到的
作者: oscarpanpan    时间: 2013-3-15 18:21

作者: 二硫碘化钾    时间: 2013-3-16 13:55

作者: huyong9767    时间: 2013-3-24 21:34
总结的不错,顶一个
作者: 李姐姐44    时间: 2013-3-25 08:33
受益




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2