前几天毕设的论文总算是怼完了,难得空闲了几天,就搞了个“电子八音盒”。为啥加引号呢,因为实在太low了……
使用了一个STM32ZET6开发板,一个VS1053b,和师姐座位上拿来的USB小嘴炮。能够遍历根目录的mp3, wav, midi文件并播放,KEY1负责切歌,具体的不妨进项目看。
项目地址:https://github.com/sjx95/STM32-Muisc-Box
FatFS
FatFS是一个小型的fat文件系统,提供了一些操作fat分区的基本逻辑,只需要加上底层读写代码即可使用。由于ZET6有SDIO外设,因此只需要在Cube里面勾选SDIO和FatFs即可。需要注意的是,Cube上写了,SDIO不可高于24MHz,但大概是软件Bug没有进行相关的检查。如果你把主频拉到72MHz,默认分频因子为0,即SDIO频率为72/(0+2)=36MHz,会出现问题,需要注意一下。
然后,先f_mount,然后就可以f_open f_read f_write f_close了,这几个定义跟Linux下面的大致相同,详细可以找FatFs手册,或看看我的项目里是咋用的(src/main.c)。
另外,f_opendir可以打开一个目录,然后反复调用f_readdir可以依次读出该目录的所有文件,直到读光后返回一个空的以0结尾的字符串。
还有就是,注意这些函数都有返回值,一般不等于FR_OK就是发生错误了,有时候需要处理一下。我这除了重启试试也没啥别的办法,所以就没写啦23333
VS1053b
VS1053b是一个音频解码+功率放大集成模块,内部是一个DSP。这货跟单片机之间采用SPI总线通信,控制(SCI)和数据(SDI)传输通过片选与别的外设复用一根总线。
至于怎么用,额,如果你用了12.xxx那个晶振,甚至都可以不用接SCI总线,因为直接把数据往里丢就行了,丢完一首歌拉一下RST,其实还蛮好用的。哦,对了,DREQ会指示当前片内FIFO缓冲区的状态,如果FIFO中尚有32Bytes以上的空间,VS1053b会把DREQ拉高,反之拉低。
因此程序里面就等DREQ变成高电平,写32Bytes就可以了。写的数据当然是前面的f_read得到的啦。
不过吧,芯片是好芯片,我用的这个模块,稍微有点坑。比如说它这个RST引脚是悬空的,比如说他这个晶振好像还接触不良。然后我第一次用的时候,就听到喇叭响一下停一会,再响一下再停一会,DREQ引脚总是报告FIFO满着。后来拿示波器一测发现晶振根本没起振,一怒之下剪了晶振换了一个,又发现了RST引脚的问题,总算是弄好了。
然后就可以拿去撩妹啦xD