耳机网-耳机大家坛

标题: 最近做的一款STM32F4板子,软解MP3/FLAC/APE/WAV等,最高支持192K 24位音频播放 [打印本页]

作者: 正点原子    时间: 2014-11-9 17:29
标题: 最近做的一款STM32F4板子,软解MP3/FLAC/APE/WAV等,最高支持192K 24位音频播放
   花了近一年时间,设计的一款F4开发板,主芯片使用STM32F407芯片,软解码MP3/FLAC/APE/WAV等音频文件,IIS输出后,WM8978进行D/A转换,效果还不错,音质比VS1053好一些。
音乐播放器功能简介:
1,支持WAV/FLAC/APE/MP3等4种格式。
2,WAV最高支持192K,24bit音频播放
3,MP3全码率支持
4,APE最高支持96K,16bit播放
5,FLAC最高支持192K,16bit播放
6,支持歌词显示,前后三行预览,中间一行为正在播放的歌词。
7,支持拖动定位播放位置(ape支持,其他都支持)



   实物图(带4.3寸电容屏):

  主界面图片(来自屏幕截图):

  音乐播放中(来自屏幕截图):




作者: zhangdu    时间: 2014-11-9 18:28
原子前辈的例程写的很犀利,我搞了好久的I2S都没有搞定,看了你的教程,昨天ok了,现在已经能够出声了,接下来就是搞文件系统了,没有买你的开发板,但是还是借用了你的技术资料,惭愧不已,感激不尽!!
不过我还是遇到一点点问题,就是I2S的DMA传输,输出用示波器看,在两个buf切换的时候,会丢失一个字节 [s:5]
作者: 正点原子    时间: 2014-11-9 19:03
引用第1楼zhangdu于2014-11-09 18:28发表的 :
原子前辈的例程写的很犀利,我搞了好久的I2S都没有搞定,看了你的教程,昨天ok了,现在已经能够出声了,接下来就是搞文件系统了,没有买你的开发板,但是还是借用了你的技术资料,惭愧不已,感激不尽!!
不过我还是遇到一点点问题,就是I2S的DMA传输,输出用示波器看,在两个buf切换的时候,会丢失一个字节 [s:5]
会丢失一个字节??
这个我倒是没有去看过哦,应该不会丢失才对,如果丢失,24bit播放的时候,就完全乱套了。
作者: zhangdu    时间: 2014-11-9 20:10
我也不是很清楚,一开始,我是定义了两个buf,I2S_BUF0和I2S_BUF1,然后在里面都附上初值,1.2.3.4.5.6.........然后让DMA传输给I2S外设,监看输出波形,结果是,1 0  3 2  5 4   7 6  ...............这样,那个0就是在DMA切换buf的时候,插进来的,就好像是从BUF数组前面一个地址开始传输的,我又试过了让DMA指向的地址为 I2S_BUF0[1]和 I2S_BUF1[1],同时从这里开始附初值,还是一样的结果,但是指向数组的第二个元素的时候,貌似就好了;
不过在连接上SD读取的音频数据时,又不行了,把buf按照你教程里说的做4字节对齐以后,再把dma指向buf的首地址,就可以正常播放出声,但是中间有没有丢失或者错位,就不知道了,因为数据不知,所以没有办法用示波器监看,靠耳朵听的话,反正我是没有听出爆音和断流的感觉;
就是觉得很奇怪,不知道你之前有没有遇到过
作者: 正点原子    时间: 2014-11-9 20:25
没有按你的这个方式测试过。
如果有单字节丢失,很容易听出来的,会出现噪音的。
之前调试24位wav播放的时候,很长一段时间都是噪音,后面整了2天才搞出来。
作者: zhangdu    时间: 2014-11-10 00:11
引用第4楼正点原子于2014-11-09 20:25发表的 :
没有按你的这个方式测试过。
如果有单字节丢失,很容易听出来的,会出现噪音的。
之前调试24位wav播放的时候,很长一段时间都是噪音,后面整了2天才搞出来。

我也是这么认为的,如果播放的时候没有听出明显的噪音,那么传输的时候应该就没有发生错位或者丢失,不然的话整个数据块错位了,应该送出来的都是错误的信息,甚至高低字节全都错位了,那么应该都是噪声才对。
你的教程真的写的很棒,再次感谢!说实话,你钻研很久搞出来的成果,我就这么直接的使用了,感觉很惭愧,不过我都是自己玩玩,不搞商用的说!
不知道后面出来的M7,你会不会出开发板,到时候一定搞一块学习,M4之前买了探索板了;
作者: 德律风根    时间: 2014-11-10 12:05
引用第5楼zhangdu于2014-11-10 00:11发表的 :


