OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6310|回复: 6

stm32f4 DMA往外部sram存数据

[复制链接]

4

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2016-1-14
在线时间
42 小时
发表于 2016-3-23 10:43:16 | 显示全部楼层 |阅读模式
10金钱
遇到一个大的问题,我原本想要将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万的数据啊,我又不能全部丢掉,怎么办啊!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2014-12-29
在线时间
36 小时
发表于 2016-3-23 11:00:04 | 显示全部楼层
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular  使用循环模式试试看
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11475
金钱
11475
注册时间
2014-4-1
在线时间
1297 小时
发表于 2016-3-23 11:01:20 | 显示全部楼层
本帖最后由 xuande 于 2016-3-23 11:03 编辑


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



回复

使用道具 举报

4

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2016-1-14
在线时间
42 小时
 楼主| 发表于 2016-3-23 13:45:05 | 显示全部楼层
hhlh2l 发表于 2016-3-23 11:00
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular  使用循环模式试试看

使用循环模式,是循环的覆盖我原先存的数据,地址超过了就从头开始的。
回复

使用道具 举报

4

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2016-1-14
在线时间
42 小时
 楼主| 发表于 2016-3-23 13:46:46 | 显示全部楼层
xuande 发表于 2016-3-23 11:01
立刻启动第二次、第三次。。。。

        pptr=pptr+0xEA60;               
        DMA_InitStructure.DMA_Memory0BaseAddr = (u32)pptr;
        DMA_Init(DMA2_Stream1, &DMA_InitStructure);//初始化DMA Stream                       
我在中断中做了这个操作,可是DCMI却获取完了,
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-4-16
在线时间
3 小时
发表于 2016-4-19 20:15:02 | 显示全部楼层
回复

使用道具 举报

4

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2016-1-14
在线时间
42 小时
 楼主| 发表于 2016-4-20 09:03:35 | 显示全部楼层
ywlzh 发表于 2016-3-23 13:46
pptr=pptr+0xEA60;               
        DMA_InitStructure.DMA_Memory0BaseAddr = (u32)pptr;
        D ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 23:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表