ImageVerifierCode 换一换
格式:DOCX , 页数:9 ,大小:168KB ,
资源ID:5048052      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5048052.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(音乐播放器课程设计报告1.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

音乐播放器课程设计报告1.docx

1、音乐播放器课程设计报告1音乐播放器课程设计报告课程设计报告课程设计名称:音乐播放器院系:信息工程学院学生姓名:班级:学号:成绩:指导教师:开课时间:2016-2017 学年2 学期 音乐播放器 一、实践的内容和要求1.1实验内容学习WAV格式音频播放原理、数字音频接口及的相关知识。了解模拟音频信号和数字音频信号的概念。掌握编写音频播主要内容放器的方法。实现音频播放,小键盘输入操作。1.2实验要求本系统要做一个音乐播放器,使用通用定时器定时,用比较输出功能,输出乐谱频率的方波产生声音,对 3 首歌曲编码,其支持 WAV 格式音频播放(上键:暂停;左键:上一首;右键:下一首)。利用硬件ARM 嵌入

2、式开发平台、用于 ARM7TDMI 的 JTAG 仿真器、PC 机 Pentium100开发实现实现音频播放。主要实现:上一首按键:当点击上一首按键时,当前播放歌曲的上一首歌首被播放。下一首按键:当点击下一首按键时,当前播放歌曲的下一首歌曲即被播放。当点击停止键时,当前歌曲即会被停止。播放界面设计:在歌曲进行播放时,界面应包含所有的按键,并且要歌曲的曲目单。二、实践原理WAV播放器系统要求能够对mp3、wav格式的音频文件进行解码,处理起来速度是有要求的,尤其是对320Kbps的MP3格式数据流的处理,必须非常快,才能实现MP3的流畅播放,可供选择的八位机有AVR、PIC,可供选择的32位处理

3、器有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,且

4、解码的文件格式包含mp3和wav,另外它还可以实现录音功能,方便以后进行功能的拓展应用。 三、实践步骤 3.1功能设计开机后,先初始化各外设,然后检测字库文件夹是否存在,如果有问题,则提示Error,如果检测无问题,则开始循环播放 SD卡内MUSIC 文件夹里面的歌曲,在 TFTLCD 上显示歌曲名字、播放时间、歌曲总时间、歌曲数目、当前歌曲的编号等信息。KEY0选择下一首,KEY2 选择上一首,KEY_UP 控制暂停/继续播放。3.2实验步骤1)初始化 WM8978,这个过程包括软复位、DAC 设置、输出设置和音量设置等。2)初始化 I2S,此过程主要设置 SPI_I2SCFGR 寄存器,设

5、置 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_

6、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_Sta

7、ndard_LSB 以及 PCM 标准 I2S_Standard_PCMShort。第三个参数 I2S_DataFormat 用来设置 I2S 的数据通信格式。这里实际包含设置 SPI_I2SCFGR 寄存器的 HCLEN 位(通道长度)以及 DATLEN 位(传输的数据长度)。当我们设置为 16 位标准格式I2S_DataFormat_16b 的时候,实际上传输的数据长度为 16 位,通道长度为 16 位。当我们设置为其他值的时候,通道长度都为 32 位。第四个参数 I2S_MCLKOutput用来设置是否使能主时钟输出。我们实验会使能主时钟输出。第五个参数 I2S_AudioFreq 用来

8、设置 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)#def

9、ine 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 文件,获取音频信号采样率和位数并设置

10、I2S 时钟分频器这里,要先解析 WAV 文件,取得音频信号的采样率(fs)和位数(16 位或 32 位),根据这两个参数,来设置 I2S 的时钟分频,这里我们用前面介绍的查表法来设置即可。这是我们单独写了一个设置频率的函数为 I2S2_SampleRate_Set。4)设置 DMA I2S 播放音频的时候,一般都是通过 DMA 来传输数据的,所以必须配置DMA,本章我们用 I2S2,其 TX是使用的 DMA1 数据流 4 的通道 0 来传输的。并且STM32F4 的 DMA 具有双缓冲机制,这样可以提高效率,大大方便了我们的数据传输,本章将 DMA1 数据流 4 设置为:双缓冲循环模式,外设

