基于STM32音频解码MP3——vs1053

本文介绍了基于正点原子教程的VS1053音乐解码模块,该模块采用VS1053B芯片,支持多种音频格式解码和录音功能。模块与主控芯片通过SPI接口连接,使用时需要遵循DREQ信号的控制进行数据传输。文章详细阐述了SCI寄存器的配置,包括MODE、CLOCKF、BASS和VOL寄存器,以及如何进行硬件复位和软件配置。此外,还提及了音频数据的读写时序和解码时间的计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于正点原子教程

VS1053简介
1.该模块采用VS1053B 作为主芯片
2.支持:MP3/WMA/OGG/WAV/FLAC/MIDI/AAC 等音频格式的解码
3.支持:OGG/WAV 音频格式的录音,支持高低音调节以及 EarSpeaker 空间效果设置
模块如图所示正点原子
在这里插入图片描述
ALIENTEK ATK-VS1053 MP3 模块板载资源如下:
◆ 高性能编解码芯片:VS1053B
◆ 1 个 LINE IN/MIC 选择接口
◆ 1 个咪头
◆ 1 个电源指示灯(蓝色) ◆ 1 个 1.8V 稳压芯片
◆ 1 个 3.3V 稳压芯片
◆ 1 路 IIS 输出接口
◆ 1 路电源及 SPI 控制接口
◆ 1 路 3.5mm LINE IN 接口,支持双声道输入录音
◆ 1 路 3.5mm 音频输出接口,可直接插耳机
 板载咪头(MIC),无需外部麦克风,即可实现录音;
P1 排针为模块的供电与通信接口,采用 1*10P 排针,各引脚详细描述如表 2.2.1 所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二.模块使用
1.模块通过SPI接口来接受输入的音频数据流
我们通过SPI口向VS1053不停的输入音频数据,它就会自动帮我解码了,然后从输出通道输出音乐,这时我们接上耳机就能听到所播放的歌曲了

2.模块(VS1053)通过7根信号线同主控芯片连接
RST是VS1053的复位信号线,低电平有效。
DREQ是一个数据 请求信号,用来通知主机,VS1053可以接收数据与否。
SCK、SI(MOSI)和SO(MISO)则是VS1053的SPI接口,他们
在XCS和XDCS的控制下面来执行不同的数据通信
如图所示
在这里插入图片描述
VS1053 的 SPI 数据传送,分为 SDI 和 SCI,SDI 用来传输数据SCI 用于传输命令
SDI:
VS1053 的数据传输都是通过 DREQ 控制到 ,主机必须在判断 DREQ 有效(高电平有效)后,才可以发送数据,每次可以发送 32 字节
SCI:
SCI 串行总线命令接口包含了一个指令字节一个地址字节一个16 位的数据字
SCI 的字节数据总是高位在前低位在后的
指令字节:读指令为:0X03,写指令为:0X02
SCI读时序
指令,地址都是由主机即STM32发送,接着从机就自动发送数据给STM32,这就是32读数据过程
在这里插入图片描述
向VS1053读取数据,通过先拉低XCS,然后发送读指令(0X03),再发送一个地址,最后,我们在SO 线(MISO)上就可以读到输出的数据了

SCI写时序
指令,地址,数据都是由主机即STM32发送,接着从机就自动接收数据,这就是32写数据过程
在这里插入图片描述
在读时序和写时序中,DREQ 信号上都产生了一个短暂的低脉冲,也就是执行时间。这个不难理解,我们在写入和读出 VS1053 的数据之后,它需要一些时间来处理内部的事情,这段时间,是不允许外部打断的,所以,我们在 SCI 操作之前,最好判断下 DREQ 是否为高电平,如果不是,则等待 DREQ 变为高

SCI 寄存器:
总共有 16 个 SCI 寄存器
如图所示:
在这里插入图片描述
a.MODE 寄存器
在这里插入图片描述
在这里插入图片描述
SM_RESET,可以提供一次软复位,建议在每播放一首歌曲之后,软复位一次
SM_SDINEW 为模式设置位,这里我们选择的是新模式,所以设置该位为 1(默认的设置)。

b.BASS 寄存器
该寄存器可以用于设置 VS1053 的高低音效
在这里插入图片描述
c.CLOCKF 寄存器
这个寄存器用来设置时钟频率、倍频等相关
在这里插入图片描述
重点说明 SC_FREQ,SC_FREQ 是以 4Khz 为步进的一个时钟寄存器,当外部时钟不是 12.288M 的时候,其计算公式为:

										SC_FREQ=(XTALI-8000000)/4000

