3 MP3音乐播放

3.1 功能介绍

3.1.1 设计思路

音乐播放是手机等电子产品最常见的功能,也是最具娱乐性的功能,在该模块中,我先从SD卡中读取已存放的MP3音乐文件,然后将读取的字节流依次送人VS1053中进行解码和播放,同时从VS1053相关的寄存器中读取音乐播放时间,在LCD上实时显示歌曲信息。

为了增加难度,也是让产品更具有实用性,我将通过解析LRC歌词文件使歌词与歌曲能同步显示出来。

由于开发板上按键有限,我只选择了音乐切换功能,不能使音乐暂停/播放,也不能调节音量。按键1选择上一曲,按键2选择下一曲,并且音乐播放完自动切换到下一曲,按键3结束音乐播放返回目录。

3.1.2 成果展示

 

演示视频连接:MP3音乐播放功能展示-CSDN直播

3.2 关键技术

3.2.1 VS1053音频解码模块

•模块使用

1)模块通过SPI接口来接受输入的音频数据流:我们通过SPI口向VS1053不停的输入音频数据,它就会自动帮我解码了,然后从输出通道输出音乐,这时我们接上耳机就能听到所播放的歌曲了。2)模块(VS1053)通过7根信号线同主控芯片连接:RST是VS1053的复位信号线,低电平有效;DREQ是一个数据 请求信号,用来通知主机,VS1053可以接收数据与否;SCK、SI(MOSI)和SO(MISO)则是VS1053的SPI接口,他们在XCS和XDCS的控制下面来执行不同的数据通信。3)VS1053 的 SPI 数据传送,分为 SDI 和 SCI,SDI 用来传输数据,SCI 用于传输命令

SDI:VS1053 的数据传输都是通过 DREQ 控制到 ,主机必须在判断 DREQ 有效(高电平有效)后,才可以发送数据,每次可以发送 32 字节。

SCI:SCI 串行总线命令接口包含了一个指令字节、一个地址字节和一个16 位的数据字,SCI 的字节数据总是高位在前低位在后的,指令字节读指令为0X03,写指令为0X02。

SCI读时序:指令、地址都是由主机即STM32发送,接着从机就自动发送数据给STM32,这就是32读数据过程。向VS1053读取数据,通过先拉低XCS,然后发送读指令(0X03),再发送一个地址,最后,我们在SO 线(MISO)上就可以读到输出的数据了。

SCI写时序:指令、地址,数据都是由主机即STM32发送,接着从机就自动接收数据,这就是32写数据过程。在读时序和写时序中,DREQ 信号上都产生了一个短暂的低脉冲,也就是执行时间。这个不难理解,我们在写入和读出 VS1053 的数据之后,它需要一些时间来处理内部的事情,这段时间,是不允许外部打断的,所以,我们在 SCI 操作之前,最好判断下 DREQ 是否为高电平,如果不是,则等待 DREQ 变为高。

SCI 寄存器

总共有16个SCI寄存器,如下图所示

MODE寄存器:SM_RESET可以提供一次软复位,建议在每播放一首歌曲之后,软复位一次。SM_SDINEW 为模式设置位,这里我们选择的是新模式,所以设置该位为 1(默认的设置)。BASS寄存器:该寄存器可以用于设置 VS1053 的高低音效。

CLOCKF寄存器这个寄存器用来设置时钟频率、倍频等相关。

DECODE_TIME寄存器用于存放解码时间,以秒钟为单位,我们通过读取该寄存器的值,就可以得到解码时间了。 不过它是一个累计时间,所以我们需要在每首歌播放之前把它清空一下,以得到这首歌的准确解码时间。

HDAT0 和 HDTA1 寄存器是两个数据流头寄存器,不同的音频文件,读出来的值意义不一样,通过这两个寄存器来获取音频文件的码率,从而可以计算音频文件的总长度。

VOL寄存器该寄存器用于控制 VS1053 的输出音量,比如设置为 0X0000 则音量最大,而设置为 0XFEFE 则音量最小。注意:如果设置 VOL 的值为 0XFFFF,将使芯片进入掉电模式!

硬件连接

•软件实现

1)复位VS1053

这里包括了硬复位和软复位,是为了让 VS1053 的状态回到原始状态,准备解码下一首歌曲。这里建议大家在每首歌曲播放之前都执行一次硬件复位和软件复位,以便更好的播放音乐。

2)配置VS1053的相关寄存器

这里我们配置的寄存器包括 VS1053 的模式寄存器(MODE)、时钟寄存器(CLOCKF)、音调寄存器(BASS)、音量寄存器(VOL)等。

3)发送音频数据