我也是这么认为的,如果播放的时候没有听出明显的噪音,那么传输的时候应该就没有发生错位或者丢失,不然的话整个数据块错位了,应该送出来的都是错误的信息,甚至高低字节全都错位了,那么应该都是噪声才对。
你的教程真的写的很棒,再次感谢!说实话,你钻研很久搞出来的成果,我就这么直接的使用了,感觉很惭愧,不过我都是自己玩玩,不搞商用的说!
不知道后面出来的M7,你会不会出开发板,到时候一定搞一块学习,M4之前买了探索板了;
看ID就知道,这是个卖开发板的。
作者: hyperma    时间: 2014-11-10 12:58
噢,楼上的,我就是时钟大师,你叫我爸爸,我给你个电路图和全套说明,告诉你为什么时钟系统根本不需要什么屌毛的TCXO。
快,叫爸爸。 [s:2]
作者: zhangdu    时间: 2014-11-10 13:17
好吧,我承认,MCU直接出来的 I2S jitter 不小,手册上标注正负200ps,但是呢,我用TDA1543已经听了两天了,就这听着就很舒服了,以前用TI的M3也搞过一个,手册上标注jitter 3ns,然后我还是觉得挺爽的,恩,然后我得出一个结论,搞毛jitter啊,我的耳朵对 jitter 的抑制能力很强的,接下来果断ES9018K2M走起,神马外置PLL,神马数字滤波器,神马FPGA/DSP,统统无视,就这样,MCU直接输出I2S,直接给9018,最多给9018上个好点的晶振 [s:2] [s:2]
还是觉得模拟部分可以好好下点功夫,把电源做足,layout搞好;
其实呢,我一直在琢磨着,用32个mos管,直接搞个16bit的 R2R 音量控制,是不是会很高大上掉渣天 [s:2] [s:2]
作者: supersuper    时间: 2014-11-10 13:34
ES9018帮你把JITTER搞定,确实省事
作者: zhangdu    时间: 2014-11-10 14:14
引用第12楼supersuper于2014-11-10 13:34发表的 :
ES9018帮你把JITTER搞定,确实省事

我其实已经不太关心什么jitter了,我更关心的是在低压下的输出性能,9018K2M应该是目前最合适的,当然了,有个Dejitter,YY起来更加有底气
作者: supersuper    时间: 2014-11-10 15:53
引用第13楼zhangdu于2014-11-10 14:14发表的 :


我其实已经不太关心什么jitter了,我更关心的是在低压下的输出性能,9018K2M应该是目前最合适的,当然了,有个Dejitter,YY起来更加有底气

9108帮你吧JITTER搞定了,所以你也不用关心了, 所以也没人敢YY了,哈哈!!
作者: zhangdu    时间: 2014-11-11 08:35
好好的一个帖子,唉
作者: 正点原子    时间: 2014-11-11 21:41
引用第6楼诶f2k是milf于2014-11-10 11:51发表的 :
这种CPU通常I2S都不干净。
你可以外加晶振,F4的IIS的时钟是可以来自外部晶振的。
如果使用自身的8M晶振倍频再去分频,确实没有几个采样率可以得出0%偏差的,如果换成外部晶振,那就好解决了,很容易解决你说的不干净问题。
作者: 正点原子    时间: 2014-11-11 21:45
我觉得吧,盲听才能得出谁好谁坏,拿不同价位的机器,盲听,能听出最好的那才是真正的真的好,其他都是YY罢了。
作者: Bunny    时间: 2014-11-11 22:03
[quote]引用第11楼zhangdu于2014-11-10 13:17发表的 :
好吧,我承认,MCU直接出来的 I2S
作者: 正点原子    时间: 2014-11-11 22:13
引用第21楼Bunny于2014-11-11 22:03发表的 :





.......
呵呵,确实很多这样的人。
之前听说有网友可以听出水力发电和火力发电的区别,此等神人,不知是否真有?
作者: Bunny    时间: 2014-11-11 22:24
引用第22楼正点原子于2014-11-11 22:13发表的 :

呵呵,确实很多这样的人。
之前听说有网友可以听出水力发电和火力发电的区别,此等神人,不知是否真有?





     一晃 16 年了, 这些人还在忽悠炒旧饭。
作者: Bunny    时间: 2014-11-11 22:39
[quote]引用第0楼正点原子于2014-11-09 17:29发表的 最近做的一款STM32F4板子,软解MP3/FLAC/APE/WAV等,最高支持192K 24位音频播放 :

