搜索
bottom↓
回复: 13

分享STM32通过DAC来播放声音的实现原理

[复制链接]

出0入0汤圆

发表于 2021-4-8 11:24:27 | 显示全部楼层 |阅读模式
STM32通过DAC来播放声音的实现方式:

1 DAC设置
     首先选择TIM6触发DAC转换,为什么选择TIM6, 这也是有讲究的,首先TIM6、TIM7非常简单,也是可以说是简陋;ST文档中称作基本定时器,仅仅有一个16位自动重载功能,即使系统需要使用定时器也不会用这2位。 其次,TIM6\TIM7天生就与DAC绑定在一定,甚至连中断接口也是一个,TIM6_DAC_IRQHandler();(当然本项目不需要DAC\TIM6中断)。综上所述使用TIM6是明智的明智的选择。

   设置TIM6记数周期,使TIM6向DAC申请中断的频率与WAV文件的采样频率保持一致,一般为8K或者16K,(试验证明16b量化8K采样的声音,没有8bit量化16K采样的声音音质好,虽然它们占用的存储空间一样!),使能TIM6更新请求 update event。

   设置DAC,使能DAC1 通道DMA模式,12B左对齐, 选择定时器 6 TRGO 事件,等操作。

一切设置好之后,启动TIM6记数就可以启动DAC转换了。



2. DMA传输
    为了尽可能降低MCU的占用, 为将来增加复杂的解码方式留足CPU频率资源,所以采用DMA传输(如果采用中断方式,如果播放16K采样频率的声音时会频繁的进出中断导致效率下降);同时为了降低DAC转换时的总线占用,DMA传输时使用的RAM也经过了特殊安排,为尽可能避免总线冲突,DAC使用SRAM2空间作为DMA传输的源地址,在DMA传输期间,MCU内核照样可以访问主SRAM1,且互不干扰。  这样就实现了DMA传输即不占用CPU资源,也不占用CPU总线资源。效率提高到极致!如下图所示:(注:红线为DMA传输路径,绿线为MCU内核访问路径)(其实这种总线并行复用的思路可以应用到很多外设上)



3. 双缓冲或者循环缓冲
    要保证音频输出的连续性,必须使用双缓冲或者循环缓冲, 试验证明这2种方法都可以满足音频输出的要求,我认为DMA循环缓冲区只是DMA双缓冲区的一个特殊形式而已。(当双缓冲区2块数据相邻且大小一样时)

比如我在MDK中定义一个双缓冲区,在xxx.map文件中可以看到编译器给这2个数组分配的空间,

PCMDA_BUF0 : 0x2001c000        PCMDA_BUF1 : 0x2001d000



其实我完全可以定义一个大的缓冲区,来设计为循环缓冲区,比如

uint8_t PCMDA_BUF[I2S_DMA_RAMBUF_SIZE*2] __attribute__((section("SRAM2")));

其实编译器给这个数组分配的空间还是上面的空间,0x2001c000~ 0x2001dFFF;  (8KB)

    为了实时的更新缓冲区中的音频数据,根据缓冲区形式的不同,操作也不不一样,如果是双缓冲区时,做如下操作:当缓冲区1 DMA传输完成中断时,更新缓冲区1中的数据,当缓冲区2 DMA传输完成中断时,更新缓冲区2中的数据,这样就形成了一个乒乓缓冲操作,数据永远不会中断,音频会流畅的放出来。

    如果是循环缓冲区,STM32也提供有合适的操作,STM32提供的有DMA半传输完成中断,这个就非常有用了,当DMA半传输完成时,更新缓冲区前半部分的数据,当DMA全部传输完成发生中断时,更新缓冲区后一半的数据,这样也能实现双缓冲区的效果。

    其实仔细的分析上面2种方式, 其本质是一样,都能实现 DAC-OUTPUT的连续输出

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

发表于 2021-4-8 12:04:43 | 显示全部楼层
做MP3软解能不能行

出0入93汤圆

发表于 2021-4-8 12:15:53 | 显示全部楼层
收藏了,虽然现在买不到芯片

出0入42汤圆

发表于 2021-4-8 12:35:11 | 显示全部楼层
ztrx 发表于 2021-4-8 12:04
做MP3软解能不能行

CM3以上内核,48KB以上内存,CPU跑30MHz以上就可以了

出1310入193汤圆

发表于 2021-4-8 13:13:15 | 显示全部楼层
何不上个工程文件  咋们马上就可以下载下来测试 评测一番

出0入0汤圆

 楼主| 发表于 2021-4-8 13:15:58 | 显示全部楼层
lb0857 发表于 2021-4-8 13:13
何不上个工程文件  咋们马上就可以下载下来测试 评测一番

授人以鱼不如授人以渔

出100入101汤圆

发表于 2021-4-8 13:19:24 来自手机 | 显示全部楼层
和音频专用da效果有差别么?

出0入0汤圆

发表于 2021-4-8 15:44:50 | 显示全部楼层
蜂鸣器就是这么做的- - 不过没有使用DMA

出0入0汤圆

 楼主| 发表于 2021-4-8 15:59:22 | 显示全部楼层
fengyunyu 发表于 2021-4-8 13:19
和音频专用da效果有差别么?

大部分工业场合都可以满足吧

出0入85汤圆

发表于 2021-4-8 16:48:01 | 显示全部楼层
没明白如何保证播放频率
DMA、Tim6、SRAM、DAC如何关联起来,需要中断吗?

出0入59汤圆

发表于 2021-4-8 17:04:30 | 显示全部楼层
以前48MHZ 的ARM7 都能实现MP3 软件解码

出870入263汤圆

发表于 2021-4-8 19:10:49 | 显示全部楼层
ztrx 发表于 2021-4-8 12:04
做MP3软解能不能行

楼主这是STM32F4XX,这个级别软解MP3轻松得很。

出870入263汤圆

发表于 2021-4-8 19:13:26 | 显示全部楼层
网络孤客 发表于 2021-4-8 16:48
没明白如何保证播放频率
DMA、Tim6、SRAM、DAC如何关联起来,需要中断吗?

播放频率通过TIM6设定,应用代码只要在DMA半传输和完整传输中断里填充DAC数据即可吧。

出0入0汤圆

发表于 2022-11-18 03:33:35 | 显示全部楼层
Mark了,有时间看看怎么做
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 07:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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