当经过以上两步配置以后,我们剩下来要做的事情,就是往VS1053里面扔音频数据了,只要是 VS1053 支持的音频格式,直接往里面丢就可以了,VS1053 会自动识别,并进行播放。不过发送数据要在 DREQ 信号的控制下有序的进行,不能乱发。这个规则很简单:只要 DREQ 变高,就向 VS1053 发送 32 个字节。然后继续等待 DREQ 变高,直到音频数据发送完。

3.3 我的工作

3.3.1 同步显示歌词

•LRC歌词文件

LRC是英文lyric(歌词)的缩写,被用做歌词文件的扩展名。以LRC为扩展名的歌词文件可以在各类数码播放器中同步显示。LRC 歌词是一种包含着“*:*”形式的“标签(tag)”的、基于纯文本的歌词专用格式。其标准格式是[分钟:秒.毫秒] 歌词,如下图所示

解析LRC文件

u8 Vs1053_GetLrc_Music(const char *musiclrc)      //参数:LRC文件名存储地址
{FIL fil;FRESULT res;UINT br;FILINFO fno;char *p=NULL;char buff[10];u32 time=0,i=0,j=0,k=0,count=0;res=f_open(&fil,musiclrc,FA_READ);           //打开歌词文件if(res!=FR_OK){f_close(&fil);return 1;}memset(music_lrc,0,sizeof(music_lrc));memset(music_lrc_str,0,sizeof(music_lrc_str));res=f_stat(musiclrc, &fno);if(res!=FR_OK){f_close(&fil);       return 2;}res=f_read(&fil,music_lrc,fno.fsize,&br);if(res!=FR_OK || br!=fno.fsize){f_close(&fil);        return 3;}  p=strstr((char *)music_lrc,"[0");               //找到歌词开始的位置p++;while(p[i]!='\0')                     //逐行解析歌词{buff[j]=p[i];j++;i++;if(p[i]==']')                             {time=0;if(buff[6]>=5)time+=1;//计算该行歌词播放时间,以秒为单位,毫秒部分四舍五入        time+=((buff[0]-'0')*600+(buff[1]-'0'))*60+(buff[3]-'0')*10+(buff[4]-'0');if(time>5)                 //校正解析时间,使其同步time -= time / 10 + 1;printf("%d:%d",time/60,time%60);j=0;music_time[count]=time;i++;while(p[i]!='['){music_lrc_str[count][k++]=p[i++];if(p[i]=='\0')break;}music_lrc_str[count][k++]='\0';i++;k=0;count++;}}f_close(&fil);  return 0;
}

相关变量:

static unsigned char music_lrc_str[100][50]      存放每一行歌词

static u16 music_time[200]                                存放每一行歌词开始显示的时间

同步显示歌词

time=VS_Get_DecodeTime();          //得到解码时间
if(playtime==0)playtime=time;
else if((time!=playtime)&&(time!=0))   //1s时间到,更新歌词
{playtime=time;if(playtime>=music_time[lrc_k])//解码时间来到下一行歌词的解析时间,显示新歌词  {LCD_Fill(3,100,130,160,BLACK);LCD_String(3,100,(char *)music_lrc_str[lrc_k],16,GREEN,BLACK);lrc_k++;}
}

3.4 问题和解决思路

问题描述:解析出来的歌词与歌曲不同步

我的思路:VS1053解码工作频率较低,误差大,积累下来导致越到后面失步越严重。通过观察LRC文件的解析时间和VS1053解码时间之间的规律,对LRC文件的解析时间进行如下校正:if(time>5) time -= time / 10 + 1; 校正后歌词同步良好。

问题描述:音乐播放时有较大噪音和卡顿

我的思路:通过SPI每次向VS1053发送32字节的MP3文件后,都要调用SPI上的另一个从机LCD显示音乐基本信息和歌词,造成音乐播放时的不连续,由于LCD显示中文字符更慢一些,在播放中文歌曲时噪音和卡顿现象更严重。

工程源码:硬件课程设计:基于STM32的多功能播放器-单片机文档类资源-CSDN下载

