音乐播放器课程设计报告

上传人:沈*** 文档编号:89231646 上传时间:2022-05-12 格式:DOC 页数:25 大小:58.50KB
收藏 版权申诉 举报 下载
音乐播放器课程设计报告_第1页
第1页 / 共25页
音乐播放器课程设计报告_第2页
第2页 / 共25页
音乐播放器课程设计报告_第3页
第3页 / 共25页
资源描述:

《音乐播放器课程设计报告》由会员分享,可在线阅读,更多相关《音乐播放器课程设计报告(25页珍藏版)》请在装配图网上搜索。

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

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

3、的32位处理器有SAMSUNG、STM32、ATMEL等。选择MCU优先考虑于拥有丰富的RAM,八位机RAM主要靠扩展,内部RAM一般在4Kbyte以内,32位机里面,SAMSUNG一般不内带RAM,也要外扩。本实验使用了ARM7处理器,MP3解码可以有两种方法,一是通过ARM处理器软解码,通过对MP3数据格式的解析实现MP3播放,二是通过外部解码芯片直接解码。第一种方法在解码高码率的MP3时,ARM7处理能力吃紧,而且STM32还需要外部DAC来做音频输出,所以采用第二种方法进行解码。MP3常见的解码芯片有VS100*系列和STA01系列,STA01需要外接DAC做音频输出,而VS1003自

4、带DAC,且解码的文件格式包含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 T* DMA,使能 I2S 外设。 在库函数中初始化 I2S 调用的函数为:void I2S_Init(SPI_TypeDef* SPI*, 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_AudioF

6、req; uint16_t I2S_CPOL; I2S_InitTypeDef; 第一个参数用来设置 I2S 的模式,也就是设置 SPI_I2SCFGR 寄存器的 I2SCFG 相关位。可以配置为主模式发送 I2S_Mode_MasterT*,主模式接受 I2S_Mode_MasterR*,从模式发送 I2S_Mode_SlaveT* 以及从模式接受 I2S_Mode_SlaveR* 四种模式。第二个参数 I2S_Standard 用来设置 I2S 标准,这个前面已经讲解过。可以设置为:飞利浦 标准 I2S_Standard_Phillips,MSB 对齐标准 I2S_Standard_MSB

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

8、个参数 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_3

9、2k (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。

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

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

12、开启 DMA T* 传输,开始播放。3.3流程图3.4关键代码I2s.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,ENAB

13、LE); /复位SPI2RCC_APB1PeriphResetCmd(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.I

14、2S_AudioFreq=I2S_AudioFreq_Default;/IIS频率设置I2S_InitStructure.I2S_CPOL=I2S_Clock_Polarity;/空闲状态时钟电平I2S_Init(SPI2,&I2S_InitStructure);/初始化IISSPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_T*,ENABLE);/SPI2 T* DMA请求使能. I2S_Cmd(SPI2,ENABLE);/SPI2 I2S EN使能. /采样率计算公式:Fs=I2S*CLK/256*(2*I2SDIV+ODD)/I2S*CLK=(HSE/pllm)*PL

15、LI2SN/PLLI2SR/一般HSE=8Mhz /pllm:在Sys_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

16、,/22.05Khz采样率3200,213,2, 6,1,/32Khz采样率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

17、 i=0; u32 tempreg=0;samplerate/=10;/缩小10倍 for(i=0;iCR|=1CR&127)=0);/等待I2S时钟开启成功. tempreg=I2S_PSC_TBLi30;/设置I2SDIVtempreg|=I2S_PSC_TBLi48;/设置ODD位tempreg|=1I2SPR=tempreg;/设置I2SPR寄存器 return 0; /I2S2 T* DMA配置/设置为双缓冲模式,并开启DMA传输完成中断/buf0:M0AR地址./buf1:M1AR地址./num:每次传输数据量void I2S2_T*_DMA_Init(u8* buf0,u8 *b

18、uf1,u16 num) NVIC_InitTypeDef NVIC_InitStructure;DMA_InitTypeDef DMA_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);/DMA1时钟使能 DMA_DeInit(DMA1_Stream4);while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE)/等待DMA1_Stream1可配置 /* 配置 DMA Stream */ DMA_InitStructure.DMA_Channel = DMA_Channe

