郑业成回应已婚已育MP3(SPI2)+MicroSD+FATFS实验(新版)
实验描述:将MicroSD卡(以文件系统FATFS访问)里面的mp3文件通过VS1003B解码,然后将解码后的数据送到功放TDA1308后通过耳机播放出来
(这个文档是更新版本的,配套的例程已经可以支持长中文文件名、4G 的
sd卡,可以播放mp3,wma,mid和部分的wav格式的音频文件)
硬件连接:PB13-SPI2_SCK  : VS1003B-SCLK
PB14-SPI2_MISO : VS1003B-SO
PB15-SPI2_MOSI : VS1003B-SI
PB12-SPI2_NSS  : VS1003B-XCS
PB11                  : VS1003B-XRET
PC6                    : VS1003B-XDCS
PC7                    : VS1003B-DREQ
库文件:startup/start_stm32f10x_hd.c
CMSIS/core_cm3.c
CMSIS/system_stm32f10x.c
FWlib/stm32f10x_gpio.c
FWlib/stm32f10x_rcc.c
FWlib/stm32f10x_usart.c萧敬腾世界唯一的你
FWlib/stm32f10x_sdio.c
FWlib/stm32f10x_dma.c
FWlib/stm32f10x_spi.c
FWlib/misc.c
用户文件:  USER/main.c
USER/stm32f10x_it.c
USER/sdio_sdcard.c
USER/ff.c
USER/usart1.c
USER/mp3play.c
免费教学录影带歌词
USER/vs1003.c
USER/SysTick.c
文件系统文件:
ff9/diskio.c
ff9/ff.c
ff9/cc936.c
野火STM32开发板中MP3的硬件原理图:
解码部分采用VS1003-MP3/WMA 音频解码器,然后将解码后的数据送TDA1308放大后由音频接口外播出来。
the roadVS1003+TDA1308简介->
VS1003 是一个单片 MP3/WMA/MIDI 音频解码器和 ADPCM 编码器。它包含一个高性能,自主产权的低功耗 DSP  处理器核 VS_DSP 4 ,工作数据存储器,为用户应用提供 5KB 的指令 RAM 和 0.5KB 的数据 RAM。串行的控制和数据接口,4 个常规用途的 I/O 口,一个 UART,也有一个高品质可变采样率的 ADC 和立体声 DAC,还有一个耳机放大器和地线缓冲器。
VS1003 通过一个串行接口来接收输入的比特流,它可以作为一个系统的从机。输入的比特流被解码,然后通过一个数字音量控制器到达一个 18 位过采样多位ε-ΔDAC。通过串行总线控制解码器。除了基本的解码,在用户 RAM 中它还可以做其他特殊应用,例如 DSP 音效处理。友谊地久天长英文版
VS1003原理框图:
本实验中我们只用了红圆圈中的那几个数据口,这些数据口是串行模式的,我们用到了开发板中的SPI2来控制。其中数据经SI接口进去,经解码后由L、R这两个左右声道引脚出来,因为VS1003内部集成了一个DA,所以出来的数据是模拟的,可直接驱动耳机,但由于功率太小,音效不佳,所以我们将信号送往TDA1308放大后再通过耳机外放出来,经过这样出来之后音质跟电脑上的有的比。现在市面上的MP3模块基于成本考虑都没加音频功放,而是直接驱动音频耳机,效果可想而知。
TDA1308是一款双通道的立体耳机驱动器,是一款专门用于声音驱动的功放。其
加速世界ed原理框图如右:
有关VS1003B和TDA1308的详细应用,大家可参考官方的datasheet,野火就不在这里罗嗦啦^_^。
本实验是在《MicroSD卡+FATFS》这个实验基础上进行的。没做过这个实验的话可参考前面的教程,否则有些代码会让您犯糊涂。
实验讲解->
首先需要将需要用到的库文件添加进来,有关库的配置可参考前面的教程,这里不再详述。在配置好库的环境之后我们从main函数开始分析:
这里没有调用库函数SystemInit();是因为在3.5的固件库中,在3.5版本的库中SystemInit()函数在启动文件startup_stm32f10x_hd.d中已用汇编语句调用了,设置的
时钟为默认的72M。所以在main函数就不需要再调用啦,当然,再调用一次也是没问题的。
如果你使用的是其它版本的库,在所有工作之前首先要做的就是先设置系统时钟,这可千万别忘了。在ST3.0.0版本之后的库中,这部分工作都放在了启动文件中了,
由汇编实现,只要用户代码一进入main函数就表示已经初始化好系统时钟了,完全不用用户考虑,用户不知道这点的话还以为不需要初始化系统时钟呢。至于ST3.0.0和
之后高版本的库有什么区别,我想说的是没什么大的区别,代码的目录结构基本没有
改变,只是在代码的功能增多了,支持更完善的外设。
SysTick 为10us中断一次用于SysTick 为10us中断一次,用于后面的延时函数。
USART1_Config();配置串口1波特率为 115200 ,8个数据位,1个停止位,无硬件流控制。
NVIC_Configuration();用于配置MicroSD卡的中断优先级。
VS1003_SPI_Init();用于初始化MP3解码芯片VS1003B需要用到的I/O口,包括数
据口(SPI2)和控制I/O。VS1003_SPI_Init();由用户在vs1003.c中实现: