烦恼啊 ! DMA_InitStructure.DMA_BufferSize 最大才65536个数据项数目,做320*240的分辨率设置成: DMA_InitStructure.DMA_BufferSize = 320*240/2; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; 这样功能正常,正常摄像。但是想到改成640*480分辨率我就头大了 ,640*480/2 > 65536,设置不了这么大 如果我设置DCMI中断,再设置 DMA_InitStructure.DMA_BufferSize = 320*240/2; 这样就只能得到1/4的数据 再DCMI中断重设DMA ,结果DCMI是一帧中断的, 设的4个DMABUFF得到的不是同一帧数据,于是我换成DMA中断,更改如下: DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_NVIC_Config(); DMA_ITConfig(DMA2_Stream1,DMA_IT_TC,ENABLE); DMA_Cmd(DMA2_Stream1,ENABLE); //拷贝自神舟开发板例程 结果相机就没有数据输出 唉 !我的天 STM32F4 有没有弄出480*640的分辨率的相机的大师 给个代码让我瞧瞧是用了什么办法 |
你当然不能一股脑的把数据往SRAM里塞,塞的太多,时间超时,会造成DMA停止。
DMA传输长度就是指DMA_Buffersize
//DCMI DMA配置
void DCMI_DMA_Init(void)
{
RCC->AHB1ENR|=1<<22; //DMA2时钟使能
while(DMA2_Stream1->CR&0X01);//等待DMA2_Stream1可配置
DMA2->LIFCR|=0X3D<<6*1; //清空通道1上所有中断标志
DMA2_Stream1->FCR=0X0000021;//设置为默认值
DMA2_Stream1-> PAR=(u32)&DCMI->DR; //外设地址为: DCMI-> DR
DMA2_Stream1->M0AR=(u32)&(LCD->LCD_RAM);//LCD_RAM 作为目标地址
DMA2_Stream1->NDTR=1; //传输长度为1
DMA2_Stream1->CR=0; //先全部复位CR寄存器值
DMA2_Stream1->CR|=0<<6; //外设到存储器模式
DMA2_Stream1->CR|=1<<8; //循环模式
DMA2_Stream1->CR|=0<<9; //外设非增量模式
DMA2_Stream1->CR|=0<<10; //存储器非增量模式
DMA2_Stream1->CR|=2<<11; //外设数据长度:32位
DMA2_Stream1->CR|=1<<13; //存储器数据长度:16位
DMA2_Stream1->CR|=2<<16; //高优先级
DMA2_Stream1->CR|=0<<21; //外设突发单次传输
DMA2_Stream1->CR|=0<<23; //存储器突发单次传输
DMA2_Stream1->CR|=1<<25; //通道1 DCMI通道
DMA2_Stream1->FCR|=1<<2; //FIFO模式
DMA2_Stream1->FCR|=3<<0; //是用全FIFO
}
把上面的LCD->LCD_RAM改为你的:外部SRAM存放摄像头数据的首地址,SRAM你设置为地址自增,然后传输完一帧要中断,重新设置传输量。 中断你可以采用DCMI的帧中断,到里面再次去设置DMA。这里DMA仅仅负责搬运,不停的将DCMI->DR的数据,搬运到目标地址,一次搬运长度是1.
思路不错啊,程序呢
就是程序没调成功 苦恼着
我好像在哪里看到过你写的帖子,我用DMA 中断四次 果然不行 传输出来不是同一帧的 。。。。我有几个问题: 1. 中断次数不需要设定,设置好DMA_Buffersize它就会中断480*2次。
2. 摄像头的DMA传输长度,也是指DMA_Buffersize吧?
3. DMA_Buffersize我如果不设置为1,我设置一次传320*240*2,那么会不会因为中断程序时间长了,导致DMA数据丢失
蜗牛哥,谢谢你的回复,但是我需要做拍照处理,还要将摄像头输出数据旋转,所以不会直接送到LCD 。