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

这篇具有很好参考价值的文章主要介绍了硬件课程设计:基于STM32的多功能播放器之MP3音乐播放。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

3 MP3音乐播放

3.1 功能介绍

3.1.1 设计思路

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

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

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

3.1.2 成果展示

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

演示视频连接: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 寄存器

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

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

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

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

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

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

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

硬件连接

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

•软件实现

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)”的、基于纯文本的歌词专用格式。其标准格式是[分钟:秒.毫秒] 歌词,如下图所示

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

解析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显示中文字符更慢一些,在播放中文歌曲时噪音和卡顿现象更严重。文章来源地址https://www.toymoban.com/news/detail-402714.html

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

到了这里,关于硬件课程设计:基于STM32的多功能播放器之MP3音乐播放的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32的多功能门禁系统(AS608指纹识别、密码解锁、刷卡解锁)

    目录 一、项目功能 二、视频 三、原理图 4、材料选择 5、部分程序 1、AS608指纹解锁;可以录入、删除、验证指纹; 2、密码解锁;可以密码验证、修改密码和保存密码; 3、刷卡解锁; 4、OLED液晶显示; 基于STM32的多功能门禁系统(AS608指纹识别、密码解锁、刷卡解锁) AS608指纹

    2024年02月12日
    浏览(50)
  • 数字系统设计(FPGA)课程设计: 多功能数字钟

    一、目的: 实现多功能数字钟,具备下列功能: 1、数字钟:能计时,实现小时、分钟、秒的显示; 2、数字跑表:精度至0.01秒 比如显示12.97秒; 3、闹钟: 可以设定闹钟,用试验箱上的蜂鸣器作为闹铃; 4、调时:可以对时间进行设定; 5、日期设定:能设定日期并显示当前

    2023年04月18日
    浏览(43)
  • 【数字电子技术课程设计】多功能数字电子钟的设计

    摘要 1  设计任务要求 2  设计方案及论证 2.1  任务分析 2.1.1 晶体振荡器电路 2.1.2 分频器电路 2.1.3 时间计数器电路 2.1.4 译码驱动电路 2.1.5 校时电路 2.1.6 整点报时/闹钟电路 2.2  方案比较 2.3  系统结构设计 2.4  具体电路设计 3  电路仿真测试及结论分析 3.1  电路仿真测

    2024年02月03日
    浏览(55)
  • 【Proteus仿真】【STM32单片机】多功能智能台灯

    本项目使用Proteus8仿真STM32单片机控制器,使用LCD1604液晶、按键、蜂鸣器、语音识别模块、PCF8591 ADC模块、DHT11温湿度传感器、光线传感器、台灯、人体红外传感器等。 主要功能: 系统运行后,LCD1604液晶显示温湿度和光线强度、时间日期,系统工作模式;系统默认为自动模式

    2024年02月07日
    浏览(54)
  • STM32超级蓝牙小车——基于STM32F103C8T6的多功能蓝牙小车(PID循迹、跟踪、有源蜂鸣器播放音乐、蓝牙遥控、AD采集+DMA转运等超多元素小车)

    一、项目时间:2023.7.24~11.26 二、实现效果:通过蓝牙控制小车运动与模式转换                         模式一:循迹模式                         模式二:跟踪模式                         模式三:音乐模式                         模式四:控制运动模式 三、使

    2024年02月04日
    浏览(54)
  • 基于VHDL的多功能电子钟设计

    一、目的任务 熟悉Quartus II的使用方法和步骤,掌握使用Quartus II来进行FPGA编程和仿真的方法和技巧。熟悉FPGA硬件的调试方法,掌握初步的FPGA 和周边硬件的调试和故障诊断的能力。 掌握用 VHDL 语言进行数字系统设计的基本方法和流程,加深对 EDA 课程内容的理解,提高工程设

    2024年02月03日
    浏览(51)
  • 基于FPGA的多功能数字时钟设计报告

    作品基于intel Cyclone IV E EP4CE10F17C8 FPGA板卡,主要开发环境为Quartus Ⅱ,编程并实现了多功能温湿度电子钟。本作品在实现显示实时时间的基础上,设计并完成了设置闹钟、改变闹钟铃声、显示实时温度和实时湿度、基于以太网通信协议的实时视频传输等功能。在未设置闹钟时

    2024年02月05日
    浏览(47)
  • 【基于FPGA的芯片设计】多功能ALU

    目录 一、实验要求 二、源代码 1. 顶层模块 2. 数据输入模块 3. ALU运算模块 4. 结果处理模块 5. 扫描数码管模块 5.1 扫描数码管顶层 5.2 分频器 5.3 数码管显示 三、仿真代码 四、结构层图 五、管脚配置 实验板卡:xc7a100tlc sg324-2L,共20个开关 通过高低位控制,实现32位数据A、

    2024年02月05日
    浏览(49)
  • 基于FPGA的多功能数字钟的设计

    摘要 数字钟是采用数字电路实现对时、分、秒数字显示的计时装置,是人们日常 生活中不可少的必需品。本文介绍了应用FPGA芯片设计多功能数字钟的•种方 案,并讨讨论了有关使用FPGA芯片和VHDL语言实现数字钟设计的技术问题。 数字钟、分频器、译码器、计数器、校

    2024年02月07日
    浏览(47)
  • 基于SpringBoot多功能智能手机阅读APP的设计与实现

    博主主页: 一点源码 博主简介: 专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。 主要内容: SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、小程序、安卓app、大数据等设计与开发。 感兴

    2024年02月20日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包