基于STM32的MP3播放器设计与实现毕业设计论文.docx
- 文档编号:12547117
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:32
- 大小:380.15KB
基于STM32的MP3播放器设计与实现毕业设计论文.docx
《基于STM32的MP3播放器设计与实现毕业设计论文.docx》由会员分享,可在线阅读,更多相关《基于STM32的MP3播放器设计与实现毕业设计论文.docx(32页珍藏版)》请在冰点文库上搜索。
基于STM32的MP3播放器设计与实现毕业设计论文
《嵌入式系统原理》
课程设计说明书
题目:
利用STM32实现MP3播放器
院(系):
信息与电气工程学院
STM32芯片应用实验设计任务书
一、设计题目
利用STM32处理器实现简易MP3Player的设计
二、设计主要内容
(1)广泛查找文献资料,认真研究,反复论证,精心设计技术方案。
(2)较为深入的掌握ARM处理器的体系结构、指令系统、编程方法,初步了解ARM应用系统的软硬件开发方法及手段,较熟练地掌握ARM处理器几种重要的片内外设(定时器、PLL、I2C、RTC等)的基本原理及编程方法,初步掌握ARM处理器外围电路的扩展方法。
(3)了解STM32、SPI接口、SD卡、TIMER、中断、FAT文件系统、USB等的应用。
(4)考虑简易声波播放器、简易MP3播放器两种方案实现。
三、原始资料
硬件资源:
STM32系统板、用于ARM处理器的JTAG仿真器、PC机Pentium100以上。
设计指导书:
STM32系统板配套光盘
四、要求的设计成果
(1)使用STM103V100评估板令计时器TIM4工作在PWM模式下,将wav格式的声波文件从SD卡中读出,由TIM4产生不同频率的方波通过低通滤波器和放大器送喇叭实现与通过额外解码芯片实现。
(2)撰写课程设计说明书,要求简洁、通顺,格式规范,设计方案正确,实现技术路线明确,论述内容完整、清楚、规范,数据、资料真实可靠,软件程序运行良好。
(3)要求有完整的电路设计原理图及软件源代码。
五、进程安排
(1)第1天:
任务布置及相关知识讲解
(2)第2-3天:
资料查阅与方案制定
(3)第4-8天:
硬件设计、程序编制与调试阶段
(4)第9天:
撰写设计报告
六、主要参考资料
[1]田泽.嵌入式系统开发与应用实验教程.北京航空航天工业大学出版社,2005.
[2]郭荣佐,王霖.《嵌入式系统原理》.北京航空航天大学出版社,.2008.
[3]周根林.嵌入式系统原理与应用.南京大学出版社,2006.
[4]谭浩强.C语言程序设计(第2版).清华大学出版社,2008
[5]丁峰.ARM系统开发——从实践到提高.中国电力出版社,2007.
指导教师(签名):
20年月日
第一种方案是简易声波播放器,仅使用STM103V100评估板,令计时器TIM4工作在PWM模式下,将wav格式的声波文件从SD卡中读出,由TIM4产生不同频率的方波通过低通滤波器和放大器送喇叭,如图1所示;第二种方案则是简易MP3播放器,还需要使用额外的解码芯片,将MP3格式的文件从SD卡读出,然后送解码芯片解码播放,如图2所示。
本节将先介绍SD卡、FAT16文件格式、VS1003编解码器等关键部分,然后再分别给出两种设计方案的软件设计。
图1简易声波播放器方案
图2简易MP3Player方案
1SD卡的结构及读写方法
STM103V100评估板有SD连接器,其使用SPI总线与STM32处理器连接,如图3所示。
图3SD连接器与STM32处理器SPI连接图
SD卡(SecureDigitalMemoryCard)是一种为满足安全性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件,SD卡允许在两种模式下工作,即SD模式和SPI模式,本系统采用SPI模式。
本小节仅简要介绍在SPI模式下,STM32处理器如何读写SD卡,如果读者如希望详细了解SD卡,可以参考相关资料。
SD卡内部结构及引脚如图4所示。
图4SD卡内部结构及引脚
SD卡主要引脚和功能为:
⏹ CLK:
时钟信号,每个时钟周期传输一个命令或数据位,频率可在0~25MHz之间变化,SD卡的总线管理器可以不受任何限制的自由产生0~25MHz的频率;
⏹ CMD:
双向命令和回复线,命令是一次主机到从卡操作的开始,命令可以是从主机到单卡寻址,也可以是到所有卡;回复是对之前命令的回答,回复可以来自单卡或所有卡;
⏹ DAT0~3:
数据线,数据可以从卡传向主机也可以从主机传向卡。
SD卡以命令形式来控制SD卡的读写等操作。
可根据命令对多块或单块进行读写操作。
在SPI模式下其命令由6个字节构成,其中高位在前。
SD卡命令的格式如表1所示,其中相关参数可以查阅SD卡规范。
--------------
表1SPI命令格式
Byte1/Byte2-5/Byte6
7,6,5,0/31,0/7,0
0,1/Command/CommandArgument/CRC,1
------------------------------------
下面分别给出读写SD卡的两个函数:
⏹ 读取SD卡函数u8MSD_ReadBlock(u8*pBuffer,u32ReadAddr,u16NumByteToRead);
/*****************************************************************
*FunctionName:
MSD_ReadBlock
*Description :
ReadsablockofdatafromtheMSD.
*Input :
-pBuffer:
pointertothebufferthatreceivesthedataread
* fromtheMSD.
* -ReadAddr:
MSD'sinternaladdresstoreadfrom.
* -NumByteToRead:
numberofbytestoreadfromtheMSD.
*Output :
None
*Return :
TheMSDResponse:
-MSD_RESPONSE_FAILURE:
Sequencefailed
* -MSD_RESPONSE_NO_ERROR:
Sequencesucceed
*****************************************************************/
u8MSD_ReadBlock(u8*pBuffer,u32ReadAddr,u16NumByteToRead)
{
u32i=0;
u8rvalue=MSD_RESPONSE_FAILURE;
/*MSDchipselectlow*/
MSD_CS_LOW();
/*SendCMD17(MSD_READ_SINGLE_BLOCK)toreadoneblock*/
MSD_SendCmd(MSD_READ_SINGLE_BLOCK,ReadAddr,0xFF);
/*CheckiftheMSDacknowledgedthereadblockcommand:
R1response(0x00:
noerrors)*/
if(!
MSD_GetResponse(MSD_RESPONSE_NO_ERROR))
{
/*Nowlookforthedatatokentosignifythestartofthedata*/
if(!
MSD_GetResponse(MSD_START_DATA_SINGLE_BLOCK_READ))
{
/*ReadtheMSDblockdata:
readNumByteToReaddata*/
for(i=0;i { /*Savethereceiveddata*/ *pBuffer=MSD_ReadByte(); /*Pointtothenextlocationwherethebytereadwillbesaved*/ pBuffer++; } /*GetCRCbytes(notreallyneededbyus,butrequiredbyMSD)*/ MSD_ReadByte(); MSD_ReadByte(); /*Setresponsevaluetosuccess*/ rvalue=MSD_RESPONSE_NO_ERROR; } } /*MSDchipselecthigh*/ MSD_CS_HIGH(); /*Senddummybyte: 8Clockpulsesofdelay*/ MSD_WriteByte(DUMMY); /*Returnsthereponse*/ returnrvalue; } ⏹ 写读取SD卡函数u8MSD_WriteBlock(u8*pBuffer,u32WriteAddr,u16NumByteToWrite) /***************************************************************** *FunctionName: MSD_WriteBlock *Description : WritesablockontheMSD *Input : -pBuffer: pointertothebuffercontainingthedatatobe * writtenontheMSD. * -WriteAddr: addresstowriteon. * -NumByteToWrite: numberofdatatowrite *Output : None *Return : TheMSDResponse: -MSD_RESPONSE_FAILURE: Sequencefailed * -MSD_RESPONSE_NO_ERROR: Sequencesucceed *****************************************************************/ u8MSD_WriteBlock(u8*pBuffer,u32WriteAddr,u16NumByteToWrite) { u32i=0; u8rvalue=MSD_RESPONSE_FAILURE; /*MSDchipselectlow*/ MSD_CS_LOW(); /*SendCMD24(MSD_WRITE_BLOCK)towritemultipleblock*/ MSD_SendCmd(MSD_WRITE_BLOCK,WriteAddr,0xFF); /*CheckiftheMSDacknowledgedthewriteblockcommand: R1response(0x00: noerrors)*/ if(! MSD_GetResponse(MSD_RESPONSE_NO_ERROR)) { /*Sendadummybyte*/ MSD_WriteByte(DUMMY); /*Sendthedatatokentosignifythestartofthedata*/ MSD_WriteByte(0xFE); /*WritetheblockdatatoMSD: writecountdatabyblock*/ for(i=0;i { /*Sendthepointedbyte*/ MSD_WriteByte(*pBuffer); /*Pointtothenextlocationwherethebytereadwillbesaved*/ pBuffer++; } /*PutCRCbytes(notreallyneededbyus,butrequiredbyMSD)*/ MSD_ReadByte(); MSD_ReadByte(); /*Readdataresponse*/ if(MSD_GetDataResponse()==MSD_DATA_OK) { rvalue=MSD_RESPONSE_NO_ERROR; } } /*MSDchipselecthigh*/ MSD_CS_HIGH(); /*Senddummybyte: 8Clockpulsesofdelay*/ MSD_WriteByte(DUMMY); /*Returnsthereponse*/ returnrvalue; } 2FAT16文件系统简介 SD卡如果采用FAT16文件格式,按照其不同的特点和作用大致可分为5部分: MBR区、DBR区、FAT区、FDT区和DATA区。 由于SD卡一般不做引导盘,一般也不分区,因此通常无MBR区,直接从DBR区开始。 下面对后面四个区分别作简介: ⏹ DBR区 内容为系统引导记录,它包括一个引导程序和一个被称为BPB(BiosParameterBlock)的本分区参数记录表。 引导程序的主要任务是当MBR将系统控制权交给它时,判断本分区根目录是否有操作系统引导文件,如果有则将其读入内存,并把控制权交给该文件。 BPB参数块记录着本分区的起始扇区、结束扇区、文件存储格式、根目录大小、FAT个数,分配单元大小等重要参数。 本系统采用的DBR结构为: typedef__packedstruct {/*由于Cortex-M3内核默认以对齐方式访问,因此可能导致结构体元素之间有“空隙”,读出的结构体元素有误,因此需要加上关键字__packed,强制其以压缩方式存储结构体。 这样该结构体在内存空间上是一片连续的空间,不存在“空隙”情况。 其它地方同理*/ u8 BS_jmpBoot[3]; //ofs: 0.典型的如: 0xEB,0x3E,0x90 u8 BS_OEMName[8]; //ofs: 3.典型的如: “MSWIN4.1” u16 BPB_BytesPerSec; //ofs: 11.每扇区字节数 u8 BPB_SecPerClus; //ofs: 13.每簇扇区数 u16 BPB_RsvdSecCnt; //ofs: 14.保留扇区数,从DBR到FAT的扇区数 u8 BPB_NumFATs; //ofs: 16.FAT的个数,通常为2 u16 BPB_RootEntCnt; //ofs: 17.根目录项数 u16 BPB_TotSec16; //ofs: 19.分区总扇区数(<32M时用) u8 BPB_Media; //ofs: 21.分区介质标识,SD卡一般用0xF8 u16 BPB_FATSz16; //ofs: 22.每个FAT占的扇区数 u16 BPB_SecPerTrk; //ofs: 24.每道扇区数,对于SD卡无意义 u16 BPB_NumHeads; //ofs: 26.磁头数,对于SD卡无意义 u32 BPB_HiddSec; //ofs: 28.隐藏扇区数,从MBR到DBR的扇区数 u32 BPB_TotSec32; //ofs: 32.分区总扇区数(≥32M时用) u8 BS_DrvNum; //ofs: 36.软盘: 0x00,硬盘: 0x80,SD卡无意义 u8 BS_Reservedl; //ofs: 37.保留 u8 BS_BootSig; //ofs: 38.扩展引导标记: 0x29,通常对于SD卡无意义 u32 BS_VolID; //ofs: 39.盘序列号 u8 BS_VolLab[11]; //ofs: 43.如“Msdos” u8 BS_FilSysType[8]; //ofs: 54.“FAT16” u8 ExecutableCode[448]; //ofs: 62.引导代码 u8 ExecutableMarker[2]; //ofs: 510.结束标识: 0xAA55 }FAT_BPB; ⏹ FAT区 该区内容为文件分配表,FAT16文件系统进行空间分配的最基本单位是簇。 文件分配表反映了SD卡所有簇的使用情况,通过查文件分配表可以得知任一簇的使用情况。 对于FAT16来说,FAT表每项占用两个字节。 FAT表的第一项通常为FFF8H。 对于其它项,若其值为0000H表示可用;FFF7H表示为坏簇;FFF8H-FFFFH之间表示该簇为某文件或目录的最后一个簇,FFF0H-FFF6H之间为保留值;其它值则指示下一个簇的簇号。 ⏹ FDT区 该区的内容为文件目录表,FAT文件系统的一个重要思想是把目录(文件夹)当作一个特殊的文件来处理,FAT32甚至将根目录当作文件处理。 FAT分区中所有目录文件,实际上可以看作是一个存放其它文件(文件夹)入口参数的数据表。 因此,目录占用空间的大小并不等同于其下所有数据的大小,但也不等于0,通常是占很小的空间。 其具体的存储原理是: 不管目录文件所占空间为多少簇,一簇为多少扇区、多少字节;系统都会以32个字节为单位,进行目录文件所占簇的分配。 本系统目录项使用的结构体如下: typedef__packedstruct { u8 FileName[8]; //ofs: 0.文件名 u8 ExtName[3]; //ofs: 8.扩展名 u8 Attribute; //ofs: 11.文件属性。 典型值: 存档(0x20)、卷标(0x08) u8 Reserved[10]; //ofs: 21.保留 u16 Time; //ofs: 22.时间 u16 Data; //ofs: 24.日期 u16 StartClus; //ofs: 26.开始簇号 u32 FileLength; //ofs: 28.文件长度 }DIR; 由于篇幅关系,这里不能对上面各字段进行一一介绍。 本系统支持长文件名和汉字显示,如果使用短文件名,则以ASCII编码;当文件名超过8个字节,扩展名超过3字节时,就以长文件名的形式存储,长文件名中的字符采用UNICODE形式编码,每个字符占据2个字节的空间,其目录项中偏移为11的字节即Attribute字段为0FH。 在存储时将长文件名以13个字符为单位进行切割,每一组占据一个目录项,所以可能一个文件需要多个目录项,这时长文件名的各个目录项按倒序排列在目录表中,以防与其他文件名混淆。 本系统采用串口作为输入输出接口,通过在PC的超级终端中输入命令来对其进行控制,并在超级终端中显示输出的结果,如路径、目录列表、文件名等相关信息。 超级终端输入输出的汉字以GB2312编码、输入输出英文字符以ASCII编码,而长文件名以UNICODE编码。 因此需要将UNICODE编码转化为GB2312或ASCII编码来和用户交互。 这里使用一张排序二维表,里面有7000多个汉字UNICODE编码对应的GB2312编码。 这里查找算法采用二分查找算法,大大提高了查找效率,这对于嵌入式应用很关键。 ⏹ DATA区 该数据区存放文件的内容,SD卡所占用的空间绝大部分为此部分。 如果文件长度大于一个簇的大小,需要多个簇存放该文件,这些放通过FAT链表串连起来。 3VS1003-MP3/WMA音频编解码器简介 VS1003是由芬兰VLSISolutionOy公司所设计的一款单片MP3/WMA/MIDI音频解码器和ADPCM编码器,它包含一个高性能、自主产权的低功耗DSP处理器核VS_DSP4。 该芯片内部结构如图5所示,其特点如下: 图5VS1003内部结构及引脚 ⏹ 可解码MPEG1和MPEG2音频层III(CBR+VBR+ABR)、WMA4.0/4.1/7/8/95-384kbps所有流文件;WAV(PCM+IMAAD-PCM),可产生MIDI/SP-MIDI文件; ⏹ 可对话筒输入或线路输入的音频信号进行IMAADPCM编码; ⏹ 支持MP3和WAV流; ⏹ 高音、低音控制; ⏹ 单时钟操作(12..13MHz); ⏹ 内部PLL锁相环时钟倍频器; ⏹ 低功耗 ⏹ 内含高性能片上立体声数模转换器,两声道间无相位差; ⏹ 内含能驱动30欧负载的耳机驱动器; ⏹ 模拟、数字、I/O单独供
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STM32 MP3 播放 设计 实现 毕业设计 论文