stm32f4 DMA往外部sram存数据

2019-07-20 22:45发布

遇到一个大的问题,我原本想要将DCMI接口获得的数据用DMA直接存入到外部SRAM中去,配置如下:
RCC->AHB1ENR|=1<<22;        //DMA2时钟使能  
while(DMA2_Stream1->CR&0X01);//等待DMA2_Stream1可配置  
DMA2->LIFCR|=0X3D<<6*1;        //清空通道1上所有中断标志
DMA2_Stream1->FCR=0X0000021;//设置为默认值       

DMA2_Stream1->AR=(u32)&DCMI->DR;        //外设地址为CMI->DR
DMA2_Stream1->M0AR=(u32)pptr;//u32 *pptr;pptr=(u32*)0x68000000;
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|=1<<10;        //存储器增量模式
DMA2_Stream1->CR|=2<<11;        //外设数据长度:32位
DMA2_Stream1->CR|=2<<13;        //存储器数据长度:32位
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  
这是在别的帖子里复制的,正和我意(原以为)。却发现啥也没有做啊DMA,
于是我改成了
   /* 配置 DMA Stream */
  DMA_InitStructure.DMA_Channel = DMA_Channel_1;  //通道选择
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&DCMI->DR;//DMA外设地址
  DMA_InitStructure.DMA_Memory0BaseAddr = (u32)pptr;//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

这下可以存了,但最多能存65535个数据,可以DCMI 一帧就得30万的数据啊,我又不能全部丢掉,怎么办啊!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
hhlh2l
1楼-- · 2019-07-21 02:35
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular  使用循环模式试试看
xuande
2楼-- · 2019-07-21 08:32
本帖最后由 xuande 于 2016-3-23 11:03 编辑


立刻启动第二次、第三次。。。。



ywlzh
3楼-- · 2019-07-21 11:19
hhlh2l 发表于 2016-3-23 11:00
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular  使用循环模式试试看

使用循环模式,是循环的覆盖我原先存的数据,地址超过了就从头开始的。
ywlzh
4楼-- · 2019-07-21 13:20
 精彩回答 2  元偷偷看……
xiaok1051
5楼-- · 2019-07-21 19:10
ywlzh
6楼-- · 2019-07-21 21:16
ywlzh 发表于 2016-3-23 13:46
pptr=pptr+0xEA60;               
        DMA_InitStructure.DMA_Memory0BaseAddr = (u32)pptr;
        D ...

为什么你的可以 我的就不行,进了中断就,还没有反应过来,一帧就没了

一周热门 更多>