



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、音乐播放器课程设计报告课程设计报告课程设计名称:音乐播放器院系:信息工程学院学生姓名:班级:学号:成绩:指导教师:开课时间:2016-2017 学年2 学期 音乐播放器 一、实践的内容和要求1.1实验内容学习wav格式音频播放原理、数字音频接口及的相关知识。了解模拟音频信号和数字音频信号的概念。掌握编写音频播主要内容放器的方法。实现音频播放,小键盘输入操作。1.2实验要求本系统要做一个音乐播放器,使用通用定时器定时,用比较输出功能,输出乐谱频率的方波产生声音,对 3 首歌曲编码,其支持 wav 格式音频播放(上键:暂停;左键:上一首;右键:下一首)。利用硬件arm 嵌入式开发平台、用于 arm
2、7tdmi 的 jtag 仿真器、pc 机 pentium100开发实现实现音频播放。主要实现:上一首按键:当点击上一首按键时,当前播放歌曲的上一首歌首被播放。下一首按键:当点击下一首按键时,当前播放歌曲的下一首歌曲即被播放。当点击停止键时,当前歌曲即会被停止。播放界面设计:在歌曲进行播放时,界面应包含所有的按键,并且要歌曲的曲目单。二、实践原理wav播放器系统要求能够对mp3、wav格式的音频文件进行解码,处理起来速度是有要求的,尤其是对320kbps的mp3格式数据流的处理,必须非常快,才能实现mp3的流畅播放,可供选择的八位机有avr、pic,可供选择的32位处理器有samsung、st
3、m32、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
4、和wav,另外它还可以实现录音功能,方便以后进行功能的拓展应用。 三、实践步骤 3.1功能设计开机后,先初始化各外设,然后检测字库文件夹是否存在,如果有问题,则提示error,如果检测无问题,则开始循环播放 sd卡内music 文件夹里面的歌曲,在 tftlcd 上显示歌曲名字、播放时间、歌曲总时间、歌曲数目、当前歌曲的编号等信息。key0选择下一首,key2 选择上一首,key_up 控制暂停/继续播放。3.2实验步骤1)初始化 wm8978,这个过程包括软复位、dac 设置、输出设置和音量设置等。2)初始化 i2s,此过程主要设置 spi_i2scfgr 寄存器,设置 i2s 模式、i2s
5、 标准、时钟空闲电平和数据帧长等,最后开启 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;
6、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 以及
7、 pcm 标准 i2s_standard_pcmshort。第三个参数 i2s_dataformat 用来设置 i2s 的数据通信格式。这里实际包含设置 spi_i2scfgr 寄存器的 hclen 位(通道长度)以及 datlen 位(传输的数据长度)。当我们设置为 16 位标准格式i2s_dataformat_16b 的时候,实际上传输的数据长度为 16 位,通道长度为 16 位。当我们设置为其他值的时候,通道长度都为 32 位。第四个参数 i2s_mclkoutput用来设置是否使能主时钟输出。我们实验会使能主时钟输出。第五个参数 i2s_audiofreq 用来设置 i2s 频率。实际
8、根据输入的频率值,会来计算 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_audi
9、ofreq_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 时钟分频器这里,
10、要先解析 wav 文件,取得音频信号的采样率(fs)和位数(16 位或 32 位),根据这两个参数,来设置 i2s 的时钟分频,这里我们用前面介绍的查表法来设置即可。这是我们单独写了一个设置频率的函数为 i2s2_samplerate_set。4)设置 dma i2s 播放音频的时候,一般都是通过 dma 来传输数据的,所以必须配置dma,本章我们用 i2s2,其 tx是使用的 dma1 数据流 4 的通道 0 来传输的。并且stm32f4 的 dma 具有双缓冲机制,这样可以提高效率,大大方便了我们的数据传输,本章将 dma1 数据流 4 设置为:双缓冲循环模式,外设和存储器都是 16 位宽
11、,并开启 dma 传输完成中断(方便填充数据)。5)编写 dma 传输完成中断服务函数为了方便填充音频数据,我们使用 dma 传输完成中断,每当一个缓冲数据发送完后,硬件自动切换为下一个缓冲,同时进入中断服务函数,填充数据到发送完的这个缓冲。6)开启 dma 传输,填充数据最后,我们就只需要开启 dma 传输,然后及时填充 wav 数据到 dma 的两个缓存区即可。此时,就可以在 wm8978 的耳机和喇叭通道听到所播放音乐了。操作方法为: dma_cmd(dma1_stream4,enable);/开启 dma tx 传输,开始播放。 3.3流程图 3.4关键代码i2s.c代码:#inclu
12、de 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(rcc_apb1peri
13、ph_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频率设置i2
14、s_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设置的
15、时候确定,一般是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, /32khz采样率 4410,
16、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/=10;/缩小10倍for
17、(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|=1spi2-i2spr=te
18、mpreg; /设置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_stre
19、am4);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 存储器0地址 dma_init
20、structure.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
21、_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_fi
22、fothreshold = 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
23、_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;
24、/子优先级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_clearitpendingbit(dma1_stream4,dma_it_tc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年无菌注射针行业深度研究分析报告
- 客运火车站自助服务设备布局与维护考核试卷
- 2025年高频焊管型钢项目可行性研究报告
- 显示器件的触控屏光学匹配考核试卷
- 2021-2026年中国矮壮素市场供需现状及投资战略研究报告
- 2025年鳕鱼项目评估报告
- 2025年装订文件用钉项目投资可行性研究分析报告
- 旅游会展企业的内部沟通机制考核试卷
- 2025年ABS制动系统实验台行业深度研究分析报告
- 中药批发商的物流网络优化与成本控制案例分析实践考核试卷
- 家校共育之道
- 公司EHS知识竞赛题库附答案
- 社区健康促进工作计划
- 《作文中间技巧》课件
- 2025年度移动端SEO服务及用户体验优化合同
- 中小学《清明节活动方案》班会课件
- 广东省2025年中考物理仿真模拟卷(深圳)附答案
- 新苏教版一年级下册数学第1单元第3课时《8、7加几》作业
- 特殊教育学校2024-2025学年度第二学期教学工作计划
- 宁夏银川一中2025届高三上学期第五次月考数学试卷(含答案)
- 2024年物联网安装调试员(初级工)职业资格鉴定考试题库(含答案)
评论
0/150
提交评论