5回答

0收藏

[STM32]双bufferDMA切换调试

#开源分享 #开源分享 3050 人阅读 | 5 人回复 | 2014-05-26

本帖最后由 YoHo. 于 2014-5-26 22:01 编辑

双BUFFER DMA缓冲是经常用的数据缓冲方式
楼主在WAV播放器和ADC虚拟示波器中都使用过
但是WAV的效果一直有一点小瑕疵 猜测是在双buffer切换的时候开关DMA导致WAV播放出来有杂音
buffer设定比较小的 像只能播放10ms的时候 100hz的杂音听起来比较明显 当buffer比较大的时候 能连续播放0.1ms 10hz的杂音基本听不到 但是占用的内存十分大 单声道16位采样率 44100hz的WAV 双buffer要16K的内存 这十分的浪费

今天在调试的ADC虚拟示波器的时候 因为要加入新的功能差分采样 和原来单通道采样用的同一个buffer 但是数据由16位上升到32位 DMA数据长度变成了原来的1/2 楼主又不想多一个全局变量 就想试试其他的方法
然后看数据手册的时候发现了这个

数据长度有明确的表明在DMA使能的时候不能进行配置
而下面的地址都没有提及
所以就产生了一种想法 DMA配置为循环模式 在DMA完成中断中不进行DMA开关 直接修改数据目的地址到下一个buffer
经过试验之后发现这个想法可行 但是有一点要注意 要保证在完成中断开始后立刻修改
让下个DMA循环的第一次触发正确的传到另一个buffer(当然你也可以尝试一下 我没有尝试过 但是想一下结果应该是会把数据又重写到第一个buffer的开头)

其他的双bufferDMA已经都改为这种模式 WAV播放器的缓存也缩小了 但是还没经过实验
实验结果和源码明天放上来
分享到:
回复

使用道具 举报

回答|共 5 个

倒序浏览

沙发

newbobde163

发表于 2014-5-26 22:40:53 | 只看该作者

顶一下,顺便学习   
板凳

laoliang-67665

发表于 2014-5-26 23:07:39 | 只看该作者

顶,很给力的研究!
一点小的建议:DAM在半满的时候也可以中断,这样不存在切换缓冲区,且中断时如果发信号量给任务去处理是不是会好。
期待代码!
嵌入式,ucos,FPGA系统书籍作者
地板

feel-123

发表于 2014-5-27 05:56:05 | 只看该作者

谢谢楼主分享!
5#

fj1161

发表于 2014-5-27 08:25:48 | 只看该作者

顶一个~~~~~~~~~~~
第五年了,这次一定要坚持到底,不留遗憾!!!
6#

ballack_linux

发表于 2014-5-27 13:00:44 | 只看该作者

说的有理  赞一个
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条