STM32基于 FatFs R0.14b&SD Card 的MP3音乐播放器(也算是FatFs的简单应用了吧) |
您所在的位置:网站首页 › 为什么sd卡的音乐读不出来 › 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进行控制 ![]() 各个寄存器实现什么功能也不细说了,具体查看: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 |