您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 基于STM32的MP3播放器设计与实现
《嵌入式系统原理》课程设计说明书题目:利用STM32实现MP3播放器院(系):信息与电气工程学院专业班级:通信二班学生姓名:周波学号:0904040209指导教师:罗朝辉2012年2月30日至2012年3月23日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/Byte67,6,5,0/31,0/7,00,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;iNumByteToRead;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;iNumByteToWrite;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将系统控制权交给它时,判断本分区
本文标题:基于STM32的MP3播放器设计与实现
链接地址:https://www.777doc.com/doc-6221165 .html