《音乐播放器》PPT课件
- 格式:pptx
- 大小:2.14 MB
- 文档页数:23
课程设计报告课程设计名称:音乐播放器院系:信息工程学院学生姓名:班级:学号:成绩:指点教师:开课时光:2016-2017学年 2 学期音乐播放器一.实践的内容和请求进修WAV格局音频播放道理.数字音频接口及的相干常识.懂得模仿音频旌旗灯号和数字音频旌旗灯号的概念.控制编写音频播重要内容放器的办法.实现音频播放,小键盘输入操纵.本体系要做一个音乐播放器,运用通用准时器准时,用比较输出功效,输出曲谱频率的方波产生声音,对 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,别的它还可以实现灌音功效,便利以落后行功效的拓展运用.三.实践步调开机后,先初始化各外设,然后检测字库文件夹是否消失,假如有问题,则提醒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 传输完成中止,每当一个缓冲数据发送完后,硬件主动切换为下一个缓冲,同时进入中止办事函数,填充数据到发送完的这个缓冲.6)开启 DMA 传输,填充数据最后,我们就只须要开启 DMA 传输,然后实时填充 WAV 数据到 DMA 的两个缓存区即可.此时,就可以在 WM8978 的耳机和喇叭通道听到所播放音乐了.操纵办法为: DMA_Cmd(DMA1_Stream4,ENABLE);//开启 DMA TX 传输,开端播放.3.4症结代码I2s.c代码:#include "i2s.h"#include "usart.h"void 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(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_Default;//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_Clock_Set设置的时刻肯定,一般是8//PLLI2SN:一般是192~432//PLLI2SR:2~7//I2SDIV:2~255//ODD:0/1//I2S分频系数表@pllm=8,HSE=8Mhz,即vco输入频率为1Mhz //表格局:采样率/10,PLLI2SN,PLLI2SR,I2SDIV,ODDconst u16 I2S_PSC_TBL[][5]={{800 ,256,5,12,1},//8Khz采样率{1102,429,4,19,0},//11.025Khz采样率{1600,213,2,13,0},//16Khz采样率{3200,213,2, 6,1},//32Khz采样率{4800,258,3, 3,1},//48Khz采样率{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/=10;//缩小10倍for(i=0;i<(sizeof(I2S_PSC_TBL)/10);i++)//看看改采样率是否可以支撑{if(samplerate==I2S_PSC_TBL[i][0])break;}RCC_PLLI2SCmd(DISABLE);//先封闭PLLI2Sif(i==(sizeof(I2S_PSC_TBL)/10))return 1;//搜遍了也找不到RCC_PLLI2SConfig((u32)I2S_PSC_TBL[i][1],(u32)I2S_PSC_TBL[i][2]);//设置I2SxCLK的频率(x=2) 设置PLLI2SN PLLI2SRRCC->CR|=1<<26;//开启I2S时钟while((RCC->CR&1<<27)==0);//等待I2S时钟开启成功.tempreg=I2S_PSC_TBL[i][3]<<0;//设置I2SDIVtempreg|=I2S_PSC_TBL[i][4]<<8;//设置ODD位tempreg|=1<<9;//使能MCKOE位,输出MCKSPI2->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_DeInit(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->DRDMA_InitStructure.DMA_Memory0BaseAddr = (u32)buf0;//DMA 存储器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_PeripheralDataSize_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_InitStructure.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,(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_IRQChannelSubPriority = 0x00;//子优先级0NVIC_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_ClearITPendingBit(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.h"static u16 WM8978_REGVAL_TBL[58]={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;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_AF;//复用功效GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_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_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功效GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_SPI2); //PB12,AF5 I2S_LRCKGPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2);//PB13,AF5 I2S_SCLKGPIO_PinAFConfig(GPIOC,GPIO_PinSource3,GPIO_AF_SPI2);//PC3 ,AF5I2S_DACDATAGPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_SPI2);//PC6 ,AF5 I2S_MCKGPIO_PinAFConfig(GPIOC,GPIO_PinSource2,GPIO_AF6_SPI2);//PC2 ,AF6I2S_ADCDATA I2S2ext_SD是AF6!!!IIC_Init();//初始化IIC接口res=WM8978_Write_Reg(0,0);//软复位WM8978if(res)return 1;//发送指令掉败,WM8978平常//以下为通用设置WM8978_Write_Reg(1,0X1B);//R1,MICEN设置为1(MIC使能),BIASEN设置为1(模仿器工作),VMIDSEL[1:0]设置为:11(5K)WM8978_Write_Reg(2,0X1B0);//R2,ROUT1,LOUT1输出使能(耳机可以工作),BOOSTENR,BOOSTENL使能WM8978_Write_Reg(3,0X6C);//R3,LOUT2,ROUT2输出使能(喇叭工作),RMIX,LMIX使能WM8978_Write_Reg(6,0);//R6,MCLK由外部供给WM8978_Write_Reg(43,1<<4);//R43,INVROUT2反向,驱动喇叭WM8978_Write_Reg(47,1<<8);//R47设置,PGABOOSTL,左通道MIC获得20倍增益WM8978_Write_Reg(48,1<<8);//R48设置,PGABOOSTR,右通道MIC获得20倍增益WM8978_Write_Reg(49,1<<1);//R49,TSDEN,开启过热呵护WM8978_Write_Reg(10,1<<3);//R10,SOFTMUTE封闭,128x采样,最佳SNRWM8978_Write_Reg(14,1<<3);//R14,ADC 128x采样率return 0;}//WM8978写存放器//reg:存放器地址//val:要写入存放器的值//返回值:0,成功;// 其他,错误代码u8 WM8978_Write_Reg(u8 reg,u16 val){IIC_Start();IIC_Send_Byte((WM8978_ADDR<<1)|0);//发送器件地址+写敕令if(IIC_Wait_Ack())return 1;//等待应答(成功?/掉败?)IIC_Send_Byte((reg<<1)|((val>>8)&0X01));//写存放器地址+数据的最高位if(IIC_Wait_Ack())return 2;//等待应答(成功?/掉败?)IIC_Send_Byte(val&0XFF);//发送数据if(IIC_Wait_Ack())return 3;//等待应答(成功?/掉败?)IIC_Stop();WM8978_REGVAL_TBL[reg]=val;//保管存放器值到当地return 0;}//WM8978读存放器//就是读取当地存放器值缓冲区内的对应值//reg:存放器地址//返回值:存放器值u16 WM8978_Read_Reg(u8 reg){return WM8978_REGVAL_TBL[reg];}//WM8978 DAC/ADC设置装备摆设//adcen:adc使能(1)/封闭(0)//dacen:dac使能(1)/封闭(0)void WM8978_ADDA_Cfg(u8 dacen,u8 adcen){u16 regval;regval=WM8978_Read_Reg(3);//读取R3if(dacen)regval|=3<<0;//R3最低2个位设置为1,开启DACR&DACLelse regval&=~(3<<0);//R3最低2个位清零,封闭DACR&DACL.WM8978_Write_Reg(3,regval);//设置R3regval=WM8978_Read_Reg(2);//读取R2if(adcen)regval|=3<<0;//R2最低2个位设置为1,开启ADCR&ADCLelse regval&=~(3<<0);//R2最低2个位清零,封闭ADCR&ADCL.WM8978_Write_Reg(2,regval);//设置R2}//WM8978 输入通道设置装备摆设//micen:MIC开启(1)/封闭(0)//lineinen:Line In开启(1)/封闭(0)//auxen:aux开启(1)/封闭(0)void WM8978_Input_Cfg(u8 micen,u8 lineinen,u8 auxen){u16 regval;regval=WM8978_Read_Reg(2);//读取R2if(micen)regval|=3<<2;//开启INPPGAENR,INPPGAENL(MIC的PGA放大)else regval&=~(3<<2);//封闭INPPGAENR,INPPGAENL.WM8978_Write_Reg(2,regval);//设置R2regval=WM8978_Read_Reg(44);//读取R44if(micen)regval|=3<<4|3<<0;//开启LIN2INPPGA,LIP2INPGA,RIN2INPPGA,RIP2INPGA. else regval&=~(3<<4|3<<0);//封闭LIN2INPPGA,LIP2INPGA,RIN2INPPGA,RIP2INPGA. WM8978_Write_Reg(44,regval);//设置R44if(lineinen)WM8978_LINEIN_Gain(5);//LINE IN 0dB增益else WM8978_LINEIN_Gain(0);//封闭LINE INif(auxen)WM8978_AUX_Gain(7);//AUX 6dB增益else WM8978_AUX_Gain(0);//封闭AUX输入}//WM8978 输出设置装备摆设//dacen:DAC输出(放音)开启(1)/封闭(0)//bpsen:Bypass输出(灌音,包含MIC,LINE IN,AUX等)开启(1)/封闭(0) void WM8978_Output_Cfg(u8 dacen,u8 bpsen){u16 regval=0;if(dacen)regval|=1<<0;//DAC输出使能if(bpsen){regval|=1<<1;//BYPASS使能regval|=5<<2;//0dB增益}WM8978_Write_Reg(50,regval);//R50设置WM8978_Write_Reg(51,regval);//R51设置}//WM8978 MIC增益设置(不包含BOOST的20dB,MIC-->ADC输入部分的增益)void WM8978_MIC_Gain(u8 gain){gain&=0X3F;WM8978_Write_Reg(45,gain);//R45,左通道PGA设置WM8978_Write_Reg(46,gain|1<<8);//R46,右通道PGA设置}//WM8978 L2/R2(也就是Line In)增益设置(L2/R2-->ADC输入部分的增益)//gain:0~7,0暗示通道制止,1~7,对应-12dB~6dB,3dB/Stepvoid WM8978_LINEIN_Gain(u8 gain){u16 regval;gain&=0X07;regval=WM8978_Read_Reg(47);//读取R47regval&=~(7<<4);//消除本来的设置WM8978_Write_Reg(47,regval|gain<<4);//设置R47regval=WM8978_Read_Reg(48);//读取R48regval&=~(7<<4);//消除本来的设置WM8978_Write_Reg(48,regval|gain<<4);//设置R48}//WM8978 AUXR,AUXL(PWM音频部分)增益设置(AUXR/L-->ADC输入部分的增益) //gain:0~7,0暗示通道制止,1~7,对应-12dB~6dB,3dB/Stepvoid WM8978_AUX_Gain(u8 gain){u16 regval;gain&=0X07;regval=WM8978_Read_Reg(47);//读取R47regval&=~(7<<0);//消除本来的设置WM8978_Write_Reg(47,regval|gain<<0);//设置R47regval=WM8978_Read_Reg(48);//读取R48regval&=~(7<<0);//消除本来的设置WM8978_Write_Reg(48,regval|gain<<0);//设置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&=0X03;len&=0X03;//限制规模WM8978_Write_Reg(4,(fmt<<3)|(len<<5));//R4,WM8978工作模式设置}//设置耳机阁下声道音量//voll:左声道音量(0~63)//volr:右声道音量(0~63)void WM8978_HPvol_Set(u8 voll,u8 volr){voll&=0X3F;volr&=0X3F;//限制规模if(voll==0)voll|=1<<6;//音量为0时,直接muteif(volr==0)volr|=1<<6;//音量为0时,直接muteWM8978_Write_Reg(52,voll);//R52,耳机左声道音量设置WM8978_Write_Reg(53,volr|(1<<8));//R53,耳机右声道音量设置,同步更新(HPVU=1) }//设置喇叭音量//voll:左声道音量(0~63)void WM8978_SPKvol_Set(u8 volx){volx&=0X3F;//限制规模if(volx==0)volx|=1<<6;//音量为0时,直接muteWM8978_Write_Reg(54,volx);//R54,喇叭左声道音量设置WM8978_Write_Reg(55,volx|(1<<8));//R55,喇叭右声道音量设置,同步更新(SPKVU=1) }//设置3D围绕声//depth:0~15(3D强度,0最弱,15最强)void WM8978_3D_Set(u8 depth){depth&=0XF;//限制规模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(0X12);if(dir)regval|=1<<8;else regval&=~(1<<8);WM8978_Write_Reg(18,regval);//R18,EQ1的第9位控制EQ/3D偏向}//设置EQ1//cfreq:截止频率,0~3,分离对应:80/105/135/175Hz//gain:增益,0~24,对应-12~+12dBvoid WM8978_EQ1_Set(u8 cfreq,u8 gain){u16 regval;cfreq&=0X3;//限制规模if(gain>24)gain=24;gain=24-gain;regval=WM8978_Read_Reg(18);regval&=0X100;regval|=cfreq<<5;//设置截止频率regval|=gain;//设置增益WM8978_Write_Reg(18,regval);//R18,EQ1设置}//设置EQ2//cfreq:中间频率,0~3,分离对应:230/300/385/500Hz //gain:增益,0~24,对应-12~+12dBvoid WM8978_EQ2_Set(u8 cfreq,u8 gain){u16 regval=0;cfreq&=0X3;//限制规模if(gain>24)gain=24;gain=24-gain;regval|=cfreq<<5;//设置截止频率regval|=gain;//设置增益WM8978_Write_Reg(19,regval);//R19,EQ2设置}//设置EQ3//cfreq:中间频率,0~3,分离对应:650/850/1100/1400Hz //gain:增益,0~24,对应-12~+12dBvoid WM8978_EQ3_Set(u8 cfreq,u8 gain){u16 regval=0;cfreq&=0X3;//限制规模if(gain>24)gain=24;gain=24-gain;regval|=cfreq<<5;//设置截止频率regval|=gain;//设置增益WM8978_Write_Reg(20,regval);//R20,EQ3设置}//设置EQ4//cfreq:中间频率,0~3,分离对应:1800/2400/3200/4100Hz //gain:增益,0~24,对应-12~+12dBvoid WM8978_EQ4_Set(u8 cfreq,u8 gain){u16 regval=0;cfreq&=0X3;//限制规模if(gain>24)gain=24;gain=24-gain;regval|=cfreq<<5;//设置截止频率regval|=gain;//设置增益WM8978_Write_Reg(21,regval);//R21,EQ4设置}//设置EQ5//cfreq:中间频率,0~3,分离对应:5300/6900/9000/11700Hz //gain:增益,0~24,对应-12~+12dBvoid WM8978_EQ5_Set(u8 cfreq,u8 gain){u16 regval=0;cfreq&=0X3;//限制规模if(gain>24)gain=24;gain=24-gain;regval|=cfreq<<5;//设置截止频率regval|=gain;//设置增益WM8978_Write_Reg(22,regval);//R22,EQ5设置}#include "sys.h"#include "delay.h"#include "usart.h"#include "led.h"#include "lcd.h"#include "key.h"#include "usmart.h"#include "malloc.h"#include "w25qxx.h"#include "sdio_sdcard.h"#include "ff.h"#include "exfuns.h"#include "fontupd.h"#include "text.h"#include "wm8978.h"#include "audioplay.h"//ALIENTEK 摸索者STM32F407开辟板试验43//音乐播放器试验 -库函数版本//广州市星翼电子科技有限公司//作者:正点原子 @ALIENTEKint main(void){delay_init(168);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置体系中止优先级分组2 //初始化延时函数uart_init(115200);//初始化串口波特率为115200LED_Init();//初始化LEDusmart_dev.init(84);//初始化USMARTLCD_Init();//LCD初始化KEY_Init();//按键初始化W25QXX_Init();//初始化W25Q128WM8978_Init();//初始化WM8978WM8978_HPvol_Set(40,40);//耳机音量设置WM8978_SPKvol_Set(60);//喇叭音量设置my_mem_init(SRAMIN);//初始化内部内存池my_mem_init(SRAMCCM);//初始化CCM内存池exfuns_init();//为fatfs相干变量申请内存f_mount(fs[0],"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_COLOR=BLACK;Show_Str(60,50,200,16,"Explorer STM32F4开辟板",16,0);。
智能音乐播放器课程设计一、课程目标知识目标:1. 让学生了解智能音乐播放器的基本原理,掌握其硬件组成和软件编程的基础知识。
2. 使学生掌握音乐播放器中音阶、音色、节奏等音乐元素的相关概念及其在编程中的应用。
3. 帮助学生理解智能音乐播放器与其他电子设备的连接与互动方式。
技能目标:1. 培养学生运用所学的编程知识,设计并实现简单的音乐播放功能。
2. 提高学生动手实践能力,能够独立完成智能音乐播放器的组装和调试。
3. 培养学生团队协作和沟通能力,能够在小组合作中发挥各自优势,共同完成项目任务。
情感态度价值观目标:1. 培养学生对智能硬件设备和编程的兴趣,激发创新意识和探索精神。
2. 引导学生关注音乐艺术与科技结合的前沿动态,提高审美素养。
3. 培养学生珍惜团队合作成果,树立正确的价值观和责任感。
本课程针对的学生特点是具有一定电子知识和编程基础,对新鲜事物充满好奇心,喜欢动手实践。
课程性质为实践性、综合性、创新性,旨在通过项目式教学,让学生在动手实践中掌握知识,提高技能,培养情感态度价值观。
教学要求注重理论与实践相结合,鼓励学生创新思维,关注实际应用。
通过本课程的学习,学生将能够具备设计简单智能音乐播放器的能力,为后续相关课程打下坚实基础。
二、教学内容1. 理论知识:- 硬件组成:介绍智能音乐播放器的核心元件,如微控制器、音频解码器、存储器等。
- 软件编程:讲解编程语言基础,如C语言或Python,以及音乐编程的相关库和函数。
- 音乐元素:阐述音阶、音色、节奏等基本音乐概念及其在编程中的应用。
2. 实践操作:- 组装与调试:指导学生进行智能音乐播放器的组装,学习调试方法和技巧。
- 编程实践:通过编写程序,实现音乐播放、音量调节、曲目选择等功能。
- 项目制作:以小组形式,设计并完成一个具有创意的智能音乐播放器项目。
3. 教学大纲:- 第一周:智能音乐播放器硬件组成及功能介绍。
- 第二周:编程语言基础及音乐编程相关库的学习。
目录一、设计任务要求 ................................................................................................ - 2 -1、课程设计题目 ............................................................................................. - 2 -2、工程设计总述 ............................................................................................. - 4 -二、选择器件 .......................................................................................................... - 4 -三、功能模块 .......................................................................................................... - 4 -1.分频器(div) ............................................................................................... - 4 -2、计数器(notetabs)................................................................................... - 6 -3、选择模块(choice)................................................................................... - 7 -4、数据翻译模块(tontaba): ...................................................................... - 9 -5、译码器模块(deled) .............................................................................. - 10 -6、数控分频器模块(speakera)................................................................ - 14 -7、乐谱数据ROM(四个模块)................................................................. - 15 -四、总体设计电路图 ............................................................................................ - 21 -1、顶层设计的电路原理图 ........................................................................... - 21 -2、顶层设计的仿真结果: ........................................................................... - 22 -3、电路的顶层文件管脚分配图 ................................................................... - 22 -五、心得体会 ........................................................................................................ - 22 -音乐播放器课程设计一、设计任务要求1、课程设计题目设计一个乐曲演奏电路,能够自动播放2首音乐。