基于STM32F103的MP3播放器设计Word文档格式.docx
《基于STM32F103的MP3播放器设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于STM32F103的MP3播放器设计Word文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
![基于STM32F103的MP3播放器设计Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/31/a2028397-0427-4958-b56d-ca6aac5c5744/a2028397-0427-4958-b56d-ca6aac5c57441.gif)
5月初5月中STM32SPI接口驱动程序VS1003B驱动程序设计
5月中5月底FATFS文件系统的移植,系统程序调试
特色与创新
1、VS1003B解码音质较好,播放流畅
2、FatFs文件系统移植简单,功能丰富,很适合SD卡文件管理
指导教师意见
教研室意见
学院意见
基于STM32的mp3播放器软件设计
学生:
吕凯,指导教师:
褚刚秀
(安徽农业大学信息与计算机学院合肥230036)
摘要:
本文介绍了基于STM32F103RBT微控制器开发板以及VS1003B解码芯片的MP3音乐播放器。
采用意法半导体的Cortex-M3内核的STM32系列作为核心控制芯片,管理及读取音乐数据,并将这些数据发送给VS1003B进行解码,同时接收外界命令。
系统采用大容量的SD卡作为存储部分,SD卡内部数据的管理与磁盘一样,使用了文件系统,用传统的单片机读取存储器的方式读取几M字节大小的MP3文件很难实现,因此文件系统的移植成为本系统的关键。
同时,VS1003B与SD卡的数据都是通过SPI通信与STM32进行交互,SPI通信也是设计中的关键。
该播放器在播放时没有出现理论上的断续情况,音质较好。
占用的软硬件资源也较少,为后续的扩展学习留下了很大空间。
关键词:
Cortex-M3,VS1003B,SD卡,FatFs文件系统,MP3播放器
1引言
MP3全称是动态影像专家压缩标准音频层面3(MovingPictureExpertsGroupAudioLayerIII)。
是当今较流行的一种数字音频编码和有损压缩格式,它设计用来大幅度地降低音频数据量,而对于大多数用户来说重放的音质与最初的不压缩音频相比没有明显的下降。
MP3格式有如下几个特点:
1.MP3是一个数据压缩格式。
2.它丢弃掉脉冲编码调制(PCM)音频数据中对人类听觉不重要的数据(类似于JPEG是一个有损图像压缩),从而达到了小得多的文件大小。
3.MP3音频可以按照不同的位速进行压缩,提供了在数据大小和声音质量之间进行权衡的一个范围。
MP3格式使用了混合的转换机制将时域信号转换成频域信号。
4.32波段多相积分滤波器(PQF)。
5.36或者12tap改良离散余弦滤波器(MDCT);
每个子波段大小可以在0...1和2...31之间独立选择。
6.MP3不仅有广泛的用户端软件支持,也有很多的硬件支持比如便携式媒体播放器(指MP3播放器)DVD和CD播放器。
本次设计的重点在于三个方面:
微控制器的使用和编程、VS1003B解码芯片的使用,文件系统的移植与其API调用。
控制器的使用和编程需要对单片机有着比较好的了解,本控制器嵌入了硬件SPI接口,对硬件的设计进行了不少的简化,硬件编程基于C语言,因为本设计采用的是较为基础的设计方案,控制器与外围芯片的连接方面可以参考芯片资料,。
VS1003B解码芯片的使用主要参考其英文资料,使得设计进度上有一定得难度,但是在进行使用的时候,资料里面推荐的典型应用电路图对设计起了不少的参考,使得设计难度大幅度减少。
文件系统的成功移植方便了读取SD卡里大量的内容,只需要调用本设计中移植的FatFs提供的API进行一系列文件操作。
文件系统的移植是这次设计中的重点内容,大量的阅读关于文件系统的文档及源代码扩展了我的视野更锻炼了我的代码快速阅读能力。
通过本毕业设计,增加了对英文资料的理解,更加深入的了解了单片机及其应用,同时也是对嵌入式应用的一个过渡,增加了自己不少的信心,难者不会,会者不难,所谓的困难,只是一个过程。
同时相信,对学工科的而言,严谨乃成功之母,这也是我最大的收获之一。
2设计思想
本系统主要实现的功能有:
从SD卡中读取16进制的MP3或WMA格式的语音数据,对这些数据解码并播放。
具体设计思路如图2-1所示。
命令或数据命令或数据
图2-1系统架构图
3系统硬件平台的介绍
本系统的硬件结构由STM32F103RBT6开发板,VS1003B解码芯片评估板组成,USB供电。
3.1微控制器及其理论介绍
3.1.1芯片总体描述
STM32F103RBT6增强型系列基于高性能的ARMCortex-M3[3]32位的RISC内核,工作频率72MHz,内置包高速存储器,包含128KFlash,20KRAM。
丰富的增强I/O端口和联接到两条APB总线的外设。
包含2个12位的ADC、3个通用16位定时器和一个PWM定时器,还包含标准和先进的通信接口:
多达两个I2C和SPI、3个USART[3]、1个USB和1个CAN,还有很实用的FSMC[3]总线接口,SDIO接口。
STM32F103RBT6增强型系列工作于-40℃至105℃的温度范围,供电电压2.0V至3.6V,一系列的省电模式保证低功耗应用的要求。
该芯片拥有64个引脚,其中51个引脚是IO引脚,每一个引脚都可以配置成中断输入接口,IO均支持位操作,端口可映射,先进的中断控制器NVIC[1]等等。
丰富的IO资源加上灵活内部结构和先进指令集的支持使设计变得更加容易。
3.1.2典型应用场合
销售终端;
身份识别设备;
工业自动化;
消费电子;
建筑安防/消防/HVAC;
医疗;
通信领域;
家电;
仪器仪表等。
3.1.3典型外设及接口
(1)SPI[3]串行外设接口
●3线全双工同步传输
●带或不带第三根双向数据线的双线单工同步传输
●8或16位传输帧格式选择
●主或从操作
●支持多主模式
●8个主模式波特率预分频系数(最大为fPCLK/2)
●从模式频率(最大为fPCLK/2)
●主模式和从模式的快速通信
●主模式和从模式下均可以由软件或硬件进行NSS管理:
主/从操作模式的动态改变
●可编程的时钟极性和相位
●可编程的数据顺序,MSB在前或LSB在前
●可触发中断的专用发送和接收标志
●SPI总线忙状态标志
●支持可靠通信的硬件CRC
-在发送模式下,CRC值可以被作为最后一个字节发送
-在全双工模式中对接收到的最后一个字节自动进行CRC校验
●可触发中断的主模式故障、过载以及CRC错误标志
●支持DMA功能的1字节发送和接收缓冲器:
产生发送和接受请求
图3-1SPI框图[3]
SPI引脚如图3-1,通常SPI通过4个引脚与外部器件相连:
●MISO:
主设备输入/从设备输出引脚。
该引脚在从模式下发送数据,在主模式下接收数据。
●MOSI:
主设备输出/从设备输入引脚。
该引脚在主模式下发送数据,在从模式下接收数据。
●SCK:
串口时钟,作为主设备的输出,从设备的输入
●NSS:
从设备选择。
这是一个可选的引脚,用来选择主/从设备。
它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。
从设备的NSS引脚可以由主设备的一个标准I/O引脚来驱动。
一旦被使能(SSOE位),NSS引脚也可以作为输出引脚,并在SPI处于主模式时拉低;
此时,所有的SPI设备,如果它们的NSS引脚连接到主设备的NSS引脚,则会检测到低电平,如果它们被设置为NSS硬件模式,就会自动进入从设备状态。
当配置为主设备、NSS配置为输入引脚(MSTR=1,SSOE=0)时,如果NSS被拉低,则这个SPI设备进入主模式失败状态:
即MSTR位被自动清除,此设备进入从模式
(2)GPIO[3]接口
STM32的输入输出管脚有下面8种可能的配置:
(4输入+2输出+2复用输出)
一、浮空输入_IN_FLOATING
二、带上拉输入_IPU
三、带下拉输入_IPD
四、模拟输入_AIN开漏输出_OUT_OD
五、推挽输出_OUT_PP
六、复用功能的推挽输出_AF_PP
七、复用功能的开漏输出_AF_OD
I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。
所有端口都有外部中断能力。
为了使用外部中断线,端口必须配置成输入模式。
GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。
3.2解码芯片
VS1003特性[2]:
●能解码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单独供电
●为用户代码和数据准备的5.5KB片上RAM
●串行的控制,数据接口
●可被用作微处理器的从机
●特殊应用的SPIFlash引导
●供调试用途的UART接口
●新功能可以通过软件和4GPIO添加
VS1003概述:
VS1003是一个单片MP3/WMA/MIDI音频解码器和ADPCM编码器。
它包含一个高性能,自主产权的低功耗DSP处理器核VS_DSP4,工作数据存储器,为用户应用提供5KB的指令RAM和0.5KB的数据RAM。
串行的控制和数据接口,4个常规用途的I/O口,一个UART,也有一个高品质可变采样率的ADC和立体声DAC,还有一个耳机放大器和地线缓冲器。
VS1003通过一个串行接口来接收输入的比特流,它可以作为一个系统的从机。
输入的比特流被解码,然后通过一个数字音量控制器到达一个18位过采样多位ε-ΔDAC。
通过串行总线控制解码器。
除了基本的解码,在用户RAM中它还可以做其他特殊应用,例如DSP音效处理。
图3-3VS1003内部结构与外部引脚
VS1003B与STM32F103RBT6的接线如图3-3
图3-4VS1003与单片机SPI2相连
3.3SD卡
SD卡(SecureDigitalMemoryCard[7])是一种为满足安全性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件。
SD卡内部结构及引脚如图3-4所示
图3-4SD卡内部结构及引脚[7]
由上图可知,SD卡由6线SD卡接口控制,包括:
CMD,CLK,DAT0~DAT3[7]。
SD卡允许在两种模式下工作,即SD模式和SPI模式,该系统采用SPI模式,使得系统软硬件都比较简单,不足是损失了速度。
当SD卡接到复位命令(CMD0)时,CS信号有效(低电平),那么启用SPI模式。
SPI模式引脚定义如图3-5
图3-5SPI模式引脚定义[7]
SD卡与STM32F103RBT6的接线如图3-6
图3-6SD卡与单片机的连接
4系统的软件设计
4.1开发和调试环境
本系统的软件开发与调试平台基于集成开发工具RealViewMDK专业版,它是由KeiluVision3开发环境,结合RealView编译器、uVision调试器和模拟器形成的集成开发环境。
支持ARM7、ARM9和最新的Cortex-M3核微控制器或微处理器,自动配置启动代码,集成Flash烧写模块,强大的Simulation设备模拟,性能分析等功能。
支持ULink、STLink、J-Link等多种调试手段,本系统的后期仿真调试采用J-Link仿真器,它是通过ARM芯片的JTAG边界扫描口进行的调试的设备。
JTAG仿真器比较便宜,连接方便,通过现有的JTAG边界扫描口与ARMCPU核通信,属于完全非插入式,它无需目标存储器,不占用目标系统的任何端口。
由于JTAG调试的目标程序是在目标板上执行,仿真更接近于与目标硬件。
使用集成开发环境配合JTAG仿真器进行嵌入式系统开发时目前很常用的一种调试方式。
4.2单片机程序设计
本系统的所有程序基于STM32提供的V3.3.0固件函数库,该函数库是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。
该函数库还包括每一个外设的驱动描述和应用实例。
通过使用本固件函数库,无需深入掌握细节,用户也可以轻松应用每一个外设。
因此,使用本固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。
4.2.1SPI驱动程序
时钟信号的相位和极性
SPI_CR寄存器的CPOL和CPHA位,能够组合成四种可能的时序关系。
CPOL(时钟极性)位控制在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。
如果CPOL被清0,SCK引脚在空闲状态保持低电平;
如果CPOL被置1,SCK引脚在空闲状态保持高电平。
如果CPHA(时钟相位)位被置1,SCK时钟的第二个边沿(CPOL位为0时就是下降沿,CPOL位为1时就是上升沿)进行数据位的采样,数据在第二个时钟边沿被锁存。
如果CPHA位被清0,SCK时钟的第一边沿(CPOL位为0时就是下降沿,CPOL位为1时就是上升沿)进行数据位采样,数据在第一个时钟边沿被锁存。
CPOL时钟极性和CPHA时钟相位的组合选择数据捕捉的时钟边沿。
图3.2显示了SPI传输的4种CPHA和CPOL位组合。
此图可以解释为主设备和从设备的SCK脚、MISO脚、MOSI脚直接连接的主或从时序图。
注意:
1.在改变CPOL/CPHA位之前,必须清除SPE位将SPI禁止。
2.主和从必须配置成相同的时序模式。
3.SCK的空闲状态必须和SPI_CR1寄存器指定的极性一致(CPOL为1时,空闲时应上拉SCK为高电平;
CPOL为0时,空闲时应下拉SCK为低电平)。
4.数据帧格式(8位或16位)由SPI_CR1寄存器的DFF位选择,并且决定发送/接收的数据长度。
图3-2数据时钟时序图
SPI驱动程序包括SPI1初始化函数,速度设置函数,读写一个字节的函数。
SPI初始化
由于VS1003与LPC2131在通信时是从机模式,故单片机STM32F103RBT6的SPI模式设置为主机模式,需要对SPI接口进行初始化,其初始化函数由voidSoilnit(void)实现。
如图4-1。
图4-1SPI接口初始化
SPI读写一个字节的函数设计
在接收时,接收到的数据被存放在一个内部的接收缓冲器中;
在发送时,在被发送之前,数据将首先被存放在一个内部的发送缓冲器中。
对SPI_DR寄存器的读操作,将返回接收缓冲器的内容;
写入SPI_DR寄存器的数据将被写入发送缓冲器中。
如图4-2
图4-2SPI读写字节函数
4.2.2SD卡驱动程序
SD卡底层程序主要完成对SD卡的最基本的数据块的操作,如对SD卡的初始化,使之进入SPI模式工作,进而实现对SD卡内存单元的读写访问。
主机与SD卡的各种通信都由主机控制,主机通过CMD线(SD模式下,SD卡引脚2)串行发给SD卡特定的命令,SD卡应答信号同样是通过CMD线由卡返送到主机。
对SD卡操作的所有命令长度都是6个字节,且发送时高位在前,其中,最后1个字节的高7位为CRC校验位,在SPI模式下,因无需CRC校验可以全部写入0。
上电后,SD卡自动进入SD模式。
主机置低CS端,并需要等待至少74个时钟周期,以便有足够的时间完成SD卡的上电复位过程。
主机向SD卡发送复位命令CMD0,这个命令必须要有CRC校验(此时仍为SD模式),如果主机读到SD卡有0x01的应答信号,则表明SD卡已进入SPI模式。
由于大容量SDHC的出现,SD1.x满足不了SDHC的容量要求,标准已经升级为SD2.0。
但也因此出现了许多电子设备无法驱动大容量SD卡的情况,如何识别SD1.x与SD2.0就显得尤为重要。
SD2.0的SPI模式初始化流程判断是否为SD2.0卡,CMD8(SD2.0新增的命令)是关键。
若卡是SD2.0,则发送CMD8将会返回0x01;
若是SD1.x,则返回0x05,这样就可以识别SD卡的类型。
SD1.x与SD2.0的最大不同在于命令地址的表示。
SD1.x的地址单位是字节,而SD2.0的地址单位是扇区,地址仍然采用32位4个字节来表示。
因此在读写操作时应该根据不同的卡对地址进行相应的处理,若是SD1.x则写入字节地址,若为SD2.0则写入扇区地址。
SD卡初始化流程图如图4-3:
忙
忙
不忙
CCS=1
CCS=0
图4-3SD卡初始化流程图
SD卡驱动程序提供多种底层函数供主程序与文件系统调用:
SD_SendCommand(u8cmd,u32arg,u8crc):
向SD卡发送一个命令。
输入:
u8cmd:
命令;
u32arg:
命令参数u8crc;
crc校验值:
返回值:
SD卡返回的响应
SD_ReceiveData(u8*data,u16len,u8release):
从SD卡中读回指定长度的数据,放置在给定位置。
u8*data(存放读回数据的内存>
len);
u16len(数据长度)
u8release(传输完成后是否释放总线CS置高0:
不释放1:
释放);
0:
NO_ERR;
other:
错误信息
SD_ReadSingleBlock(u32sector,u8*buffer):
读SD卡的一个block。
u32sector取地址(sector值,非物理地址)u8*buffer数据存储地址(大小至少512byte)返回值:
成功other:
失败
SD_WriteSingleBlock(u32sector,constu8*data):
写入SD卡的一个block。
u32sector扇区地址(sector值,非物理地址);
u8*buffer数据存储地址(大小至少512byte)返回值:
SD_ReadMultiBlock(u32sector,u8*buffer,u8count):
读SD卡的多个block。
u8*buffer数据存储地址(大小至少512byte);
u8count连续读count个block;
成功other:
SD_WriteMultiBlock(u32sector,constu8*data,u8count):
写入SD卡的N个block。
u32sector:
扇区地址(sector值,非物理地址);
u8*buffer数据存储地址(大小至少512byte);
u8count写入的block数目;
失败
SD_Read_Bytes(unsignedlongaddress,unsignedchar*buf,unsignedintoffset,unsignedintbytes):
在指定扇区,从offset开始读出bytes个字节;
u32sector扇区地址(sector值,非物理地址);
u8*buf数据存储地址(大小<
=512byte);
u16offset在扇区里面的偏移量;
u16bytes要读出的字节数
4.2.3FatFs文件系统的移植
(1)FatFs介绍
随着信息技术的发展,当今社会的信息量越来越大,以往由单片机构成的系统简单地对存储媒介按地址、按字节的读/写已经不能满足人们实际应用的需要,于是利用文件系统对存储媒介进行管理成了今后单片机系统的一个发展方向。
目前常用的文件系统主要有微软的FATl2、FATl6、FAT32、NTFS以及Linux系统下的EXT2和EXT3等。
由于微软Windows的广泛应用,在当前的消费类电子产品中,用得最多的还是FAT文件系统,如U盘、MP3、MP4和数码相机等,所以找到一款容易移植和使用、占用硬件资源相对较小而功能又强大的FAT开源文件系统,对于单片机系统设计者来说是很重要的。
FatFsModule是一种完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计。
它完全用标准C语言编写,且完全独立于I/O层,可以移植到8051、PIC、AVR、SH、Z80、H8和ARM等系列单片机上且只需做简单的修改。
它支持FATl2、FATl6和FAT32,支持多个存储媒介,有独立的缓冲区,可以对多个文件进行读/写。
FatFsModule一开始就是为了能在不同的单片机上使用而设计的,所以具有良好的层次结构,如图4-4所示。
图4-4FatFs层次结构
最顶层是应用层,使用者无需理会FatFsModule的内部结构和复杂的FAT协议,只需要调用FatFsModule提供给用户的一系列应用接口函数,如f_open[1],f_read,f_write和f_close等,就可以像在PC上读/写文件那样简单。
中间层FatFsModule实现了FAT文件读/写协议。
FatFsModule的完全版提供的是ff.c、ff.h,简化版Tiny-FatFs提供的是tff.c、tff.h。
除非有必要,使用者一般不用修改,使用时将需要版本的头文件直接包含进去即可。
需要使用者编写移植代码的是FatFsModule提供的底层接口,它包括存储媒介读/写接口DiskI/O和供给文件创建修改时间的实时时钟。
(2)FatFs[1]软件包中相关文件
平台无关
ffconf.hFatFs模块配置文件
ff.hFatFs和应用模块公用的包含文件
ff.cFatFs模块
diskio.hFatFsanddiskI/O模块公用的包含文件
integer.h数据类型定义
option可选的外部功能
平台相关(不属于FatFs需要由用户提供)
diskio.cFatFs与diskI/O模块接口层文件
(3