原创 【原】基于STM32的MP3播放器设计与实现(二)(提供MDK完整源码)

2009-10-8 10:16 14009 9 35 分类: MCU/ 嵌入式

4 简易声波播放器的设计与实现


4.1 软件程序设计


    由“基于STM32MP3播放器设计与实现(一)”所述内容及图1可以得到简易声音播放器的软件工作过程:通过SPI1SD卡中读取声波文件,将所读取的部分存放在一个缓冲器中,利用TIMER2通道1定期产生的中断,从缓冲器中读取声音数据,然后根据声音数据通过TIMER4的通道3产生不同频率方波输出。这里使用了两个缓冲器,一个用于存放从SD卡读到的声音数据,另一个用于将声音数据输出到PWM,两个缓冲区的功能不断交替,形成一个由2个缓冲区构成的环形缓冲。播放声波文件由PC机通过超级终端以命令的方式选择,声音的播放状态也显示在PC机超级终端上。


该系统软件程序主要包含以下源文件,下面分别介绍其中主要的一些函数。限于篇幅这里不能给出工程的全部源代码,读者可在附件里下载所有源代码。


n         main.c


    该源文件包含以下几个主要函数:


l         SetupClock:用于初始化并设置系统时钟,并允许GPIOAGPIOBTIM2TIM4SPI的时钟;


l         Speaker_Timer_Config:用于配置定时器TIM2TIM4TIM4的通道3处于PWM1模式;TIM2的通道1工作于输出比较模式,定期发出中断,在每次中断修改TIM4通道3相关寄存器,使之产生不同频率的方波;


l         USART_Scanf_NameUSART_Scanf_Cmd:用于从超级终端获取输入字符串;


l         PrintPass:用于在超级终端上输出提示符“X:>”;


l         main: 主函数,首先初始化系统时钟、串口、连接SD卡的SPI1,与SD进行通讯初始化,检测并在超级终端上打印SD卡的信息;然后根据用户在超级中输入的命令进行操作,这里有“dir”、“cd”、“read”、“free”、“play”五个简单的命令,分别是目录项列表、目录更换、以文本方式读取文件、查询SD空余空间和播放声音文件;如果输入“Play ***.wav”,则处理器开始从SD卡中读取相应的声波文件,并将其放入相应的缓冲区;



n         msd.c


    该文件用于提供SD卡的驱动,由ST公司所带例程提供,本系统用到以下一些函数。


l         SPI_Config:配置与SD卡相连接的SPI1


l         MSD_Init:初始化SD卡通讯;


l         MSD_WriteByte:向SD卡写一个字节;


l         MSD_WriteByte:从SD卡读一个字节;


l         MSD_GoIdleState:令SD卡处于空闲态;


l         Get_Medium_Characteristics:获取SD卡的容量;


l         MSD_SendCmd:向SD卡发命令;


l         MSD_GetResponse:从SD卡获取响应;


l         MSD_ReadBlock:从SD卡读取一块数据;



n         fat16.c


    该文件提供FAT16文件系统的支持,主要包含以下一些函数:


l         ReadMBR:读取MBR数据结构;


l         ReadBPB:读取BPB数据结构;


l         ReadFAT:读取文件分配表指定项;


l         ReadBlock:读取一个扇区;


l         FAT_Init:获取FAT16文件系统基本信息;


l         DirStartSec:获取根目录的开始扇区号;


l         DataStartSec:获取数据区的开始扇区号;


l         ClusConvLBA:获取一个簇的开始扇区号;


l         LBAConvClus:转换扇区号与簇号之间的关系;


l         LBAConvClus:计算可用空间,返回字节数;


l         GetFileName:获取指定文件的首扇区号;


l         List_DateAndTime:获取文件或目录项的日期时间;


l         SearchFoler:在指定范围内查找子目录;


l         List_AllDir_Long:列出指定范围内的目录及目录信息;


l         FAT_FileOpen:打开指定文件;