11、和存储器都是 16 位宽,并开启 DMA 传输完成中断(方便填充数据)。5)编写 DMA 传输完成中断服务函数为了方便填充音频数据,我们使用 DMA 传输完成中断,每当一个缓冲数据发送完后,硬件自动切换为下一个缓冲,同时进入中断服务函数,填充数据到发送完的这个缓冲。6)开启 DMA 传输,填充数据最后,我们就只需要开启 DMA 传输,然后及时填充 WAV 数据到 DMA 的两个缓存区即可。此时,就可以在 WM8978 的耳机和喇叭通道听到所播放音乐了。操作方法为: DMA_Cmd(DMA1_Stream4,ENABLE);/开启 DMA TX 传输,开始播放。 3.3流程图 3.4关键代码I2

12、s.c代码:#include i2s.h#include usart.hvoid I2S2_Init(u16 I2S_Standard,u16 I2S_Mode,u16 I2S_Clock_Polarity,u16 I2S_DataFormat)I2S_InitTypeDef I2S_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);/使能SPI2时钟RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE); /复位SPI2RCC_APB1PeriphResetCmd(

13、RCC_APB1Periph_SPI2,DISABLE);/结束复位I2S_InitStructure.I2S_Mode=I2S_Mode;/IIS模式I2S_InitStructure.I2S_Standard=I2S_Standard;/IIS标准I2S_InitStructure.I2S_DataFormat=I2S_DataFormat;/IIS数据长度 I2S_InitStructure.I2S_MCLKOutput=I2S_MCLKOutput_Disable;/主时钟输出禁止 I2S_InitStructure.I2S_AudioFreq=I2S_AudioFreq_Defaul

14、t;/IIS频率设置I2S_InitStructure.I2S_CPOL=I2S_Clock_Polarity;/空闲状态时钟电平I2S_Init(SPI2,&I2S_InitStructure);/初始化IISSPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);/SPI2 TX DMA请求使能.I2S_Cmd(SPI2,ENABLE);/SPI2 I2S EN使能./采样率计算公式:Fs=I2SxCLK/256*(2*I2SDIV+ODD)/I2SxCLK=(HSE/pllm)*PLLI2SN/PLLI2SR/一般HSE=8Mhz/pllm:在Sys_

15、Clock_Set设置的时候确定,一般是8/PLLI2SN:一般是192432/PLLI2SR:27/I2SDIV:2255/ODD:0/1/I2S分频系数表pllm=8,HSE=8Mhz,即vco输入频率为1Mhz/表格式:采样率/10,PLLI2SN,PLLI2SR,I2SDIV,ODDconst u16 I2S_PSC_TBL5=800 ,256,5,12,1, /8Khz采样率1102,429,4,19,0, /11.025Khz采样率1600,213,2,13,0, /16Khz采样率2205,429,4, 9,1, /22.05Khz采样率 3200,213,2, 6,1, /32

16、Khz采样率 4410,271,2, 6,0, /44.1Khz采样率4800,258,3, 3,1, /48Khz采样率8820,316,2, 3,1, /88.2Khz采样率9600,344,2, 3,1, /96Khz采样率17640,361,2,2,0, /176.4Khz采样率19200,393,2,2,0, /192Khz采样率;/设置IIS的采样率(MCKEN)/samplerate:采样率,单位:Hz/返回值:0,设置成功;1,无法设置.u8 I2S2_SampleRate_Set(u32 samplerate)u8 i=0;u32 tempreg=0;samplerate/=