作者: 正点原子    时间: 2014-11-11 22:45
引用第24楼Bunny于2014-11-11 22:39发表的 :




话说楼主的产品, 往孩子的教育方面靠一靠。
.......
恩,这方面确实可以考虑。
作者: cmoslogic    时间: 2014-11-12 04:22
买过楼主两块板的路过帮顶!!
作者: 正点原子    时间: 2014-11-12 11:35
引用第26楼cmoslogic于2014-11-12 04:22发表的 :
买过楼主两块板的路过帮顶!!
谢谢支持
作者: liyadong    时间: 2014-11-15 16:35
[quote]引用第0楼正点原子于2014-11-09 17:29发表的 最近做的一款STM32F4板子,软解MP3/FLAC/APE/WAV等,最高支持192K 24位音频播放 :

作者: zhangdu    时间: 2014-11-15 20:42
引用第28楼liyadong于2014-11-15 16:35发表的 :

这个MCU怎么写系统?

系统的话,应该只能上ucos这样级别的
作者: 德律风根    时间: 2014-11-15 22:17
引用第29楼zhangdu于2014-11-15 20:42发表的 :


系统的话,应该只能上ucos这样级别的
嗯,各种类似的都能跑。什么RTT啊,free啊之类的。
作者: 正点原子    时间: 2014-11-16 12:06
引用第28楼liyadong于2014-11-15 16:35发表的 :

这个MCU怎么写系统?
这个MCU支持ucosii,ucosiii,rtt,raw os,trochili等国内外操作系统。
这个实验用的是ucosii
作者: liyadong    时间: 2014-11-18 10:03
这个玩意如果想解APE ULTRA HIGH模式会比较难吧 200兆的CPU估计负荷会较重
作者: zhangdu    时间: 2014-11-18 13:07
引用第32楼liyadong于2014-11-18 10:03发表的 :
这个玩意如果想解APE ULTRA HIGH模式会比较难吧 200兆的CPU估计负荷会较重
等明年M7上市了,就无压力了
作者: 正点原子    时间: 2014-11-23 01:14
引用第26楼liyadong于2014-11-18 10:03发表的 :
这个玩意如果想解APE ULTRA HIGH模式会比较难吧 200兆的CPU估计负荷会较重
APE用F4解不了 ULTRA HIGH。APE解码运算量太大了,flac在这方面完胜。
其实老外比较喜欢flac,ape太耗cpu了。
作者: zhangdu    时间: 2014-11-23 20:29
flac的话,M4有没有可能搞到96k24bit [s:2]
一般48k以上的采样率,都是24bit的了,像96k16bit的,很少见的
作者: 正点原子    时间: 2014-11-24 00:04
引用第29楼zhangdu于2014-11-23 20:29发表的 :
flac的话,M4有没有可能搞到96k24bit [s:2]
一般48k以上的采样率,都是24bit的了,像96k16bit的,很少见的
大大优化代码,最好搞成全汇编的,哈哈,也许可以。
作者: zhangdu    时间: 2014-11-24 08:39
引用第30楼正点原子于2014-11-24 00:04发表的 :

大大优化代码,最好搞成全汇编的,哈哈,也许可以。

好吧,这样估计没戏,不过我有个比较野蛮的方案不知道是否可行,把STM32F4给超频了,我试过超频到240MHz可以运行,但是稳定性不是很好,这个和芯片个体体质有关系,网上有人超到260MHz了,但是另一方面,超到200MHz或者220MHz应该木有问题,不知这样有机会否 [s:2] [s:2]
作者: 正点原子    时间: 2014-11-25 22:54
[quote]引用第31楼zhangdu于2014-11-24 08:39发表的 :


好吧,这样估计没戏,不过我有个比较野蛮的方案不知道是否可行,把STM32F4给超频了,我试过超频到240MHz可以运行,但是稳定性不是很好,这个和芯片个体体质有关系,网上有人超到260MHz了,但是另一方面,超到200MHz或者220MHz应该木有问题,不知这样有机会否 [s:2]
作者: zhangdu    时间: 2014-11-26 13:07
嗯嗯,哪有机会了我试试,小超一下 [s:2]
其实等到明年F7出来就好了,不过F7的主频有点让人意外啊,400MHz的内核,让ST做成了200MHz,小失望一下
作者: 正点原子    时间: 2014-11-26 14:54
引用第33楼zhangdu于2014-11-26 13:07发表的 :
嗯嗯,哪有机会了我试试,小超一下 [s:2]
其实等到明年F7出来就好了,不过F7的主频有点让人意外啊,400MHz的内核,让ST做成了200MHz,小失望一下
别家估计会做高频的吧。比如NXP之类的。
作者: zhangdu    时间: 2014-11-26 15:14
引用第34楼正点原子于2014-11-26 14:54发表的 :

