请教-STM32F407+OV7670+DCMI+DMA 保存VGA(640*480) YUV的一帧图像到SRAM(外扩),我遇到的问题

2019-07-20 06:00发布

如题:我现在用STM32F407+OV7670+DCMI+DMA 要保存VGA(640*480) YUV的一帧图像到SRAM(外扩2M)。 我遇到的问题: 1.DMA传输的 DMA_BufferSize 最大65536个单位(65536*4 < 640*480*2),所以不能像320*240那样一次性就能保存到外扩的SRAM里 2.DCMI为了方便测试我用了DCMI_CaptureMode_SnapShot方式 3.我测试发现,当DCMI需要DMA传输640*480*2个字节,假设DMA的传输DMA_BufferSize=640个字节,那么DMA2_Stream1_IRQHandler 里的  DMA_IT_TCIF1中断就会发生480*2次。 也就是说DMA会按照DMA_BufferSize的大小把DCMI的数据全部传输完成,就是循环的覆盖DMA_Memory0BaseAddr里的数据,我想利用这点,在DMA2_Stream1_IRQHandler 中断里及时把数据copy出去   4.我采用DMA_BufferSize=320,(实际每次DMA传输数据时320*4字节),这正好是一行像素的数据,但是在DMA2_Stream1_IRQHandler 里的DMA_IT_TCIF1中断里    读取这一行的数据时出错,经过我测试后发现:在中断里使用 memcpy函数把320*4=1280字节由DMA缓存区(DMA_Memory0BaseAddr )复制到其他SRAM  数据区时引起中断函数占用超时,使DMA停止工作。之所得到这个结论是因为我用memcpy复制数据量很少时,比如100个字节,这是DMA_IT_TCIF1的中断就能持续进行(当然数据没有读完整100<1280).   5.现在怎么把DMA的数据及时的copy出来这就是问题。   6.我发现设置DCMI_ITConfig(DCMI_IT_LINE, ENABLE);时,即使采用DCMI_CaptureMode_SnapShot方式,当一帧图像都传输完成时,DCMI_IRQHandler里仍然持续有DCMI_IT_LINE   中断发生,这是这么回事?但是DCMI_IT_FRAME信号就一次(前提是开启了这个中断)。 7.我觉得DCMI的DCMI_IT_LINE中断和DMA没有关系,各是各的。DMA只是把数据都传输出来而已。 8.有人说DMA用双缓冲,这个好像很难哦,还有说在DCMI_IT_LINE中断里copy DMA的buffer,我没测试成功
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
33条回答
正点原子
1楼-- · 2019-07-22 08:58
 精彩回答 2  元偷偷看……
zacharywang
2楼-- · 2019-07-22 10:14
楼主你好。
我现在再用STM32F407接收OV7670的数据。用的是DCMI接口,基本和楼主一样,只是我没有用SRAM,而是程序中一行一行的接收然后立刻处理,不用把整帧的图像存起来。现在用串口打印DCMI->DR是正常的,有有效数据,说明DCMI已经正常工作。DMA我设置的是把数据从DCMI->DR传输到一个数组uint32_t Line_Data[320]中,现在用串口打印Line_Data,发现输出数据全是0. 断点调试时发现DMA2_Stream1_IRQHandler这个中断函数只能进去一次,之后就再也进不去了。在DMA2_Stream1_IRQHandler中,我已经清除了中断标位:DMA_ClearITPendingBit(DMA2_Stream1,DMA_IT_TCIF1); 。

不知道这是什么原因?是否是我的DMA配置错误?

另外我也使用了DCMI的行中断和帧中断,是否如楼主所说,DCMI的中断和DMA 的中断是互相独立的?
zacharywang
3楼-- · 2019-07-22 14:45
回复【20楼】zacharywang:
---------------------------------
盼望原子哥如果看到了的话也能给予解答。
马小跳life
4楼-- · 2019-07-22 19:54
 精彩回答 2  元偷偷看……
luyongyun
5楼-- · 2019-07-22 20:09
 精彩回答 2  元偷偷看……
vcding
6楼-- · 2019-07-22 21:34
正点原子 发表于 2015-3-14 22:51
回复【18楼】bufans:
---------------------------------
修改DMA的地址寄存器

原子哥给个DCMI->DMA->SRAM->LCD的扩展实验吧

一周热门 更多>