使用DMA仅从DCMI读取每秒字节

时间:2016-01-22 19:49:36

标签: c++ camera stm32 dma

我目前正在使用STM32F4发现板和OV7670相机。 使用Discovery Board上的DCMI和DMA,我设法获得了图片。

相机设置为YCbCr422模式(2个像素为4个字节),但最后我只从中提取Y字节以接收灰度/单色图像。

我的问题是: 由于发现板上的RAM有限,我只能设法以QCIF分辨率(176 x 144)获得图像。

Discovery Board有192K的SRAM,分配到3个块:112KB + 16KB + 64KB。 所以最大的contiguos块是112 KB。

我估算了不同摄像机分辨率的以下内存需求(以字节为单位):

  • QCIF 160x121: RAM使用: 4字节2像素:38720 - 仅灰度:19360

  • QVGA 320x240: RAM使用: 4字节2像素:153600 - 仅灰度:76800

  • VGA 640x480: RAM使用: 4字节2像素:614400 - 仅灰度:307200

所以VGA是不可能的。 当使用2个像素的4个字节时,只有QCIF适合第一个RAM块。但是,如果只能使用灰度字节,那么QVGA也适合!

我没有找到相机仅输出灰度图像的模式。所以我需要找到另一种方法(如果可能的话)。

因此DCMI总是读取4个字节,对应于YUV值:Y0,Cb,Y1,Cr

DMA将那些存储在我的内存中,并在每一步后递增。我只需要DCMI的每秒字节,所以有没有办法告诉DMA只读取每隔一个字节? 这将解决我的问题。但我不知道该怎么做。

还有其他办法吗? 非常欢迎任何建议!

亲切的问候

2 个答案:

答案 0 :(得分:1)

@robo对于8位接口,我不认为你会指出单个DMA。

Set your HDMI DMA to bring data into a short buffer (say 1K)
Set interrupts for half and full buffer
Use mem->mem DMA to transfer alternate bytes to your final buffer
m->m is set to word in, byte out

可能更好的是在它到达你的CPU之前摆脱不必要的数据

 Run 2 shift registers (SRa and SRb) connected by 8 bits in parallel
 SRa  is a SIPO  SRB is a PISO (SIPO = Serial in , Parallel out)
 Clock SRa at the incoming bitspeed
 Clock SRb at half the speed
 Latch the data from SRa to SRb once every 16 bit times
 SRb feeds the 8 bits you want to the DMA

所有这些都可以通过CPU上的定时器和GPIO进行管理。

通过对传输选通进行计时来选择哪个字节。

两个74xx595系列设备可以解决这个问题,只需检查速度等级。它的成本约为1美元。嵌入式中经常需要一些外部硬件,尽管这种情况每年都在减少并且要避免使用。

答案 1 :(得分:1)

使用DCMI的第一种方法

将圆形接收的DMA配置为4个字节。每个DMA TC irq将第二个字节从DMA缓冲区复制到其他大缓冲区。

没有DCMI的第二种方式

您可以通过VSYNC,HSYNC和HREF信号从数据端口接收接收字节,因此您可以通过PSC = 1的HREF信号触发定时器,并通过任何通道转换DMA的比较事件(必须配置为对应于第二个字节)接收一个字节。必须通过VSYNC信号使能定时器,以便比较匹配事件和字节顺序。

<强>结论

我更喜欢第二种方式,因为它对省电更有效。