音乐播放器课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
课程设计名称:音乐播放器
院系:信息工程学院
学生姓名:
班级:
学号:
成绩:
指导教师:
开课时间:2016-2017 学年2 学期
音乐播放器
一、实践的内容和要求
1.1实验内容
学习WAV格式音频播放原理、数字音频接口及的相关知识。了解模拟音频信号和数字音频信号的概念。掌握编写音频播主要内容放器的方法。实现音频播放,小键盘输入操作。
1.2实验要求
本系统要做一个音乐播放器,使用通用定时器定时,用比较输出功能,输出乐谱频率的方波产生声音,对3 首歌曲编码,其支持WAV 格式音频播放(上键:暂停;
左键:上一首;右键:下一首)。利用硬件ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100开发实现实现音频播放。主要实现:上一首按键:当点击上一首按键时,当前播放歌曲的上一首歌首被播放。下一首按键:当点击下一首按键时,当前播放歌曲的下一首歌曲即被播放。当点击停止键时,当前歌曲即会被停止。播放界面设计:在歌曲进行播放时,界面应包含所有的按键,并且要歌曲的曲目单。
二、实践原理
WAV播放器系统要求能够对mp3、wav格式的音频文件进行解码,处理起来速度是有要求的,尤其是对320Kbps的MP3格式数据流的处理,必须非常快,才能实现MP3的流畅播放,可供选择的八位机有AVR、PIC,可供选择的32位处理器有SAMSUNG、STM32、ATMEL等。选择MCU优先考虑于拥有丰富的RAM,八位机RAM主要靠扩展,内部RAM一般在4Kbyte以内,32位机里面,SAMSUNG一般不
内带RAM,也要外扩。
本实验使用了ARM7处理器,MP3解码可以有两种方法,一是通过ARM处理器软解码,通过对MP3数据格式的解析实现MP3播放,二是通过外部解码芯片直接解码。第一种方法在解码高码率的MP3时,ARM7处理能力吃紧,而且STM32还需要外部DAC来做音频输出,所以采用第二种方法进行解码。MP3常见的解码芯片有VS100X系列和STA01系列,STA01需要外接DAC做音频输出,而VS1003自带DAC,且解码的文件格式包含mp3和wav,另外它还可以实现录音功能,方便以后进行功能的拓展应用。
三、实践步骤
3.1功能设计
开机后,先初始化各外设,然后检测字库文件夹是否存在,如果有问题,则提示Error,如果检测无问题,则开始循环播放SD卡内MUSIC 文件夹里面的歌曲,在TFTLCD 上显示歌曲名字、播放时间、歌曲总时间、歌曲数目、当前歌曲的编号等信息。KEY0选择下一首,KEY2 选择上一首,KEY_UP 控制暂停/继续播放。
3.2实验步骤
1)初始化WM8978,这个过程包括软复位、DAC 设置、输出设置和音量设置等。
2)初始化I2S,此过程主要设置SPI_I2SCFGR 寄存器,设置I2S 模式、I2S 标准、时钟空闲电平和数据帧长等,最后开启I2S TX DMA,使能I2S 外设。在库函数中初始化I2S 调用的函数为:void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef*
I2S_InitStruct); 结构体I2S_InitTypeDef 的定义为:
typedef struct
{ uint16_t I2S_Mode;
uint16_t I2S_Standard;
uint16_t I2S_DataFormat;
uint16_t I2S_MCLKOutput;
uint32_t I2S_AudioFreq;
uint16_t I2S_CPOL; }I2S_InitTypeDef;
第一个参数用来设置I2S 的模式,也就是设置SPI_I2SCFGR 寄存器的I2SCFG 相关位。可以配置为主模式发送I2S_Mode_MasterTx,主模式接受I2S_Mode_MasterRx,从模式发送I2S_Mode_SlaveTx 以及从模式接受I2S_Mode_SlaveRx 四种模式。第二个参数I2S_Standard 用来设置I2S 标准,这个前面已经讲解过。可以设置为:飞利浦标准I2S_Standard_Phillips,MSB 对齐标准I2S_Standard_MSB,LSB 对齐标准
I2S_Standard_LSB 以及PCM 标准I2S_Standard_PCMShort。第三个参数
I2S_DataFormat 用来设置I2S 的数据通信格式。这里实际包含设置SPI_I2SCFGR 寄存器的HCLEN 位(通道长度)以及DATLEN 位(传输的数据长度)。当我们设置为16 位标准格式I2S_DataFormat_16b 的时候,实际上传输的数据长度为16 位,通道长度为16 位。当我们设置为其他值的时候,通道长度都为32 位。第四个参数I2S_MCLKOutput 用来设置是否使能主时钟输出。我们实验会使能主时钟输出。第五个参数I2S_AudioFreq 用来设置I2S频率。实际根据输入的频率值,会来计算SPI 预分频寄存器SPI_I2SPR 的预分频奇数因子以及I2S 线性预分频器的值。这里支持10 中频率:
#define I2S_AudioFreq_192k ((uint32_t)192000)
#define I2S_AudioFreq_96k ((uint32_t)96000)
#define I2S_AudioFreq_48k ((uint32_t)48000)
#define I2S_AudioFreq_44k ((uint32_t)44100)
#define I2S_AudioFreq_32k ((uint32_t)32000)
#define I2S_AudioFreq_22k ((uint32_t)22050)
#define I2S_AudioFreq_16k ((uint32_t)16000)
#define I2S_AudioFreq_11k ((uint32_t)11025)
#define I2S_AudioFreq_8k ((uint32_t)8000)
#define I2S_AudioFreq_Default ((uint32_t)2)
第六个参数I2S_CPOL 用来设置空闲状态时钟电平,取值为高电平I2S_CPOL_High 以及低电平I2S_CPOL_Low。
3)解析WAV 文件,获取音频信号采样率和位数并设置I2S 时钟分频器这里,要先解析WAV 文件,取得音频信号的采样率(fs)和位数(16 位或32 位),根据这两个参数,来设置I2S 的时钟分频,这里我们用前面介绍的查表法来设置即可。这是我们单独写了一个设置频率的函数为I2S2_SampleRate_Set。
4)设置DMA I2S 播放音频的时候,一般都是通过DMA 来传输数据的,所以必须配置DMA,本章我们用I2S2,其TX是使用的DMA1 数据流4 的通道0 来传输的。并且STM32F4 的DMA 具有双缓冲机制,这样可以提高效率,大大方便了我们的数据传输,本章将DMA1 数据流4 设置为:双缓冲循环模式,外设和存储器都是16 位宽,并开启DMA 传输完成中断(方便填充数据)。
5)编写DMA 传输完成中断服务函数为了方便填充音频数据,我们使用DMA 传输完成中断,每当一个缓冲数据发送完后,硬件自动切换为下一个缓冲,同时进入中断服务函数,填充数据到发送完的这个缓冲。