l         FAT_FileRead:读取文件数据;



n         uart.c


该文件提供USART串口驱动函数


n         hw_config.c


该文件包含系统初始化设置函数和中断配置函数。


l         Set_System:用于提供系统时钟及电源设置;


l         NVIC_Config:用于设置中断向量,允许TIM2中断;



n         stm32f10x_it.c


    该文件仅包含一个函数TIM2_IRQHandler,即在每次TIM2中断时从缓冲器中读取音频数据送TIM4定时器,以用于产生不同频率的声音。


n         UnicodeToGB2312.c


    该文件仅包含一个函数UnicodeToGB2312,处理从UniCode编码到GB2312字符的转换,用于处理长文件名。


4.2 运行过程


(1)    使用MDK通过ULINK 2仿真器连接开发板,或使用两根USB电缆分别将CN1CN5 PCUSB端口相连(使用板上自带的UlinkMe);


(2)    使用串口线将开发板的串口COM0PC机连接,在PC机上运行windows自带的超级终端串口通信程序(波特率1152001位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序;


(3)    打开所下源代码目录Player\Simple Wave Player下的Simple Wave Player.Uv2工程,将其编译链接后烧写到开发板中;


(4)    将带有测试声波文件TEST1.wav拷贝到SD卡中,并将SD插入评估板的SD连接器中;


(5)    重启动开发板,在超级终端上将看到SD卡的信息以及提示符“X:>”,键入dir命令然后回车将列出SD卡上的所有文件和目录,如图6所示;



3D3D90F20C988EE4621D7BC5CB4F1D55_500.jpg


6 查看SD卡内容


(6)    可在超级终端中输入“dir”、“cd”、“free”、“read”等命令(注:read 命令后跟文件名;读出并输出文件的文本内容,可以正确显示文本文件如以txt,c,h,s为后缀的文件),观察运行结果;注意,由于程序中没有进行大小写转换,因此命令只能使用小写;


(7)    在超级终端中输入“play TEST1.wav,如果程序运行正常,通过开发板的扬声器或者耳机将能听到音乐声,超级终端显示如图7所示。


 



336D7289E1EC9DD257D5432FD790AF37_500.jpg


7播放声波文件


 


5 简易MP3 Player的设计与实现


4小节所介绍的声音播放器,是通过定时器TIM4产生不同频率方波来产生声音的,因此只适合播放wav声波文件,其音质也非常粗糙。如果希望播放MP3文件,并产生高品质的声音,则需要使用专用声音解码芯片,这将得到一个简易MP3 Player原型设计。


5.1 硬件设计


    如图8所示,STM32F103x使用SPI2端口与VS1003芯片的SISOSCLK连接;VS1003芯片的控制引脚xCSxRESETxDCS分别与STM32F103PA1PA0PA2连接,低电平有效;VS1003的状态引脚DREQSTM32F103处理器的PA3连接,低电平表示需要送数据,高电平表示正在处理数据。


    读者如果没有条件制作硬件,可以使用一块VS1003的评估板和STM103V100评估板配置,只需要使用电缆实现上述连接及供电即可,实验成本也非常低。



D41ACC2BC7927972CEDD42F683005BB0_500.jpg


8 简易MP3 Player硬件原理图


5.2 软件程序设计


    由上面所述内容及图2、图8可以得到简易MP3 Player的软件工作过程:通过SPI1SD卡中读取MP3文件,将所读取的内容通过SPI2发送到VS1003解码器中播放;PC机可通过USB总线读写SD卡的内容,传送MP3文件;PC机的超级终端用于发送MP3播放命令、显示MP3 播放状态。


    由于SPI1读取SD卡的速度远超过VS1003播放声音的速度,因此在VS1003播放SPI2送给其的声音数据期间,SPI1能从SD卡中读取下次播放所须的数据,不会产生声音不连续的情况。


    读者也可以尝试采用更有效的中断方式,在内存中设置一个环形的缓冲区,SPI1SD卡读取的MP3文件数据存放在其中,当VS1003需要数据时其DREQ引脚将产生低电平,利用其产生中断,在中断服务程序中从缓冲区读取数据送VS1003,直至DREQ引脚恢复为高电平时退出中断。


    该系统软件程序主要包含以下源文件,下面分别介绍其中主要的一些函数。限于篇幅这里不能给出工程的源代码,读者可在附件里下载所有源代码。


n         main.c


    该源文件包含以下几个主要函数:


l         USART_Scanf_NameUSART_Scanf_Cmd:用于从超级终端获取输入字符串;


l         PrintPass:用于在超级终端上输出提示符“X:>”;


l         main: 主函数,首先初始化系统时钟、串口、USB接口、SPI1SPI2,通过命令启动VS1003芯片,检测并在超级终端上打印SD卡的信息;然后根据用户在超级中输入的命令进行操作,这里有“dir”、“cd”、“read”、“free”、“usb”、“vstest”、“play”七个简单的命令,分别是目录项列表、目录更换、以文本方式读取文件、查询SD空余空间、启动读卡器功能、VS1003正弦测试、和播放MP3声音文件;如果输入“Play ***.mp3,则处理器开始从SD卡中读取相应的MP3文件,并将其送VS1003芯片播放;



n         VS1003.c


    该文件主要提供VS1003芯片的驱动,包含以下几个主要函数:


l         VS1003_Config:配置STM32处理器与VS1003芯片连接的相关引脚,包括SPI2PA1PA0PA2PA3


l         SPIGetChar:通过SPIVS1003读取一个数据;


l         SPIPutChar:通过SPIVS1003写一个数据,如果是MP3声音数据,则VS1003将解码并播放;


l         Mp3ReadRegister:读取VS1003寄存器的值;


l         Mp3WriteRegister:写VS1003寄存器


l         Mp3ResetVS1003硬件复位;


l         Mp3SoftResetVS1003软件复位,设置时钟、采样率、重音、音量、立体声等参数;


l         VsSineTest:播放正弦声波,用于测试;



n         msd.c


   该文件用于提供SD卡的驱动,与小节4.1中的msd.c文件相同。


n         fat16.c


   该文件提供FAT16文件系统的支持,与小节4.1中的fat16.c文件相同。


n         UnicodeToGB2312.c


   该文件处理从UniCode编码到GB2312字符的转换,与小节4.1中的UnicodeToGB2312.c文件相同。


n         memory.c


   该源文件提供通过USB接口进行SD存储管理的功能。其主要函数有:


l         Address_Management_Test:测试接收到的存储地址;


l         Read_Memory:通过USB读取SD卡;


l         Write_Memory:通过USBSD卡;


n         hw_config.c


该文件包含系统初始化设置函数和中断配置函数。


l         Set_System:用于提供系统时钟及电源设置;


l         Set_USBClock:配置USB端口所使用引脚及时钟。


 


5.3 运行过程


(1)    使用MDK通过ULINK 2仿真器连接STM103V100开发板,或使用两根USB电缆分别将CN1CN5 PCUSB端口相连(使用板上自带的UlinkMe);


(2)    使用USB电缆连接CN1PCUSB端口;将VS1003评估板与STM103V100评估板相关引脚连接,具体连接参考5.1小节


(3)    使用串口线将开发板的串口COM0PC机连接,在PC机上运行windows自带的超级终端串口通信程序(波特率1152001位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序;


(4)    打开所下源代码目录Player\Simple MP3 Player下的Simple MP3 Player.Uv2工程,将其编译链接后烧写到开发板中;


(5)    MP3文件拷贝到SD卡中,并将SD插入评估板的SD连接器中;


(6)    重启动开发板,在超级终端上将看到SD卡的信息以及提示符“X:>”,如图9-2-7所示;


(7)    可在超级终端中输入“dir”、“cd”、“free”、“usb”、“vstest”、“read”等命令(注:read 命令后跟文件名;读出并输出文件的文本内容,可以正确显示文本文件如以txt,c,h,s为后缀的文件),观察运行结果;注意,由于程序中没有进行大小写转换,因此命令只能使用小写;


(8)    在超级终端中输入“play ***.mp3,如果程序运行正常,通过VS1003评估版的耳机将能听到高品质音乐声,如图9所示。


 



2906250042487D850122673CF459DC20_500.jpg


9 播放MP3音乐


    本系统只是实现了简易MP3 Player的基本原型设计,读者可以进一步利用STM103V100评估板资源来完善和丰富该MP3 Player的功能,例如利用Joystick来选择歌曲、利用LCD来显示歌曲名、利用ADC来调节音量、利用几个LED灯来表示音量。如果能完成以上所有相关设计,则可以基本熟悉STM32处理器的各种应用开发。


 


附:


点击下载 源文件下载(使用开发工具RealView MDK,STM32F103V100开发板,其它STM32开发板只需稍作修改即可使用)


 


STM103V100评估板与VS1003解码模块的引脚连接:

PA3               DREQ 

PB13              SCLK

PB14              SO

PB15              SI  

PA1               /xCS

PA2               /xDCS

PA0               /xRESET




PARTNER CONTENT

文章评论26条评论)

登录后参与讨论

用户472938 2010-2-27 12:04

搞定了,把库升级了。谢谢lz

用户472938 2010-2-26 16:25

怎么编译不通过阿,很多错误啊,都是跟sd卡相关的函数

用户1593293 2009-12-7 10:37

太强大了,图文并茂,谢谢楼主了!

用户1517957 2009-4-28 09:13

我正要做stm32的软件解码~~~~~~这个CM3的内核还是ARM7的,有人说可以做,不知道实时性好不好~~~

用户493037 2009-3-27 22:31

然后弹出无法识别的USB设备

用户493037 2009-3-27 16:34

USB访问SD卡,我总是搞不好啊!! USB_Init();总是停在这里。不知道什么原因?

用户114956 2009-1-21 17:20

哈哈,很好,诚邀加盟EDN的MP3小组.

用户1205831 2008-10-29 10:57

错怪楼主了,估计st软件库变更导致的原因

用户1205831 2008-10-29 10:41

楼主好事没做到底,附件还没调通或者故意挖了坑

用户1205831 2008-10-29 10:29

顶,狂顶!楼主太好了!再谢!
相关推荐阅读
用户154520 2010-03-01 14:49
【原】工作汇总
    作为应届生,一直把第一份工作看得很重,也一直在努力着,今天突然接到百度的电话offer,出乎意料,也感觉百度的速度确实太慢了,本来已经安心去腾讯的,现在又得折腾一下子。找工作的时间主要集中在9...
用户154520 2009-10-08 10:05
汉字显示及字库
https://static.assets-stash.eet-china.com/album/old-resources/2009/6/26/0f00e9de-3982-460e-b215-81b8...
用户154520 2009-10-08 10:04
【原】VB,Eclipse,CSharp对Oracle之XML操作的例子
https://static.assets-stash.eet-china.com/album/old-resources/2009/6/26/1afca68f-1ec1-490d-a51d-cb70...
用户154520 2009-10-08 10:04
linux下备份还原MBR
备份:dd   if="/dev/hda"   of="mbr".bak   bs="512"   count="1"   恢复:dd   if="mbr".bak   of="/dev/hda"  ...
用户154520 2009-10-08 10:04
【原】硬盘安装SUSE-Linux-10.1-GM-DVD-i386
硬盘安装SUSE-Linux-10.1-GM-DVD-i386                            (安装文件可在http://www.chinaunix.com下载)我电脑有四个主...
EE直播间
更多
我要评论
26
9
关闭 站长推荐上一条 /3 下一条