基于STM32的MP3播放器设计与实现_毕业设计论文

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《嵌入式系统原理》

课程设计说明书

题目:利用STM32实现MP3播放器院(系):信息与电气工程学院

STM32芯片应用实验设计任务书

第一种方案是简易声波播放器,仅使用STM103V100评估板,令计时器TIM4工作在PWM模式下,将wav格式的声波文件从SD卡中读出,由TIM4产生不同频率的方波通过低通滤波器和放大器送喇叭,如图1所示;第二种方案则是简易MP3播放器,还需要使用额外的解码芯片,将MP3格式的文件从SD卡读出,然后送解码芯片解码播放,如图2所示。本节将先介绍SD卡、FAT16文件格式、VS1003编解码器等关键部分,然后再分别给出两种设计方案的软件设计。

图1 简易声波播放器方案

图2 简易MP3 Player方案

1 SD卡的结构及读写方法

STM103V100评估板有SD连接器,其使用SPI总线与STM32处理器连

接,如图3所示。

图3 SD连接器与STM32处理器SPI连接图

SD卡(Secure Digital Memory Card)是一种为满足安全性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件,SD卡允许在两种模式下工作,即SD模式和SPI模式,本系统采用SPI模式。本小节仅简要介绍在SPI模式下,STM32处理器如何读写SD卡,如果读者如希望详细了解SD 卡,可以参考相关资料。SD卡内部结构及引脚如图4所示。

图4 SD卡内部结构及引脚

SD卡主要引脚和功能为:

CLK:时钟信号,每个时钟周期传输一个命令或数据位,频率可在0~25MHz 之间变化,SD卡的总线管理器可以不受任何限制的自由产生0~25MHz的频率;

CMD:双向命令和回复线,命令是一次主机到从卡操作的开始,命令可以是从主机到单卡寻址,也可以是到所有卡;回复是对之前命令的回答,回复可以来自单卡或所有卡;

DAT0~3:数据线,数据可以从卡传向主机也可以从主机传向卡。

SD卡以命令形式来控制SD卡的读写等操作。可根据命令对多块或单块进行读写操作。在SPI模式下其命令由6个字节构成,其中高位在前。SD卡命令的格式如表1所示,其中相关参数可以查阅SD卡规范。

--------------

表1 SPI命令格式

Byte 1/ Byte2-5/Byte 6

7,6,5,0/31,0/7,0

0,1/Command/Command Argument/CRC,1

------------------------------------

下面分别给出读写SD卡的两个函数:

读取SD卡函数u8 MSD_ReadBlock(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead);

/**************************************************************** *

* Function Name : MSD_ReadBlock

* Description : Reads a block of data from the MSD.

* Input : - pBuffer : pointer to the buffer that receives the data read

* from the MSD.

* - ReadAddr : MSD's internal address to read from.

* - NumByteToRead : number of bytes to read from the MSD.

* Output : None

* Return : The MSD Response:

- MSD_RESPONSE_FAILURE: Sequence failed

* - MSD_RESPONSE_NO_ERROR: Sequence succeed

***************************************************************** /

u8 MSD_ReadBlock(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead)

{

u32 i = 0;

u8 rvalue = MSD_RESPONSE_FAILURE;

/* MSD chip select low */

MSD_CS_LOW();

/* Send CMD17 (MSD_READ_SINGLE_BLOCK) to read one block */ MSD_SendCmd(MSD_READ_SINGLE_BLOCK, ReadAddr, 0xFF);

/* Check if the MSD acknowledged the read block command: R1 response (0x00: no errors) */

if (!MSD_GetResponse(MSD_RESPONSE_NO_ERROR))

{

/* Now look for the data token to signify the start of the data */

if (!MSD_GetResponse(MSD_START_DATA_SINGLE_BLOCK_READ)) {

/* Read the MSD block data : read NumByteToRead data */

for (i = 0; i < NumByteToRead; i++)

{

/* Save the received data */

*pBuffer = MSD_ReadByte();

/* Point to the next location where the byte read will be saved */ pBuffer++;

}

/* Get CRC bytes (not really needed by us, but required by MSD) */

相关文档
最新文档