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

您所在的位置:网站首页 为什么sd卡的音乐读不出来 STM32基于 FatFs R0.14b&SD Card 的MP3音乐播放器(也算是FatFs的简单应用了吧)

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

2024-01-11 06:13| 来源: 网络整理| 查看: 265

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

写在前面:

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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3