19、l_0; /通道0 SPI2_T*通道 DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI2-DR;/外设地址为:(u32)&SPI2-DR DMA_InitStructure.DMA_Memory0BaseAddr = (u32)buf0;/DMA 存储器0地址 DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;/存储器到外设模式 DMA_InitStructure.DMA_BufferSize = num;/数据传输量 DMA_InitStructure.DMA_Periphe

20、ralInc = DMA_PeripheralInc_Disable;/外设非增量模式 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;/存储器增量模式 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;/外设数据长度:16位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;/存储器数据长度:16位 DMA_InitStructure.DMA_Mod

21、e = DMA_Mode_Circular;/ 使用循环模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High;/高优先级 DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; /不使用FIFO模式 DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;/外设突发单次传输 DMA_Ini

22、tStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;/存储器突发单次传输 DMA_Init(DMA1_Stream4, &DMA_InitStructure);/初始化DMA StreamDMA_DoubleBufferModeConfig(DMA1_Stream4,(u32)buf1,DMA_Memory_0);/双缓冲模式配置 DMA_DoubleBufferModeCmd(DMA1_Stream4,ENABLE);/双缓冲模式开启 DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);/

23、开启传输完成中断NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0*00;/抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0*00;/子优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/使能外部中断通道 NVIC_Init(&NVIC_InitStructure);/配置 /I2S DMA回调函数指针vo

24、id (*i2s_t*_callback)(void);/T*回调函数 /DMA1_Stream4中断服务函数void DMA1_Stream4_IRQHandler(void) if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4)=SET)/DMA1_Stream4,传输完成标志 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4); i2s_t*_callback();/执行回调函数,读取数据等操作在这里面处理 /I2S开始播放void I2S_Play_Start(void) DMA_Cmd(DMA1_St

25、ream4,ENABLE);/开启DMA T*传输,开始播放 /关闭I2S播放void I2S_Play_Stop(void) DMA_Cmd(DMA1_Stream4,DISABLE);/关闭DMA,结束播放 wm8978代码:*include wm8978.h*include myiic.h*include delay.hstatic u16 WM8978_REGVAL_TBL58=0*0000,0*0000,0*0000,0*0000,0*0050,0*0000,0*0140,0*0000,0*0000,0*0000,0*0000,0*00FF,0*00FF,0*0000,0*0100,

26、0*00FF,0*00FF,0*0000,0*012C,0*002C,0*002C,0*002C,0*002C,0*0000,0*0032,0*0000,0*0000,0*0000,0*0000,0*0000,0*0000,0*0000,0*0038,0*000B,0*0032,0*0000,0*0008,0*000C,0*0093,0*00E9,0*0000,0*0000,0*0000,0*0000,0*0003,0*0010,0*0010,0*0100,0*0100,0*0002,0*0001,0*0001,0*0039,0*0039,0*0039,0*0039,0*0001,0*0001

27、; /WM8978初始化/返回值:0,初始化正常/ 其他,错误代码u8 WM8978_Init(void)u8 res;GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC, ENABLE);/使能外设GPIOB,GPIOC时 /PB12/13 复用功能输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode

28、_AF;/复用功能 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;/推挽 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;/100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;/上拉 GPIO_Init(GPIOB, &GPIO_InitStructure);/初始化/PC2/PC3/PC6复用功能输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_6; GPIO_Ini

29、tStructure.GPIO_Mode = GPIO_Mode_AF;/复用功能 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;/推挽 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;/100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;/上拉 GPIO_Init(GPIOC, &GPIO_InitStructure);/初始化GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_SPI2); /PB12

