基于stm32和ucosii的mp3播放器设计



                                 本设计是基于STM32为控制器实现ucosii操作系统设计的MP3


实现的功能 有

l 可读取外部SD卡上的音乐文件包括MP3WAV,WMAmidi

l 可以播放上述文件通过vs1003解码后二集播放出来

l 通过按键实现播放、暂停,上、下曲功能,音量加减功能

 

实现上述功能我们要做的

l 用ucosii实现多任务的运行

l 读取按键值

l 嵌入fat文件系统

概述

    该外部解码采用VS1003芯片,该芯片可解码MP3WaVMIDI等多种语音格式,可以输出语音文件,也可以通过外部麦克风录入声音。支持SPI输入输出,速度可达384kbits/s。另语音文件由于过大,需要采用外部存储器,这里我们选用外部SD卡,可支持micro sd卡和大卡,存储容量大,摘取方便。Sd卡采用SPI通信,速度最大可达到30M,sd卡不同于一般的AT45DB系列的存储器件,虽然都是用SPI方式通信,但是AT45DB系列没有存储格式,windows不支持,而sd卡支持fat32存储格式,方便将文件从windows电脑直接拷贝到卡中去。而FAT32是一种而容易实现的文件格式,现在已经开源。

    此外本设计没有涉及到ucui的设计,原理大概就是从sdSPI2读取MP3WAV等格式的语音文件读出来经过stm32转换再通过SPI1送到VS1003解码,有vs1003解码成功后播放出声音,stm32外部按键输入实现播放暂停,上下曲,声音的加减。这些命令是通过stm32写给VS1003的。Stm32控制器频率可达到72M所以处理该任务是绰绰有余的。另外ucosii的嵌入也可以处理多线程任务。

MP3设计框图如下

1.jpg

下边分模块介绍

Mp3格式文件需要解码器这里我们选择价格便宜的vs1003

VS1003特性: 

●能解码MPEG 1MPEG2音频  层IIICBR+VBR+ABR);WMA  4.0/4.1/7/8/9  5-384kbps所有流文件;

WAV(PCM+IMA AD-PCM);产生MIDI/SP-MIDI 文件。 

●对话筒输入或线路输入的音频信号进行IMA ADPCM编码 

●支持MP3 WAV流 

●高低音控制 

●单时钟操作12..13MHz 

●内部PLL锁相环时钟倍频器 

●低功耗 

●内含高性能片上立体声数模转换器,两声道间无相位差 

●内含能驱动30欧负载的耳机驱动器 

●模拟,数字,I/O 单独供电 

●为用户代码和数据准备的5.5KB片上RAM 

●串行的控制,数据接口 

●可被用作微处理器的从机 

●特殊应用的SPI Flash引导 

●供调试用途的UART接口 

●新功能可以通过软件和4 GPIO 添加

VS1003概述: 

VS1003是一个单片MP3/WMA/MIDI音频解码器和ADPCM编码器。它包含一个高性能,自主产权的低功

DSP 处理器核VS_DSP

4

,工作数据存储器,为用户应用提供5KB的指令RAM0.5KB的数据RAM

串行的控制和数据接口,4个常规用途的I/O 口,一个UART,也有一个高品质可变采样率的ADC和立体

DAC,还有一个耳机放大器和地线缓冲器。 

VS1003通过一个串行接口来接收输入的比特流,它可以作为一个系统的从机。输入的比特流被解码,然后

通过一个数字音量控制器到达一个18位过采样多位ε-Δ DAC。通过串行总线控制解码器。除了基本的解

码,在用户RAM中它还可以做其他特殊应用,例如DSP音效处理。

 2.jpg

Sd卡模块

由于MCU没有专门的SD卡模式接口,只能通过SPI模式访问SD卡,电路图如图2.5所示:

                  3.jpg

                         图2.5  SD卡模块电路

因为SD卡使用的SPI模式,所以把SD卡挂接在MCUSPI2上面。SD卡的SPI通信必须在每个IO口都用一个40K左右的上拉电阻,这里选择45KSD卡的电路比较简单只要连接无误,一般都没有问题。STM32SPI口在72M时钟的条件下,SPI时钟速度可以达到惊人的18M,也就是SD卡的读写速度最快可以达到2.25Mbyte/s。足够播放任何音频格式了。

软件

 void  KEY_ScanTASK(void *p_arg)

 {

   while(1)

   {

    keyvalue=KEY_Scan();

   OSTimeDly(1);

   }

   

 }

 

 Void  MP3_PLAY(void *p_arg)//  

                                                          主循环

{  

        u8 i;

        SD_Init();  //初始化SD卡      

  while(FAT_Init())//FAT 错误

{

//LCD_ShowString(60,90,"FAT SYS ERROR");  

i= SD_Init();

if(i)//SD卡初始化 

{   

delay_ms(5);// LCD_ShowString(60,110,"SD_CARD ERROR");

}   

delay_ms(500);


}  

  while(1)

  {

      VS_Ram_Test();     

// Show_Str(60,90,"正弦波测试...",16,0);     

// LED1=0;

VS_Sine_Test();    

// Show_Str(60,90,"<<MP3播放器>>",16,0);     

Play_Music();

   //点亮LED

// OSTimeDly(20);

  }

}

 

MYXJ_20140822073407_org_副本.jpg



sitemap