硬件课程设计:基于STM32的多功能播放器之MP3音乐播放相关推荐

  1. 毕业/课程设计——基于STM32的智能灯光控制系统(物联网、智能家居、手机APP控制、语音控制)

    文章首先介绍本系统所包含的功能,主要包含六方面功能,之后逐步分享开发过程,其流程如下:点亮灯带(三极管)→调节灯光亮度(PWM)→为系统添加远程控制功能→为系统添加语音识别功能→添加超声波姿态监测功能 ...

  2. 基于STM32或STC的手势控制MP3语音播放器的设计

    一. 系统设计框图 区别于传统设计中的按键开关控制,本设计可以实现通过手势控制MP3播放器.采用STM32或STC15单片机和PAJ7620手势模块,能够识别九种手势,分别为上下左右前后,顺时针,逆时 ...

  3. 基于C语言控制台程序的简易MP3音乐播放器

    这是我们小学期的第一个大作业,因感受颇深,特此写下这篇博客留作纪念. 内容:设计一个带有播放控制和音量调节功能的控制台音乐播放器,其中播放控制的子菜单能实现播放暂停切换.停止当前曲.播放上一曲和下一曲 ...

  4. 硬件课程设计:基于STM32的多功能播放器之小说阅读

    1 小说阅读功能 1.1 功能介绍 1.1.1 设计思路 在TFTLCD屏上显示中英文文本文件是本次硬件课程设计的基本要求,也是我设计的多功能播放器最重要的功能,要求能够读取事先存储在SD卡中的文本文 ...

  5. 硬件课程设计:基于STM32的多功能播放器之聊天功能

    6 聊天功能 6.1 功能介绍 6.1.1 设计思路        在该功能模块中,我打算模拟手机QQ的聊天功能,不同的是QQ是通过互联网实现手机与手机之间的通信,而我是通过蓝牙实现stm32开发板与 ...

  6. 硬件课程设计:基于STM32的多功能播放器之小游戏

    4 游戏 4.1 功能介绍 4.1.1 设计思路 为了扩展开发板的应用,同时增加实验的难度和趣味性,我设计了一个类似赛车的小游戏.游戏中共有6条车道,同时有5个障碍物,用按键1和按键2控制赛车更换不同 ...

  7. 基于STM32的多功能MP3设计 毕业设计(论文)开题报告

    中国计量学院 毕业设计(论文)开题报告 学生姓名:卢杰学 号:XXXXXXXXX 专    业:电子科学与技术 班    级:10电子1 设计(论文)题目: 基于STM32的多功能MP3设计 指导教师 ...

  8. 计算机组成原理认识fpga,计算机组成原理课程设计-基于EDA和FPGA技术的8位模型计算机的设计与实现_精品.doc...

    计算机组成原理课程设计-基于EDA和FPGA技术的8位模型计算机的设计与实现_精品 目录 前言2 第一章 课程设计内容2 1.1 实验要求2 1.2 实验目的2 第二章 实验原理及方案2 2.1 实验 ...

  9. dsp课程设计c语言源码,DSP课程设计-基于C语言实现256点的FFT精选.pdf

    DSP课程设计-基于C语言实现256点的FFT精选 XX 大学 J1111111 UNIVERSITY DSP 课 程 设 计 基于CCS 的FFT 算法的C 语言实现和验证 学院名称: 专业班级: ...

最新文章

  1. 多彩投网站动态爬取[python+selenium]
  2. ERROR 1366 (HY000): Incorrect string value......(Mysql报错解决)
  3. 计算机科学中抽象的作用,抽象释义
  4. viewer 获取当前显示的图片信息_通过这个 Runtime 统计信息可视化库学到了什么?...
  5. 编译OpenJDK8:error: control reaches end of non-void function [-Werror=return-type]
  6. 演示:思科设备子接口类型帧中继的配置
  7. 新路嘉机器人_嘉懿学子在2019年上海市中小学机器人竞赛中喜获佳绩
  8. 数据加密以及国密基础知识
  9. 科来网络全流量安全分析系统[Study]
  10. 南京大学俞扬:环境模型学习——让强化学习走出游戏
  11. 网关 网关路由器 网关交换机 路由器 交换机
  12. html背景音乐微信播放器,微信小程序播放背景音乐(示例代码)
  13. xheditor编辑器的使用
  14. 本土实力派陈旭东出任IBM大中华区总经理,意外还是惊喜?
  15. Xcode4.6 自制iOS可用的 Framework
  16. php 截取取最后一个字符
  17. LeetCode 417. 太平洋大西洋水流问题【dfs】
  18. 关于JAVA的CLASSPATH
  19. Oxidized-20180912-docker 版本的网络设备备份系统
  20. 网罗软件测试知识体系汇总

热门文章

  1. Android控件知识点-RecyclerView(全网最详解)
  2. Roadstar.ai CEO佟显乔:2020年将运营1500辆无人车
  3. 浅谈三种近场通信技术的特点,对未来近场通信技术的应用场景进行分析与预测
  4. d继承链中忽略了模板插件
  5. 【硬件】硬件随机失效定量分析
  6. SQL SERVER访问Access数据库,出现错误:无法初始化链接服务器 (null) 的 OLE DB 访问接口 Microsoft.Jet.OLEDB.4.0 的数据源对象
  7. 国际游学品牌适应国情 哲商对话·王伟:环球探索研学营因材施教
  8. Excel表格制作教程-合并相同项,并将对应的值求和
  9. POI动态导出Excel,后台返回文件流,前端responseType格式下载
  10. android机器人 下载地址,机器人路径编程电脑版怎么下载 安卓模拟器电脑版下载地址...