30、,AF5 I2S_LRCKGPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2);/PB13,AF5 I2S_SCLK GPIO_PinAFConfig(GPIOC,GPIO_PinSource3,GPIO_AF_SPI2);/PC3 ,AF5 I2S_DACDATA GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_SPI2);/PC6 ,AF5 I2S_MCKGPIO_PinAFConfig(GPIOC,GPIO_PinSource2,GPIO_AF6_SPI2);/PC2 ,AF6 I2S_A

31、DCDATA I2S2e*t_SD是AF6!IIC_Init();/初始化IIC接口res=WM8978_Write_Reg(0,0);/软复位WM8978if(res)return 1;/发送指令失败,WM8978异常/以下为通用设置WM8978_Write_Reg(1,0*1B);/R1,MICEN设置为1(MIC使能),BIASEN设置为1(模拟器工作),VMIDSEL1:0设置为:11(5K)WM8978_Write_Reg(2,0*1B0);/R2,ROUT1,LOUT1输出使能(耳机可以工作),BOOSTENR,BOOSTENL使能WM8978_Write_Reg(3,0*6C);

32、/R3,LOUT2,ROUT2输出使能(喇叭工作),RMI*,LMI*使能WM8978_Write_Reg(6,0);/R6,MCLK由外部提供WM8978_Write_Reg(43,14);/R43,INVROUT2反向,驱动喇叭WM8978_Write_Reg(47,18);/R47设置,PGABOOSTL,左通道MIC获得20倍增益WM8978_Write_Reg(48,18);/R48设置,PGABOOSTR,右通道MIC获得20倍增益WM8978_Write_Reg(49,11);/R49,TSDEN,开启过热保护 WM8978_Write_Reg(10,13);/R10,SOFTM

