打印
[STM32F3]

基于STM32的WAV音乐播放器(Ucos Fatfs )

[复制链接]
6640|43
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
  很早就像做个音乐播放器,但是怕自己能力不够就一直没动手,最近在研究UCOS,FATFS系统的时候感觉还成,就放开手做了。通过一个星期的时间,制作成功。接下来介绍一下,我的播放器的开发过程。
首先,当然是上网找资料,确定方案。先说下我的方案:
方案虽然一直在变,但是基础的部分还是没变,利用FATFS文件系统读取SD卡上的WAV文件,将其通过I2S接口发送给DAC转换芯片,播放音乐。这是基础,接下来说下我通过不断的失败,然后不断改进的方案。
1.通过DMA读取SD卡文件。
2.通过DMA发送I2S数据给DAC。
(DMA主要是减少CPU的开销,释放给其他任务)
3.频谱显示是基于STM32的DSP库,通过FFT获取频谱,再通过FIR滤波器,得到比较光滑的曲线(为什么不用柱状频谱呢)
4.因为STM32F303RET6没有FMC接口,所以为了减小系统开销,只能采用线性的频谱显示。(通过实验发现一次80点X9个像素的刷屏时间达到10+ms所以要想到达比较流畅的显示效果只能是线条频谱),不过后来发现效果还成。
5.通过实验发现,TFT显示对音乐播放的影响非常大,要想在播放音乐的同时不间断的刷屏,同时还不能打断音乐播放只能通过UCOS系统进行管理。
下面上视频先:


接下来我将不定期更新我的WAV播放器制作过程。
先介绍下我的硬件组成:
主控:STM32F303RET6
I2S DAC芯片:PCM5102
存储器:1G SD卡
液晶屏:2.2寸 SPI接口液晶屏
DAC PCM5102

2.2寸TFT

SD卡

F303


小音箱


全家福


接下来就是代码编写了
1.SD卡的SPI驱动编写,因为SD卡的SPI协议比较复杂,刚开始在晚上找了不少代码,但是通过测试都存在一些问题,最后在STM32的官网上找到discovery开发板的例程,上面有SD卡的SPI读取驱动,但是只有读单块的,要想连续读多块,还是得自己写读多块的驱动。
2.解决完SD卡的驱动就可以 移植FATFS文件系统了,这在网上有很多教程我就不多说了。
3.当可以成功读取WAV文件是就可以将其I2S DAC结合起来,现在只要将读出的数据直接发给I2S就成,当能放出声音就完成了一半了。
4.再来就是添加DMA功能了,要想实现音乐的不间断播放,就必须上DMA不然一但有其他的任务打断就会影响音乐播放效果。I2SDMA比较简单,但是SD卡的DMA读取就比较难了,在读取得时候,还得发送命令,花了我不少时间。上完DMA后CPU的开销减少90%以上。
5.再来就可以添加频谱显示功能了。FFT采用基4的256点FFT,运行一次大概在0.6ms左右,FFT网上的资料也比较全就不多说了。但是只有FFT输出的点比较散,通过FIR滤波可以将其线性化,FIR系数可以通过Matlab获取,这方面百度文库有介绍,这样可以得到光滑曲线。(这都涉及到比较复杂的高数我也只会用,搞不懂原理)


沙发
lianqiang|  楼主 | 2016-6-6 16:56 | 只看该作者

使用特权

评论回复
板凳
huangcunxiake| | 2016-6-6 21:46 | 只看该作者
学习了,不知道谁有没有MP播放器的方案。。

使用特权

评论回复
地板
湛只为无双| | 2016-6-6 22:01 | 只看该作者
楼主的音响碉堡了,感觉很接地气的那种。。

使用特权

评论回复
5
人民币的幻想| | 2016-6-6 22:18 | 只看该作者
有电流滋滋的声音

使用特权

评论回复
6
mark0668| | 2016-6-6 22:27 | 只看该作者
不错,学习了

使用特权

评论回复
7
lianqiang|  楼主 | 2016-6-6 22:36 | 只看该作者
huangcunxiake 发表于 2016-6-6 21:46
学习了,不知道谁有没有MP播放器的方案。。

准备搞mp3软解码

使用特权

评论回复
8
lianqiang|  楼主 | 2016-6-6 22:37 | 只看该作者
湛只为无双 发表于 2016-6-6 22:01
楼主的音响碉堡了,感觉很接地气的那种。。

以前拆电视的芯片

使用特权

评论回复
9
戈卫东| | 2016-6-6 22:46 | 只看该作者
湛只为无双 发表于 2016-6-6 22:01
楼主的音响碉堡了,感觉很接地气的那种。。

何止接地气啊。。。。感觉就是地里刨出来的古董啊。。。。。

使用特权

评论回复
10
ecoren| | 2016-6-7 09:14 | 只看该作者
我软件小白,问个问题:
DMA和CPU是占用的同一条总线吗,
我意思说用DMA跑数据,CPU就不能跑了,
还是两者可以并行?

使用特权

评论回复
11
Larm1| | 2016-6-7 10:28 | 只看该作者
好东西...

使用特权

评论回复
12
Larm1| | 2016-6-7 10:29 | 只看该作者
ecoren 发表于 2016-6-7 09:14
我软件小白,问个问题:
DMA和CPU是占用的同一条总线吗,
我意思说用DMA跑数据,CPU就不能跑了,

这两个是并行的,DMA不占CPU用时间...

使用特权

评论回复
13
mmuuss586| | 2016-6-7 16:23 | 只看该作者
不错;好好努力;

使用特权

评论回复
14
blueblueblue| | 2016-6-7 19:22 | 只看该作者
楼主,问个问题,ucos加fatfs会出现芯片内存不够么?我用ucosiii加fatfs,keil会报no space 的错误

使用特权

评论回复
15
BBSTOM| | 2016-6-7 19:44 | 只看该作者
楼主啊,我有个建议, 你不妨 添加  均衡器 的功能。
就是 10段的吧, 这样 播放音乐的效果可以调节,会好很多的。

使用特权

评论回复
16
pattywu| | 2016-6-7 20:26 | 只看该作者
其实STM32的12位dac输出wav,效果也不错。

使用特权

评论回复
17
huangcunxiake| | 2016-6-15 20:54 | 只看该作者
对这个很感兴趣,不知道以前MP3和MP4是怎么做的。

使用特权

评论回复
18
lianqiang|  楼主 | 2016-6-16 14:13 | 只看该作者
pattywu 发表于 2016-6-7 20:26
其实STM32的12位dac输出wav,效果也不错。

我这个芯片上面没有dac,有机会试试

使用特权

评论回复
19
lianqiang|  楼主 | 2016-6-16 14:14 | 只看该作者
BBSTOM 发表于 2016-6-7 19:44
楼主啊,我有个建议, 你不妨 添加  均衡器 的功能。
就是 10段的吧, 这样 播放音乐的效果可以调节,会好 ...

接下来准备研究mp3软解码,等以后再有空研究

使用特权

评论回复
20
lianqiang|  楼主 | 2016-6-16 14:15 | 只看该作者
blueblueblue 发表于 2016-6-7 19:22
楼主,问个问题,ucos加fatfs会出现芯片内存不够么?我用ucosiii加fatfs,keil会报no space 的错误 ...

不知道你是什么芯片,我这个有512kflash肯定够

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

105

帖子

3

粉丝