我的WAV播放器 自己可以说是一个资深的、水平十分有限的真正音乐爱好者,尤其对古典音乐以及国内经典歌曲和乐曲十分喜爱,对于目前流行歌坛则比较陌生。凭借自己的自控专业,从80年代的单板机(现在好多人没见过和听说过)、8位单片机、PLC、到现在的DCS都开发过,因此动手制作WAV播放器的想法由来已久。虽说原先使用过单片机编程,对C语言也比较熟悉,但比较论坛中的各种方案,认为一般的单片机难以处理和传送WAV的庞大数据量。因此,选用了STM32F103RBT6为主控芯片、VS1053B作为解码芯片、LCD1602为显示器、SD卡(8G)。 为加快项目的进度,先采用模块拼接,在春节后开始动工,终于在“五一”前夕初步完成各项软件的调试。 下图为各个模块: 下图为各模块之间的接线表 各个模块组装后放入机箱中,接线比较乱。因第一阶段的工作主要是软件调试,因此未安装DA解码板(采用与VS1053B的I2S接口匹配的PCM1793解码器和运放组成)。 面板按上、下、左、右、中布置了5个按键,这5个按键的功能在不同的界面上是不同的。 下图为VS1053B的测试画面。 各项功能测试完成后,表明模块功能完好。RAM测试结果为“0x83ff”,确定了解码芯片确实是VS1053B。为减少程序的字节数,测试完成后,将今后编程不再需要的测试函数和定义全部删除(当然要做好备份)。 进行完整的程序设计……,最终完成。 下图为开机画面。 按下中间按键后,进入“菜单”界面,有3个选项: 1、next:进入下一级画面; 2、音效调整:默认关闭; 3、高低音调整:默认高低音增益均为最大值。 采用按动左按键,闪烁光标在3个选项上循环移动。按下中间按键后,选定光标所在的选项。 采用默认值,可直接进入下一级画面。 下图为“音效调整”画面。共有“关闭、最小、中等和最大”4个选项,通过左右按键,各个选项分别显示,按下中间按键后进行确认,回到“菜单”界面。 下图为“音调调整”画面。通过按动左右键,闪烁光标在“低音”和“高音”之间移动,按上下键可以改变光标坐在选项的数值,按下中间按键后进行确认,回到“菜单”界面。 在“菜单”界面中,按下中间按键后进入到“选曲”界面。显示SD卡的根目录中存放的可播放的WAN文件总数。在设计上,最大数目为99首。通过上下按键可快速(±10)循环选曲,左右按键可逐个(±1)循环选曲,按下中间按键后进行确认,进入到“播放”界面 下图为“播放”界面。 1、界面第一行分别显示的是:正在播放的曲号、播放的剩余时间以及当前的音量值。在播放时按动上下键可改变音量(音量值为0~30),按动左右按键可进行前后换曲。 2、界面第二行分别显示“传输速率”和“采样频率”。因1602的显示量有限,程序设计时这些数据均使用整数定义,显示中未包含小数。如下图中的“采样频率”实际值应为“44.1kHz”。 播放时,从VS1053B模块的耳机插孔传出的声音十分流畅,没有卡顿现象。主要在播放程序上开辟了4096字节的缓冲区。首先从SD卡中一次读出4096个字节的数据,存放在缓冲区中;再由缓冲区向VS1053B传送数据,按照要求每次传送32个字节。详细指令网上都有。注意:SPI的读写操作一定要采用寄存器指令方式进行,生成的代码量小,可加快程序的实时性;如果采用库函数指令方式操作,由于代码量较大,非常容易出现卡顿现象。 在程序设计中,为方便编写,对大部分实时性要求不高的代码,应采用库函数指令。 在播放当中,按下中间按键时,退出播放。在画面上闪烁的“>”的字符,提示关闭电源。 主要功能就介绍到这里。项目中使用程序大部分借鉴网上,自己主要在菜单和画面显示上进行了程序设计。 说实在的,第一次使用STM32,程序调试中出现了不少问题,逐一解决,终于完成全部程序的编写和调试。 下一步,自己设计电路,将各个模块(包含DA和功放)设计在一块线路板上,电源部分为±15V,最终实现用高保真耳机欣赏无损WAV音乐。 |