33、UTE关闭,128*采样,最佳SNR WM8978_Write_Reg(14,13);/R14,ADC 128*采样率return 0; /WM8978写寄存器/reg:寄存器地址/val:要写入寄存器的值 /返回值:0,成功;/ 其他,错误代码u8 WM8978_Write_Reg(u8 reg,u16 val) IIC_Start(); IIC_Send_Byte(WM8978_ADDR1)|0);/发送器件地址+写命令 if(IIC_Wait_Ack()return 1;/等待应答(成功/失败) IIC_Send_Byte(reg8)&0*01);/写寄存器地址+数据的最高位if(IIC

34、_Wait_Ack()return 2;/等待应答(成功/失败) IIC_Send_Byte(val&0*FF);/发送数据if(IIC_Wait_Ack()return 3;/等待应答(成功/失败) IIC_Stop();WM8978_REGVAL_TBLreg=val;/保存寄存器值到本地return 0; /WM8978读寄存器/就是读取本地寄存器值缓冲区内的对应值/reg:寄存器地址 /返回值:寄存器值u16 WM8978_Read_Reg(u8 reg) return WM8978_REGVAL_TBLreg; /WM8978 DAC/ADC配置/adcen:adc使能(1)/关闭(

35、0)/dacen:dac使能(1)/关闭(0)void WM8978_ADDA_Cfg(u8 dacen,u8 adcen)u16 regval;regval=WM8978_Read_Reg(3);/读取R3if(dacen)regval|=30;/R3最低2个位设置为1,开启DACR&DACLelse regval&=(30);/R3最低2个位清零,关闭DACR&DACL.WM8978_Write_Reg(3,regval);/设置R3regval=WM8978_Read_Reg(2);/读取R2if(adcen)regval|=30;/R2最低2个位设置为1,开启ADCR&ADCLelse

36、 regval&=(30);/R2最低2个位清零,关闭ADCR&ADCL.WM8978_Write_Reg(2,regval);/设置R2/WM8978 输入通道配置 /micen:MIC开启(1)/关闭(0)/lineinen:Line In开启(1)/关闭(0)/au*en:au*开启(1)/关闭(0) void WM8978_Input_Cfg(u8 micen,u8 lineinen,u8 au*en)u16 regval; regval=WM8978_Read_Reg(2);/读取R2if(micen)regval|=32;/开启INPPGAENR,INPPGAENL(MIC的PGA

37、放大)else regval&=(32);/关闭INPPGAENR,INPPGAENL. WM8978_Write_Reg(2,regval);/设置R2 regval=WM8978_Read_Reg(44);/读取R44if(micen)regval|=34|30;/开启LIN2INPPGA,LIP2INPGA,RIN2INPPGA,RIP2INPGA.else regval&=(34|30);/关闭LIN2INPPGA,LIP2INPGA,RIN2INPPGA,RIP2INPGA.WM8978_Write_Reg(44,regval);/设置R44if(lineinen)WM8978_LI

38、NEIN_Gain(5);/LINE IN 0dB增益else WM8978_LINEIN_Gain(0);/关闭LINE INif(au*en)WM8978_AU*_Gain(7);/AU* 6dB增益else WM8978_AU*_Gain(0);/关闭AU*输入 /WM8978 输出配置 /dacen:DAC输出(放音)开启(1)/关闭(0)/bpsen:Bypass输出(录音,包括MIC,LINE IN,AU*等)开启(1)/关闭(0) void WM8978_Output_Cfg(u8 dacen,u8 bpsen)u16 regval=0;if(dacen)regval|=10;/

39、DAC输出使能if(bpsen)regval|=11;/BYPASS使能regval|=5ADC输入部分的增益)/gain:063,对应-12dB35.25dB,0.75dB/Stepvoid WM8978_MIC_Gain(u8 gain)gain&=0*3F;WM8978_Write_Reg(45,gain);/R45,左通道PGA设置 WM8978_Write_Reg(46,gain|1ADC输入部分的增益)/gain:07,0表示通道禁止,17,对应-12dB6dB,3dB/Stepvoid WM8978_LINEIN_Gain(u8 gain)u16 regval;gain&=0*0

40、7;regval=WM8978_Read_Reg(47);/读取R47regval&=(74);/清除原来的设置 WM8978_Write_Reg(47,regval|gain4);/设置R47regval=WM8978_Read_Reg(48);/读取R48regval&=(74);/清除原来的设置 WM8978_Write_Reg(48,regval|gainADC输入部分的增益)/gain:07,0表示通道禁止,17,对应-12dB6dB,3dB/Stepvoid WM8978_AU*_Gain(u8 gain)u16 regval;gain&=0*07;regval=WM8978_Re

41、ad_Reg(47);/读取R47regval&=(70);/清除原来的设置 WM8978_Write_Reg(47,regval|gain0);/设置R47regval=WM8978_Read_Reg(48);/读取R48regval&=(70);/清除原来的设置 WM8978_Write_Reg(48,regval|gain0);/设置R48 /设置I2S工作模式/fmt:0,LSB(右对齐);1,MSB(左对齐);2,飞利浦标准I2S;3,PCM/DSP;/len:0,16位;1,20位;2,24位;3,32位; void WM8978_I2S_Cfg(u8 fmt,u8 len)fmt

42、&=0*03;len&=0*03;/限定*围WM8978_Write_Reg(4,(fmt3)|(len5);/R4,WM8978工作模式设置/设置耳机左右声道音量/voll:左声道音量(063)/volr:右声道音量(063)void WM8978_HPvol_Set(u8 voll,u8 volr)voll&=0*3F;volr&=0*3F;/限定*围if(voll=0)voll|=16;/音量为0时,直接muteif(volr=0)volr|=16;/音量为0时,直接mute WM8978_Write_Reg(52,voll);/R52,耳机左声道音量设置WM8978_Write_Reg

43、(53,volr|(18);/R53,耳机右声道音量设置,同步更新(HPVU=1)/设置喇叭音量/voll:左声道音量(063) void WM8978_SPKvol_Set(u8 vol*) vol*&=0*3F;/限定*围if(vol*=0)vol*|=16;/音量为0时,直接mute WM8978_Write_Reg(54,vol*);/R54,喇叭左声道音量设置WM8978_Write_Reg(55,vol*|(18);/R55,喇叭右声道音量设置,同步更新(SPKVU=1)/设置3D环绕声/depth:015(3D强度,0最弱,15最强)void WM8978_3D_Set(u8 d

44、epth) depth&=0*F;/限定*围 WM8978_Write_Reg(41,depth);/R41,3D环绕设置 /设置EQ/3D作用方向/dir:0,在ADC起作用/ 1,在DAC起作用(默认)void WM8978_EQ_3D_Dir(u8 dir)u16 regval; regval=WM8978_Read_Reg(0*12);if(dir)regval|=18;else regval&=(124)gain=24;gain=24-gain;regval=WM8978_Read_Reg(18);regval&=0*100;regval|=cfreq24)gain=24;gain=

45、24-gain; regval|=cfreq24)gain=24;gain=24-gain; regval|=cfreq24)gain=24;gain=24-gain; regval|=cfreq24)gain=24;gain=24-gain; regval|=cfreq5;/设置截止频率 regval|=gain;/设置增益 WM8978_Write_Reg(22,regval);/R22,EQ5设置 Main.c代码*include sys.h*include delay.h *include usart.h *include led.h*include lcd.h*include key

