基于stm32和ucosii的mp3播放器设计
本设计是基于STM32为控制器实现ucosii操作系统设计的MP3。
实现的功能 有
l 可读取外部SD卡上的音乐文件包括MP3,WAV,WMAmidi
l 可以播放上述文件通过vs1003解码后二集播放出来
l 通过按键实现播放、暂停,上、下曲功能,音量加减功能
实现上述功能我们要做的
l 用ucosii实现多任务的运行
l 读取按键值
l 嵌入fat文件系统
概述
该外部解码采用VS1003芯片,该芯片可解码MP3、WaV、MIDI等多种语音格式,可以输出语音文件,也可以通过外部麦克风录入声音。支持SPI输入输出,速度可达384kbits/s。另语音文件由于过大,需要采用外部存储器,这里我们选用外部SD卡,可支持micro sd卡和大卡,存储容量大,摘取方便。Sd卡采用SPI通信,速度最大可达到30多M,sd卡不同于一般的AT45DB系列的存储器件,虽然都是用SPI方式通信,但是AT45DB系列没有存储格式,windows不支持,而sd卡支持fat32存储格式,方便将文件从windows电脑直接拷贝到卡中去。而FAT32是一种而容易实现的文件格式,现在已经开源。
此外本设计没有涉及到ucui的设计,原理大概就是从sd中SPI2读取MP3、WAV等格式的语音文件读出来经过stm32转换再通过SPI1送到VS1003解码,有vs1003解码成功后播放出声音,stm32外部按键输入实现播放暂停,上下曲,声音的加减。这些命令是通过stm32写给VS1003的。Stm32控制器频率可达到72M所以处理该任务是绰绰有余的。另外ucosii的嵌入也可以处理多线程任务。
MP3设计框图如下
下边分模块介绍
Mp3格式文件需要解码器这里我们选择价格便宜的vs1003
VS1003特性:
●能解码MPEG 1和MPEG2音频 层III(CBR+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的指令RAM和0.5KB的数据RAM。
串行的控制和数据接口,4个常规用途的I/O 口,一个UART,也有一个高品质可变采样率的ADC和立体
声DAC,还有一个耳机放大器和地线缓冲器。
●VS1003通过一个串行接口来接收输入的比特流,它可以作为一个系统的从机。输入的比特流被解码,然后
通过一个数字音量控制器到达一个18位过采样多位ε-Δ DAC。通过串行总线控制解码器。除了基本的解
码,在用户RAM中它还可以做其他特殊应用,例如DSP音效处理。
Sd卡模块
由于MCU没有专门的SD卡模式接口,只能通过SPI模式访问SD卡,电路图如图2.5所示:
图2.5 SD卡模块电路
因为SD卡使用的SPI模式,所以把SD卡挂接在MCU的SPI2上面。SD卡的SPI通信必须在每个IO口都用一个40K左右的上拉电阻,这里选择45K。SD卡的电路比较简单只要连接无误,一般都没有问题。STM32的SPI口在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);
}
}