OpenEdv-开源电子网

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

DMA怎么防止旧数据被新的覆盖??

[复制链接]

21

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2017-7-19
在线时间
89 小时
发表于 2018-7-30 22:16:53 | 显示全部楼层 |阅读模式
2金钱
定时器触发ADC,用DMA来传输,采样频率比较高40KHz,一次传输的数据有几百个。DMA传输完成的中断来后我马上用memcpy拷贝到缓存数组里,但对比两边的数据发现都不一样(这是Debug里用断点运行一次的结果)
能不能手动触发DMA传输?等拷贝完数据后再启用DMA??
另外,DMA是等ADC完成转换后再传输这个新数据,还是未转换完也继续传输(这样可能会传相同的数据)。


11111111111111111111.png

[mw_shl_code=c,true]DMA_initstructure.DMA_PeripheralBaseAddr = (u32)ADC1_DR_ADDR;//ADC1的DR寄存器地址为外设基地址
        DMA_initstructure.DMA_MemoryBaseAddr = (u32)adc_dat;        //数组首地址为内存基地址
        DMA_initstructure.DMA_DIR = DMA_DIR_PeripheralSRC;        //外设传进内存
        DMA_initstructure.DMA_BufferSize = N;
        DMA_initstructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不递增
        DMA_initstructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                //内存地址递增
        DMA_initstructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//ADC传数据是12位,按半字(16bit)处理
        DMA_initstructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //传来的数据也按半字来存
        DMA_initstructure.DMA_Mode = DMA_Mode_Circular;                //进行循环传输,当传输完规定数量的数据后,BufferSize重置,MemoryBaseAddr变回数组首地址
        DMA_initstructure.DMA_Priority = DMA_Priority_High;//优先级高
        DMA_initstructure.DMA_M2M = DMA_M2M_Disable;        //不进行内存到内存传输
       
        DMA_Init(DMA1_Channel1,&DMA_initstructure);        //ADC1是通道1的
       
        DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);//设置DMA1通道1的传输完成中断
        DMA_ClearFlag(DMA1_FLAG_TC1);                //清除一下中断标志
        DMA_ClearITPendingBit(DMA1_IT_TC1);[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

可以啊,DMA设置成单次转换模式,不设置循环模式。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-7-30 22:16:54 | 显示全部楼层
可以啊,DMA设置成单次转换模式,不设置循环模式。
回复

使用道具 举报

21

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2017-7-19
在线时间
89 小时
 楼主| 发表于 2018-7-31 14:10:34 | 显示全部楼层
正点原子 发表于 2018-7-30 22:16
可以啊,DMA设置成单次转换模式,不设置循环模式。

嗯,又详细研究了一下,重新设置传输长度就能重启了。另外DMA传数据也是要等请求来了才传的是吧。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 21:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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