XTALI 的单位为 Hz,CLKI 是内部时钟频率,XTALI 是外部晶 振的时钟频率
我们使用的是 12.288M 的晶振,在这里设置此寄存器的值为 0X9800,也就是设置内部时钟频率为输入时钟频率的 3 倍,倍频增量为 1.0 倍

d.DECODE_TIME寄存器
用于存放解码时间,以秒钟为单位,我们通过读取该寄存器的值,就可以得到解码时间了
不过它是一个累计时间,所以我们需要在每首歌播放之前把它清空一下,以得到这首歌的准确解码时间

HDAT0 和 HDTA1 是两个数据流头寄存器,不同的音频文件,读出来的值意义不一样
通过这两个寄存器来获取音频文件的码率,从而可以计算音频文件的总长度

VOL 个寄存器
该寄存器用于控制 VS1053 的输出音量
比如设置为 0X0000 则音量最大,而设置为 0XFEFE 则音量最小。注意:如果设置 VOL 的值为 0XFFFF,将使芯片进入掉电模式!

三.硬件连接在这里插入图片描述

四.软件实现
1)复位 VS1053
这里包括了硬复位和软复位,是为了让 VS1053 的状态回到原始状态,准备解码下一首
歌曲。这里建议大家在每首歌曲播放之前都执行一次硬件复位和软件复位,以便更好的播放音乐。

2)配置 VS1053 的相关寄存器
这里我们配置的寄存器包括 VS1053 的模式寄存器(MODE)、时钟寄存器(CLOCKF)、音调寄存器(BASS)、音量寄存器(VOL)等。

3)发送音频数据
当经过以上两步配置以后,我们剩下来要做的事情,就是往VS1053里面扔音频数据了,只要是 VS1053 支持的音频格式,直接往里面丢就可以了,VS1053 会自动识别,并进行播放。不过发送数据要在 DREQ 信号的控制下有序的进行,不能乱发。这个规则很简单:只要 DREQ 变高,就向 VS1053 发送 32 个字节。然后继续等待 DREQ 变高,直到音频数据
发送完

### STM32实现音频解码的方法 在STM32嵌入式系统中实现智能音频播放系统的教程涵盖了从硬件准备到软件实现的多个方面[^1]。对于音频解码而言,具体的过程涉及到了音频文件的读取、解码以及最终的播放处理[^2]。 #### 音频解码流程概述 为了使STM32能够理解并处理音频数据,在实际应用中通常会采用特定格式编码过的音频文件作为输入源。这些文件中的压缩或未压缩的数据流需经过相应的算法解析成原始PCM(脉冲编码调制)格式的声音样本序列以便后续操作。此过程中可能涉及到多种不同的编解码标准和技术方案的选择取决于目标平台资源状况和个人需求偏好等因素[^3]。 #### 使用DAC模块进行音频输出 当完成了解码工作之后,则可以利用STM32内部集成或者外部扩展连接方式接入的一个数模转换(DAC)器件来负责把上述获得的一系列离散数值转变为连续变化着的实际物理量——即电压等级形式表示出来的声波信号;再经由功率放大级驱动扬声器发声从而达到预期效果[^4]。 ```c // 初始化DAC配置结构体 DAC_ChannelConfTypeDef sConfig = {0}; // DAC通道初始化设置... HAL_DAC_Init(&hdac); sConfig.DAC_Trigger = DAC_TRIGGER_NONE; sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK){ // 错误处理逻辑... } ``` #### 解码库的选择与集成 针对不同类型的音频文件(如MP3,WAV等),可以选择合适的第三方开源项目或是官方提供的中间件来进行适配移植工作。例如FatFs文件系统配合FFmpeg轻量化版本可用于读写SD卡上的多媒体资源并执行实时转码任务;而mbedTLS则能提供安全可靠的网络传输保障机制以满足在线串流服务场景下的特殊要求。 #### 应用实例展示 通过一个完整的案例说明如何基于STM32单片机构建简易型音乐播放装置:先准备好必要的外围设备清单(含存储介质接口电路图样稿),接着编写主程序框架代码片段用于管理各项子功能之间的协调运作关系,最后测试验证整个项目的稳定性和兼容性表现情况直至满意为止。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知道起个啥名“”

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值