很早就像做个音乐播放器,但是怕自己能力不够就一直没动手,最近在研究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获取,这方面百度文库有介绍,这样可以得到光滑曲线。(这都涉及到比较复杂的高数我也只会用,搞不懂原理)
|