STM32基于 FatFs R0.14b&SD Card 的MP3音乐播放器(也算是FatFs的简单应用了吧)

本篇文章不完善!!!

目前为止仅仅为学习笔记,看到这篇文章请慎重!!

写在前面:

FatFs 的I/O接口操作前面文章已经写过,现在直接拿来用!

项目主要参考野火和正点原子的代码。

说在前面:其实不喜欢正点原子的代码风格,基本上都是在官方库上包装上自己的函数接口。开发项目是方便,但是不太利于学习。相比较野火的我很喜欢,其代码在官方库或者官方例程上修改较少,而且视频课讲解清除。

本篇文章会在STM32F103精英版提供的代码例程的基础上,了解其运行原理,并从官方库的基础下实现音乐播放器功能。

难免会有代码bug,本篇文章只是梳理编程思想,实现流程


在芯片的选择上,野火和正点原子都选择的 VS1053,这倒是挺一致。就是芯片略微贵了一点。

以后看到其他的方案再替代吧,总之在调用 FatFs 上应该差别不大。


VS1053

虽然说不想用这个芯片,但是例程在那里,也得看看吧。

这芯片支持的格式怪多!

根据官方英文手册(其实也没太看明白!):

支持的音频解码:Ogg Vorbis, MP3, AAC, WMA and WAV PCM + ADPCM

📣 其实我用不到这么多,有个MP3就行了,也不需要录音。(这么一说感觉我好肤浅的样子)

通讯

VS1053 通过 SPI 协议和主机进行通讯的。48个引脚呢,不得不说真多。

VS1002本地模式(新模式)

🧐 要接的线

名称说明
XCS片选输入(低电平有效)
XDCS数据片选/字节同步
SCKSPI时钟总线
SISPI数据输入线
SOSPI数据输出线
DREQ数据请求
RST复位(低电平有效)

寄存器

😬 居然有16个寄存器,可通过寄存器对VS1053进行控制

来自[正点原子]《MP3音乐模块VS1503》

各个寄存器实现什么功能也不细说了,具体查看:VS1053b数据手册

关于VS1053就了解到这里,下面就进行文件的读写操作吧!


实现问题

看了野火的实现代码,感觉不好。

读MP3文件列表

DIR dir;
u8 res;
FILINFO filinfo;
u8 *fn;    //长文件名

res = f_opendir(&dir,"0:");    //假设盘符为0
if(res == FR_OK)
{
    
    while(1)
    {    
        res = f_readdir(&dir,&filinfo);    //读文件信息
        if(res != FR_OK || filinfo.fname[0] == 0)    //没有读到文件了
            break;
        fn = (u8 *)(* filinfo.fname)    //这里判断文件名比之前简单了,不知道对不对
        res = f_typetell(fn);    //这里可以自定义的判断文件类型
        if(res == MP3)    //判断到是MP3文件类型
        {
              //在这里判断了MP3的文件名称,就能存储了 
              //存储完了不久能显示列表了嘛 
        }

    }
}

显示

res = f_opendir(&dir,"0:/");
while(res == FR_OK)
{
    dir_sdi(&mp3dir,mp3indextbl[curindex]);    //目录索引函数???这个这版本没了啊
    res = r_readdir(&dir.&filinfo);    //读目录的下一个文件
    if(res != FR_OK || filinfo.fname[0] == 0)
        break;    //读到末尾了
    fn = (u8 *)(* filinfo.fname);    //这里判断文件名比之前简单了,不知道对不对
    //这一步可直接显示fn了!
    strcpy((char*)pname,"0:/");    
    strcat((char*)pname,(const char*)fn); 
    //然后播放音乐
    PlaySong(pname);   
}

播放

FIL* fmp3;
u8 *databuf;
u16 br;
u8 res,rval;	
u16 i=0;  

rval=0;	  
fmp3=(FIL*)mymalloc(SRAMIN,sizeof(FIL));//申请内存
databuf=(u8*)mymalloc(SRAMIN,4096);		//开辟4096字节的内存区域
if(databuf==NULL||fmp3==NULL)rval=0XFF ;//内存申请失败
if(rval==0)
{
    	VS_Restart_Play();  					//重启播放 
		VS_Set_All();        					//设置音量等信息 			 
		VS_Reset_DecodeTime();					//复位解码时间 	
}
res = f_typetell(pname);
if(res == MP3)
{    
    VS_Load_Patch((u16*)vs1053b_patch,VS1053B_PATCHLEN); 
}
res=f_open(fmp3,(const TCHAR*)pname,FA_READ);    //打开文件	 
if(res == 0)
{
    VS_SPI_SpeedHigh();	//高速	
    while(rval == 0)
    {
        res = f_read(fmp3,databuf,4096,(UINT*)&br);//读出4096个字节
        i=0;
        do
        {    
            if(VS_Send_MusicData(databuf+i)==0)//给VS10XX发送音频数据
                i +=32;
            else
                mp3_msg_show(fmp3->fsize);//显示MP3的信息
        }while(i<4096);//循环发送4096个字节 
        if(br!=4096||res!=0)    //读完了或者出错了
		{
			rval=0;
			break;//读完了.		  
		} 
        f_close(fmp3);    //关闭文件
    }
    else rval = 0xff;    //出错了
}
myfree(SRAMIN,databuf);	  	 		  	    
myfree(SRAMIN,fmp3);
return rval;

明白了!!!!明白其中的含义了!!!


自己理解实现方法!

1️⃣ 先定义一个数组 or 链表用来存放歌曲名称,既方便访问,又方便打印播放列表!

2️⃣ 打开目录,然后读取目录项,f_readdir可按顺序读取目录中的项目!然后通过读取到的对象信息,判断其名称。根基结尾四个字符(.mp3)判断是否为MP3文件,是则存储到歌曲名称序列

3️⃣ 通过对歌曲名称序列的调用,使用f_open打开文件并用f_read读文件传输解码,在传输过程中还可判断是否有上一曲下一曲操作。甚至可以选定曲目操作,因为有歌曲名称序列,这样也比较简单一点。

其实大部分都是VS1053芯片相关的函数了。感觉瞬间通透。


ok,每天向前迈进一小步,不急躁!加油

后期读懂代码更新!

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值