你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 DCMI DMA 640*480

[复制链接]
风铃草2 提问时间:2014-12-17 15:51 /
烦恼啊 !
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的分辨率的相机的大师 给个代码让我瞧瞧是用了什么办法
收藏 评论10 发布时间:2014-12-17 15:51

举报

10个回答
奔跑小蜗牛 最优答案 回答时间:2014-12-18 15:10:34
      用DCMI_CaptureMode_SnapShot方式,当DCMI需要DMA传输640*480*2个字节,假设DMA的传输DMA_BufferSize=640个字节,那么DMA2_Stream1_IRQHandler 里的  DMA_IT_TCIF1中断就会发生480*2次。 也就是说DMA会按照DMA_BufferSize的大小把DCMI的数据全部传输完成,就是循环的覆盖DMA_Memory0BaseAddr里的数据。将DMA的目标地址直接设置为你的外部SRAM地址,然后设置摄像头的DMA传输长度为1,在DMA2_Stream1_IRQHandler 中断里及时把数据copy出去。
奔跑小蜗牛 最优答案 回答时间:2014-12-18 16:50:57
本帖最后由 奔跑小蜗牛 于 2014-12-18 16:59 编辑

你当然不能一股脑的把数据往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.
风铃草2 回答时间:2014-12-17 17:16:31
怎么没人回答呢  我的思路是 在DMA里面重新设置DMA缓冲区地址,共设置了4个缓冲区,中断一次传输320*240*2个字节,并变换缓冲区。这样,中断4次 ,640*480的数据就被全部接受了
wambob 回答时间:2014-12-17 22:09:56
风铃草2 发表于 2014-12-17 17:16
怎么没人回答呢  我的思路是 在DMA里面重新设置DMA缓冲区地址,共设置了4个缓冲区,中断一次传输320*240*2 ...

思路不错啊,程序呢
wambob 回答时间:2014-12-17 22:13:20
试试DMA  double buffer
wenyangzeng 回答时间:2014-12-18 07:41:10
你完全可以建立多个缓冲区,DMA满了转移数据就是
风铃草2 回答时间:2014-12-18 10:40:33
wambob 发表于 2014-12-17 22:09
思路不错啊,程序呢

就是程序没调成功 苦恼着
风铃草2 回答时间:2014-12-18 16:20:58
奔跑小蜗牛 发表于 2014-12-18 15:10
用DCMI_CaptureMode_SnapShot方式,当DCMI需要DMA传输640*480*2个字节,假设DMA的传输DMA_BufferSize ...

我好像在哪里看到过你写的帖子,我用DMA 中断四次 果然不行 传输出来不是同一帧的 。。。。我有几个问题: 1. 中断次数不需要设定,设置好DMA_Buffersize它就会中断480*2次。
2. 摄像头的DMA传输长度,也是指DMA_Buffersize吧?
3. DMA_Buffersize我如果不设置为1,我设置一次传320*240*2,那么会不会因为中断程序时间长了,导致DMA数据丢失
风铃草2 回答时间:2014-12-18 16:33:03
唉,尼玛,突然觉得512的SRAM不够用了
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版