用单片机做一个音乐播放器,是我两年前的一个梦想(挖的一个大坑)
那是我还才刚刚入门玩51不久
当时看了版主
@hit00 的几个帖子,还有另外几个坛里的帖子
http://bbs.mydigit.cn/read.php?tid=193645http://bbs.mydigit.cn/read.php?tid=188161 看得心潮澎湃,决心也做一个。因为手上没同款的片子,就用了STC15F408w做主控。
可是,尝试了许久,都没弄出来。其中用过PWM输出,也用过电阻网络,还考虑过尝试使用IIS的音频DAC芯片。
程序上,还专门花了好一久去啃了FAT文件系统的东西,自己写了一个简易的文件系统,虽然功能简单,但是读取速度够快
板子焊了好多个版本,程序前前后后弄了一年多
这是之前弄出来的一些东西
这是其中一版的板子,自认为是我焊得最好看的一片洞洞板
双声道的16位电阻网络
然而,事实是残酷的。
结果都不能正常的播放,不是毫无声音,就是声音断断续续。
结论就是,51太慢了+自己水平太臭了。
于是这个梦就被暂时封存了,直到有一天,我又入了另一个大坑——STM32。
当我看到STM32的外设里面带有SDIO和IIS时,感觉播放音频这个大坑又能填了。
后来我画了自己的第一块PCB,也是自己的第一块STM32开发板,吧SDIO卡槽和音频IIS接口都专门引出来了
原帖看这里(精品贴)
历时两月从零开始精心自制stm32开发板[url]http://bbs.mydigit.cn/read.php?tid=1578422[/url]
电路图

使用的IIS音频DAC芯片是一个廉价的CS4344,好像就2-3大洋的样子
这板子虽然表面上看着还不错,但是毕竟第一次画板,经验还是缺乏,就拿播放音频所需的功能,就有两个错误
第一个时封装没弄对,耳机插口放不进去,只能这样了
第二个更坑,sd卡接口画错了
只能掰弯引脚曲线救国了
然而画好板子之后的半年,也没有去填这个坑,而是主要在学习基础的东西,STM32比51有的东西多太多了,学了很久还是觉得自己知道的很少。
一两周,又突然想起曾经的那个梦,找出资料来重新开张。
不得不说,stm32真的要强劲不少。借助成熟的FATFS和内部的DMA(可以设置成从内存自动搬运数据到外设),只用了小半天,几乎没费什么力气的,就让音乐流淌出来。同时,使用上在线调试的方法,配合逻辑分析仪,相比于传统的下载看效果的方法,也让错误更容易被找出来。
然而,听多了,发现,这歌放起来不对劲啊,怎么快这么多,声调升高,歌声像赶着唱完的一样。仔细研究,才发觉在常见频率44100hz且需要提供MCK的时候,因为单片机分频的问题,实际的频率的是46875hz,偏差了6%,不奇怪才怪。
再看cs4344的手册,官方推荐了两个比较“奇葩”的晶振频率,不好买啊
于是乎只能在分频系数上做手脚了。经过计算,发觉最接近的办法是主频小超到80mhz,7分频得MCK为11.428mhz(接近推荐的11.2896)
256分频后得到音频播放频率为44.6khz,误差缩小到1%,算是勉强可选,可以接受
理论分析未实测:如果用gd32,内部hsi,8mhz,用矫正寄存器向下微调到7.91khz附近,再操作,将能得到更精确的频率
上逻辑分析仪检测,没错
wav播放有了,对STM32来说算是小菜一碟,那一不做二不休,就继续看看其他的音频播放呗。
首先盯上的是MP3,毕竟是最常用的音频格式。
上网一查果然有前人做过。使用的是 Helix解码库。借鉴前人的成果,再一番移植和调试,mp3也能播放了!(44.1khz 16位,双声道)
解码对内存和cpu的占用都不小,内存上大概消耗了45k的样子(103RCT6只有48k,内存占用很紧张)
这是播放一帧的耗时
这是解码一帧的耗时
之间空闲的7ms,可以用来检测按钮,驱动屏幕显示什么的(目前无屏,以后可以有)
做到这步,我已经心满意足了。可是在好奇心和好胜心驱使下,又盯上了解码FLAC。
事实上解码FLAC这步,废了我好多时间精力
找的flac解码库,移植大半天,声音出来了,但是有断断续续的毛病……找了半个星期没找出来,播放层的代码推倒重新写了一遍,问题依旧……解码时间也是小于播放时间的,解码耗时甚至比mp3还短。还以为我移植有问题……tm居然是库里面有问题!!!!!解码用双缓存……结果两个输出赋值接口都只给1缓塞了数据,2缓就全程打酱油,(′д` )…彡…彡修改后,声音也是流畅的流淌出来。经过测试,FLAC解码只能解leave0-leave2压缩等级的文件,再高级的失败的原因是内存不够用了,实测leave3级占用的内存应该需要80k,103系列伤不起。
图满了,楼下继续。
[ 此帖被2545889167在2016-12-19 15:56重新编辑 ]