别家估计会做高频的吧。比如NXP之类的。

NXP的学习资料没有ST的全面啊,另外NXP在大陆的推广力度赶不上ST,我倒是想学nxp来着,看看那些开发板然后又放弃了,其实NXP做音频比ST更合适;
话说原子有计划推出NXP的开发板么,有的话打算搞一个,主要你家资料很赞
作者: 2b青年爱发烧    时间: 2014-11-26 19:00
外行搭车问一下,据说单片机做播放器音质很好?因为CPU不用处理其它中断什么的所以jitter什么的更低?
果真如此的话,为何不在数字信号输出给DAC之前做个buffer?
作者: bone    时间: 2014-11-26 21:15
引用第36楼2b青年爱发烧于2014-11-26 19:00发表的 :
外行搭车问一下,据说单片机做播放器音质很好?因为CPU不用处理其它中断什么的所以jitter什么的更低?
果真如此的话,为何不在数字信号输出给DAC之前做个buffer?
都dma了,jitter和cpu是否在处理数据关系不大。
作者: zhangdu    时间: 2014-11-26 22:44
引用第36楼2b青年爱发烧于2014-11-26 19:00发表的 :
外行搭车问一下,据说单片机做播放器音质很好?因为CPU不用处理其它中断什么的所以jitter什么的更低?
果真如此的话,为何不在数字信号输出给DAC之前做个buffer?

我悄悄的告诉你,那些说什么cpu处理不过来,会带来更高的jitter的,都是不懂cpu是干啥的;
因为,如果是cpu处理不过来,或者中断没有及时响应,那么,不会是jitter变大,而是数据断流,直接就能听出来;
操作系统处理各个任务的时间片段,应该是在毫秒级别,而不是jitter那种皮秒级别;
另外,就目前的cpu,比如i3i5i7神马的,两三个G的主频,一般应用时绰绰有余的,你可以试试,如果开太多任务,播放音乐,当系统负荷太高时,表现出来的是音乐播放卡顿,而不是什么没有根据的jitter;
而且,mcu的话,i2s数据一般也都是用dma在跑,和cpu在干啥,关系不大,sd卡读数据也可以用dma跑,所以cpu的负荷可能很轻,特别是wav这样的,mcu的i2s外设本身就带有fifo,就是你说的那个buf,只不过比较小,几十个字节,但是算一下,以16bit44.1k,假设fifo32字节,立体声一次用4个字节,也就是8次采样的时间,大约0.18ms,dma每间隔这个时间搬运一次数据补充到fifo,对于上百兆的总线速度,绰绰有余的。
作者: 2b青年爱发烧    时间: 2014-11-26 23:05
引用第37楼bone于2014-11-26 21:15发表的 :

都dma了,jitter和cpu是否在处理数据关系不大。
引用第38楼zhangdu于2014-11-26 22:44发表的 :


我悄悄的告诉你,那些说什么cpu处理不过来,会带来更高的jitter的,都是不懂cpu是干啥的;
因为,如果是cpu处理不过来,或者中断没有及时响应,那么,不会是jitter变大,而是数据断流,直接就能听出来;
操作系统处理各个任务的时间片段,应该是在毫秒级别,而不是jitter那种皮秒级别;
.......

嗦嘎
作者: 正点原子    时间: 2014-11-27 00:25
引用第35楼zhangdu于2014-11-26 15:14发表的 :


NXP的学习资料没有ST的全面啊,另外NXP在大陆的推广力度赶不上ST,我倒是想学nxp来着,看看那些开发板然后又放弃了,其实NXP做音频比ST更合适;
话说原子有计划推出NXP的开发板么,有的话打算搞一个,主要你家资料很赞
确实,NXP我暂时没有计划。做开发板太累了
作者: xiaoxiaohe99    时间: 2017-7-29 05:51
非常厉害的帖子,需要学习下
作者: bh7kqk    时间: 2017-9-25 20:58
请问这个原子是开发板那个原子吗??牛人啊。膜拜一下
作者: bh7kqk    时间: 2019-4-20 16:14
漂亮.....
作者: 高清牛人    时间: 2019-10-24 20:46
感谢楼主分享,最近在搞APE格式的播放,希望能有帮助!

作者: rdwwq    时间: 2020-4-7 15:43
请问楼主有开发板卖吗?附相关例程的。没事想玩玩。




欢迎光临 耳机网-耳机大家坛 (http://www2.erji.net/) Powered by Discuz! X3.2