DCMI的DMA函数DMA_SetCurrDataCounter

2019-07-21 01:25发布

参考探索者板子上的摄像头试验做的修改

外挂了一个和探索者板子同型号的1M字节的外部SRAM
将摄像头的数据开在外部SRAM中

问题出在jpeg_buf_size上

#define jpeg_buf_size 31*1024   
__align(4) u32 jpeg_buf[jpeg_buf_size];

我为了输出640*480的RGB565图片将这里的jpeg_buf_size修改为160*1024
这样就导致了程序中调用这个函数
DMA_SetCurrDataCounter(DMA2_Stream1,jpeg_buf_size )
时出现了整形转换的警告

这是因为
void DMA_SetCurrDataCounter(DMA_Stream_TypeDef* DMAy_Streamx, uint16_t Counter)
第二个参数Counter是16位的,这样就使得jpeg_buf_size 要小于65535

我尝试将Counter这个参数修改为32位的,但不能正常传输,估计这个参数和DMA的底层机制有关联。

请教大家我要怎么处理这种情况?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
tuzihog
2019-07-21 17:23
回复【6楼】正点原子:
---------------------------------
参考你在这个帖子中的回复,http://www.openedv.com/posts/list/29064.htm

这里DMA仅仅负责搬运。 
不停的将DCMI->DR的数据,搬运到目标地址,一次搬运长度是1. 
如果你用外部SRAM,确实应该用目标地址自增,这个忘记了。。。 
LCD是可以自己地址自增的。。。SRAM得你设置地址自增才行。 
然后传输完一帧要中断,重新设置传输量。 
中断你可以采用DCMI的帧中断,到里面再次去设置DMA。

DCMI的帧中断里面怎么设置DMA?
DMA2_Stream1->M0AR = (u32)&YUV422_buf_CAM;
这样可以?YUV422_buf_CAM是开在外部SRAM的数组。

一周热门 更多>