46、.h *include usmart.h *include malloc.h *include w25q*.h *include sdio_sdcard.h*include ff.h *include e*funs.h *include fontupd.h*include te*t.h *include wm8978.h *include audioplay.h/ALIENTEK 探索者STM32F407开发板 实验43/音乐播放器 实验 -库函数版本/技术支持:.openedv./淘宝店铺:eboard.taobao./*市星翼电子科技* /作者:正点原子 ALIENTEK int main

47、(void) delay_init(168);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/设置系统中断优先级分组2 /初始化延时函数uart_init(115200);/初始化串口波特率为115200LED_Init();/初始化LED usmart_dev.init(84);/初始化USMART LCD_Init();/LCD初始化 KEY_Init();/按键初始化 W25Q*_Init();/初始化W25Q128WM8978_Init();/初始化WM8978WM8978_HPvol_Set(40,40);/耳机音量设置WM8978_S

48、PKvol_Set(60);/喇叭音量设置my_mem_init(SRAMIN);/初始化内部内存池 my_mem_init(SRAMCCM);/初始化CCM内存池 e*funs_init();/为fatfs相关变量申请内存 f_mount(fs0,0:,1); /挂载SD卡 POINT_COLOR=BLACK; while(font_init() /检查字库 LCD_ShowString(30,50,200,16,16,Font Error!);delay_ms(200); LCD_Fill(30,50,240,66,WHITE);/清除显示 delay_ms(200); POINT_COL

49、OR=BLACK; Show_Str(60,50,200,16,E*plorer STM32F4开发板,16,0); Show_Str(60,70,200,16,MP3,16,0); Show_Str(60,90,200,16,实验者:陈斌,蒋文娟,16,0); Show_Str(60,130,200,16,KEY0:下一首 KEY2:上一首,16,0); Show_Str(60,150,200,16,KEY_UP:PAUSE/PLAY,16,0);while(1) audio_play(); 3.5下载验证四、心得体会通过本次实验,主要学习了 WAV 格式音频播放原理、数字音频接口及 IIS 总线接 口的相关知识。了解了模拟音频信号和数字音频信号的概念。掌握了编写音频播放器的方法并且实现了音频播放。本系统能够支持触摸屏操作,显示歌词等功能。此次的课程设计使我掌握那些自己不熟悉的硬件相关的知识点,做一个课程设计还需要注意很多方面,无论是格式,还是书写的内容和要表达的思想都得严格要求自己,所以做起来真的不算容易。但在解决问题的过程中会有成就感,也会看到自己的不足,在以后的学习中,我会不断的完善自我,不断进取,能使自己在编程这方面有一个大的发展。. z.

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!