我目前正在使用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只读取每隔一个字节? 这将解决我的问题。但我不知道该怎么做。
还有其他办法吗? 非常欢迎任何建议!
亲切的问候
答案 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信号使能定时器,以便比较匹配事件和字节顺序。
<强>结论强>
我更喜欢第二种方式,因为它对省电更有效。