17、10;/缩小10倍for(i=0;iif(samplerate=I2S_PSC_TBLi0)break;RCC_PLLI2SCmd(DISABLE);/先关闭PLLI2Sif(i=(sizeof(I2S_PSC_TBL)/10)return 1;/搜遍了也找不到RCC_PLLI2SConfig(u32)I2S_PSC_TBLi1,(u32)I2S_PSC_TBLi2);/设置I2SxCLK的频率(x=2) 设置PLLI2SN PLLI2SR RCC-CR|=1while(RCC-CR&1tempreg=I2S_PSC_TBLi3tempreg|=I2S_PSC_TBLi4tempreg|=1S

18、PI2-I2SPR=tempreg; /设置I2SPR寄存器 return 0;/I2S2 TX DMA配置/设置为双缓冲模式,并开启DMA传输完成中断/buf0:M0AR地址./buf1:M1AR地址./num:每次传输数据量void I2S2_TX_DMA_Init(u8* buf0,u8 *buf1,u16 num)NVIC_InitTypeDef NVIC_InitStructure;DMA_InitTypeDef DMA_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);/DMA1时钟使能DMA_DeIn

19、it(DMA1_Stream4);while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE)/等待DMA1_Stream1可配置/* 配置 DMA Stream */DMA_InitStructure.DMA_Channel = DMA_Channel_0; /通道0 SPI2_TX通道DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI2-DR;/外设地址为:(u32)&SPI2-DR DMA_InitStructure.DMA_Memory0BaseAddr = (u32)buf0;/DMA 存储器

20、0地址 DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;/存储器到外设模式DMA_InitStructure.DMA_BufferSize = num;/数据传输量DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;/外设非增量模式DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;/存储器增量模式DMA_InitStructure.DMA_PeripheralDataSize =DMA_Periph

21、eralDataSize_HalfWord;/外设数据长度:16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;/存储器数据长度:16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;/ 使用循环模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;/高优先级DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; /不使用FIFO模式DMA_InitStru

22、cture.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;/外设突发单次传输DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;/存储器突发单次传输DMA_Init(DMA1_Stream4, &DMA_InitStructure);/初始化DMA StreamDMA_DoubleBufferModeConfig(DMA1_Stream4,(

23、u32)buf1,DMA_Memory_0);/双缓冲模式配置DMA_DoubleBufferModeCmd(DMA1_Stream4,ENABLE);/双缓冲模式开启DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);/开启传输完成中断NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;/抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPrio

24、rity = 0x00;/子优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/使能外部中断通道 NVIC_Init(&NVIC_InitStructure);/配置/I2S DMA回调函数指针void (*i2s_tx_callback)(void); /TX回调函数/DMA1_Stream4中断服务函数void DMA1_Stream4_IRQHandler(void)if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4)=SET)/DMA1_Stream4,传输完成标志DMA_ClearITPend

25、ingBit(DMA1_Stream4,DMA_IT_TCIF4);i2s_tx_callback(); /执行回调函数,读取数据等操作在这里面处理/I2S开始播放void I2S_Play_Start(void)DMA_Cmd(DMA1_Stream4,ENABLE);/开启DMA TX传输,开始播放/关闭I2S播放void I2S_Play_Stop(void)DMA_Cmd(DMA1_Stream4,DISABLE);/关闭DMA,结束播放 wm8978代码:#include wm8978.h#include myiic.h#include delay.hstatic u16 WM897

26、8_REGVAL_TBL58=0X0000,0X0000,0X0000,0X0000,0X0050,0X0000,0X0140,0X0000, 0X0000,0X0000,0X0000,0X00FF,0X00FF,0X0000,0X0100,0X00FF, 0X00FF,0X0000,0X012C,0X002C,0X002C,0X002C,0X002C,0X0000, 0X0032,0X0000,0X0000,0X0000,0X0000,0X0000,0X0000,0X0000, 0X0038,0X000B,0X0032,0X0000,0X0008,0X000C,0X0093,0X00E9, 0X0000,0X0000,0X0000,0X0000,0X0003,0X0010,0X0010,0X0100, 0X0100,0X0002,0X0001,0X0001,0X0039,0X0039,0X0039,0X0039, 0X0001,0X0001;/WM8978初始化/返回值:0,初始化正常/ 其他,错误代码u8 WM8978_Init(void)u8 res;GPIO_InitTypeDef GPIO_InitStructure; -全文完-

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1