stm32f407 + OV2640 + 外部1M的sram
实验目的:
用stm32将ov2640里没有个像素点的数据(32位)存入到外部sram中
实验过程:
为了从sram中看到数据是否正确,我加了一块LCD(调试没有问题),ov2640用的是DCMI接口,采用DMA的方式,将摄像头的数据直接给LCD,用的RGB565模式,显示无误,但这样下来,我只知道数据就这样传着,却不知道数据“长啥样”,于是我加入外部sram(单一调试无误),为了看数据是否正确,我做了这几步:1,用DMA将摄像头的数据传给外部sram,当DCMI帧中断来的时候,我于是停止DMA传送,停止DCMI,2,将外部sram中的数据传给LCD。发现lcd花屏,我于是硬仿,发现外部sram的首地址数据变化外,以上的地址没有变,(怎么没有变,我在初始话的时候,将外部sram里的东西全部赋值为1)。检查一下DMA
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&DCMI->DR; //外设地址为D
CMI->DR
DMA_InitStructure.DMA_Memory0BaseAddr = DMA_Memory0BaseAddr; //DMA 存储器0地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; //外设到存储器模式
DMA_InitStructure.DMA_BufferSize = 1; //数据传输量
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
DMA_InitStructure.DMA_MemoryInc = DMA_PeripheralInc_Enable ; //存储器增量模式
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//外设数据长度:32位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;//存储器数据长度
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// 使用循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//高优先级
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; //FIFO模式
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;//使用全FIFO
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//外设突发单次传输
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//存储器突发单次传输
DMA_Init(DMA2_Stream1, &DMA_InitStructure);//初始化DMA Stream
当中
DMA_InitStructure.DMA_BufferSize = 1; //数据传输量
我怀疑是这句的问题,于是我改为:
DMA_InitStructure.DMA_BufferSize = 60000; //数据传输量
好家伙!什么也没有变,压根就写不进去
我就重新配置DMA:
DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)&DCMI->DR;//DMA外设地址
DMA_InitStructure.DMA_Memory0BaseAddr = DMA_Memory0BaseAdd;//DMA 存储器0地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//存储器到外设模式
DMA_InitStructure.DMA_BufferSize = 60000;//数据传输量
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//外设数据长度:32位
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Word;//存储器数据长度:32位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等优先级
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
DMA_Init(DMA_Streamx, &DMA_InitStructure);//初始化DMA Stream
将模式改为普通模式,FIFO失能,好了,可以只能存60000个数据,lcd中也只能看到一半的效果,
心都要碎了!有什么方式可以让DMA把整个摄像头的数据传给外部sram中的吗,为什么DMA最多传65535个数据啊,可是我的摄像头有38W多的数据啊。
千万别跟我说换个像素低点的摄像头!stm32难道就这么的.......加了DCMI接口为何还不能指定了存数据吗?
各位大神,你们是怎么把完整的数据存起来的
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
你可以参考一下这个:
https://github.com/iqyx/ov2640-stm32不过他采用了 chibios ,没有用 DCMI 接口。
还有一点可以采用 double buffer模式, DMA开传输完成中断,中断中检测当前访问区块,然后更改另一区块内存基址.double buffer模式是不需要关闭DMA就可以重新配置非active区块的.
多次传送,DMA跟不上DCMI的速度,等DMA中断了后,将目标地址改了,发现DCMI已经捕获完了,不知道有什么方式可以,我刚采取了用FIFO的方式,竟然是循环的覆盖的,地址却没有增加
一周热门 更多>