写点什么

基于 STM32 设计的音乐播放器

作者:DS小龙哥
  • 2023-04-24
    重庆
  • 本文字数:11855 字

    阅读完需:约 39 分钟

一、项目背景与设计思路

1.1 项目背景

时代进步,科学技术的不断创新,促进电子产品的不断更迭换代,各种新功能和新技术的电子产品牵引着消费者的眼球。人们生活水平的逐渐提高,对娱乐消费市场需求日益扩大,而其消费电子产品在市场中的占有份额越来越举足轻重。目前消费电子市场空前壮大,各大厂商竞争激烈,这也对科技创新带来了巨大的推动,人们无时无刻在享受科学创新带来的便利和乐趣。


自 1998 年全球首款便携式音乐播放器退出市场以来,便携式音乐播放器市场的增长速度非常快,便携式音乐功能越来越多。 现在世界上占有主要份额的几家厂商分别是:索尼、飞傲、苹果、艾利和等。他们的 MP3 拥有精致的外观和高质量的硬件,配以越来越先进的高质量音质,受到消费者推崇。


在现阶段,用户可以享受到许多娱乐服务,电子书,录音功能,文件管理功能等层出不穷,以在保证自身高质量的同时增加产品支持的功能多样化。以其瘦小的身躯,音质的纯正,深受人们的喜爱。






1.2 设计思路和结构

本设计采用 STM32 系列作为微控处理器、搭配 VS1053 音频芯片和 SD 卡作为文件读取,显示屏屏幕模块则显示歌词及歌曲信息。


以下为主要实现的功能:


1、 SD 卡可实现存储音乐数据;


2、单片机读取音乐数据,通过音频解码器播放音乐;


播放音乐的同时,在液晶显示屏显示当前音乐的信息(歌曲名、歌词、歌曲播放总时长和当前播放时长)本文主要从四个方面来介绍说明这次设计的原理和制作流程:


1) 硬件介绍方面:分析各个硬件部件的原理。


2) 硬件设计方面:电路原理及其设计。


3) 软件设计方面:设计原理及各个功能实现的编程代码设计。


4) 开发与测试方面:利用 keil 拷入程序,试验设计成果。

二、系统总体方案设计

方案一:采用 51 系列单片机。关于使用学习 51 单片机,实际上其实不需要学习更多课程,会一些简单的 C 语言,知道 51 单片机系列的基本结构即可,操作难度不算太大而且也不算很困难。大学生都一般都可以完成了。再加上一个音频解码的芯片,屏幕显示器材和其他的外置硬件就可以了。


但是这个方案设计到芯片的布局设计以及本运行速度过慢,性价比极低,故而舍弃,选择方案二。接下来我将着重介绍我选择的方案二。


方案二: 使用 MiniSTM32F103RCT6 开发板和 VS1053 音频解码模块完成设计。 这两个模块结构小巧、功能繁多、价格低廉适合入门选择。 STM32 F103 RCT6 属于 cortex-M3 系列单片机,是 ARM 的 32 位处理器。 不仅功耗低而且价格实惠,还可以满足各种设计要求。 在 STM32 F103 RCT6 芯片的加持下 MiniSTM32 F103 RCT6 开发板具有丰富的扩展性,这个开发板资源丰富, 在芯片内部有 48 KB 的 SRAM、256 KB FLASH,同时涵盖了多种定时器(如: 高级定时器、通用定时器、)、标准的 JTAG 调试下载口、拥有 256 字节的 IIC 接口 EEPROM 芯片, 多组电源接入(可选择 5 V 或者 3.3 V), TFT LCD,足够本次设计使用。 VS1053 音频解码模块也是一种低成本,高效率,十分可靠的音频解码模块。并且该模块将耳机孔,咪头,各种接口和芯片集成在一起。 ATK-VS1053 MP3 模块不仅外观漂亮,而且功能齐全,界面丰富。数量众多紧凑且方便安装的安装孔设计,易于使用的各种基于 STM32 的微控制器的设计。


结论:经过多种方案的比较并且结合了实际的操作,最终决定使用体积小、功耗低、价格低廉的 MiniSTM32 开发板和同样具备高性能,低功耗特点的 VS1053 音频解码模块来进行此次毕业设计的制作。下面着重介绍一下 MiniSTM32 开发板和 VS1053 音频解码模块的特点和内部结构。



三、硬件介绍及设计

3.1 STM32 开发板介绍

3.1.1 STM32 开发板特点

STM32 V3 迷你型开发板的设计十分巧妙,十分用心的去设计了元器件的布局,迷你型开发板的设计中更为看重使用者的理解和体验,最后定下来的这种设计,是根据 STM32 的特点和用户的使用经验才确定的,其特点不完全列举如下


1)形状小。整个迷你型开发板的尺寸为长 10cm 宽 8cm 高 2cm,其中高度包括了 lcd 的厚度,但不包括底部支撑金属棒的高度。


2)灵活。取出板上晶体振荡器以外的所有 IO 端口,尤其是依次提取 GPIOA 和 GPIOB 的 IO 端口。这些为更多设计和利用提供了强有力的支持。为了能够避免经常改变 B0 和 B1 的操作,这款迷你型开发板拥有特有的下载功。只需单击一下即可直接在计算机上下载。


3)资源丰富。通过板载十多个外设和接口,您可以充分发挥 STM32 的潜力。


4)卓越的品质。沉金 PCB +全新高品质元件+定制镀铜针座/排座+电源 TVS 保护,坚如磐石。


5)人性化设计。每个界面都有一个丝网标签,可以一目了然;界面位置设计合理,方便。资源搭配合理,物尽其用。


3.1.2 STM32 迷你型开发板内部资源

STM32 迷你型开发板选用 STM32F103RCT6 作为 MCU。它具有以下资源:48 KB SRAM,256 KB FLASH,四个通用定时器,两个基本定时器,二个高级定时器,总共一十二个通道的直接内存存取控制器,三个串行外设接口,二个集成电路总线,五个串行端口,一个通用串行总线,一个控制器局域网络,三个一十二位模/数转换器,一个十二位数/模转换器,1 个 SDIO 接口和 51 个通用 IO 端口。该芯片极具成本效益,MCU 部件原理图如下图 3.1.2 所示。



3.1.3 液晶显示模块


STM32 迷你型开发板具有相对常见的 LCD 模块接口,以及自己的兼容接口。它不仅支持各种尺寸的 TFT_LCD,还支持 OLED 显示屏。并且,该迷你型开发板支持不同型号的触摸屏,比如电阻式和电容式的触摸屏。原理图如图 3.1.3 所示。 TFT_LCD 是通用 LCD 模块接口。 OLED 接口的作用给 OLED 显示屏模块给电,并与 TFT_LCD 拼接。当使用 TFT_LCD 时,我们可以将它连接到 TFT_LCD(插头右侧),当我们使用该厂家的的 OLED 模块时,我们将 OLED 引脚连接到电源并连接到 TFT_LCD(左)引脚以将 OLED 连接到 MCU。 STM32 迷你型号开发板的 LCD 接口可以支持不同大小的 TFT_LCD 模块,包括:2.4 英寸(320 * 240,电阻屏),2.8 英寸(320 * 240,电阻屏),3.5 英寸(480 * 320,电阻屏) ,4.3 英寸(800 * 480,电容屏),7 英寸(800 * 480,电容屏)等,还兼容该厂家的 0.96 英寸 OLED 模块。

3.1.4 SD 卡模块

普通的音乐播放器必须有较大容量的储存空间,用来存储一些较大的文件,如音乐,文本和汉字识别库。带电可擦写可编程存储器的容量无法满足 MP3 播放器文件数据的需求。因此,在制作 MP3 播放器时应加入配件 SD 储存卡。 SD 储存卡早已在多种嵌入式设备中被使用,SD 储存卡是一种新一代的记忆设备,它是基于半导体快闪记忆器制作的。它拥有安全性好,数据传到效率高,存储空间大的特点。STM32 迷你型开发板具有标准 SD 卡接口(位于开发板背面)。通过此拓展接口,我们可以扩展容量存储设备并使用 SD 卡来记录数据。其原理图如下。


3.2 VS1053 音频解码模块的介绍

3.2.1 VS1053 音频解码模块的特点


VS1053 是 VS1003 之后由荷兰 VLSI 公司生产的另一款高性能解码芯片。该芯片可以用来解码多种常用的音频格式,解码 MP3 、WMA 、FLAC、AAC 、MIDI 等常用音频格式更是不在话下。与之前的 VS1003 相比,性能大大提高。 该高性能解码芯片具有高性能的数字信号处理器内核 VS_DSP,16K 指令内存,0.5K 数据内存,由串行外设接口控制,具有 8 个可用的通用 IO 端口和一个串行端口。该芯片还具有可变采样率。立体声 ADC(支持麦克风/麦克风+线路/ 2 线),高性能立体声 DAC 和音频耳机放大器

3.2.2 VS1053 音频解码模块的内部电路


由于 VS1053 是高性能 DSP,因此可以像普通 MCU 一样用作主机。与普通 MCU 一样,DSP 具有相同的最小系统,因此在电路设计中使用晶体和复位电路是很自然的。通过阅读数据表,VS1053B 还具有中断功能,还具有 GPIO!操作寄存器控制时钟频率。电路图的设计是模块设计的关键技术,这两个电路图是开发板的示意图。在这里面 74HC4052 的用处是是音频选择而 TDA1308 则是用来使用耳机的驱动器,74HC4052 芯片用作板载音效,FM 收音机和 STM32 的方波信号将通过程序控制选择,综上所述,这一款 VS1053 音频解码模块可以将繁杂的音频信号收拢到一起,而后单独发送到耳机的驱动电路来完成输出,减小了运行的空间,也省下了不少的硬件方面的部件。


3.3 硬件设计

3.3.1 SD 卡与 STM32 之间的连接

一般来说,STM32 迷你型号开发板子上的串行外设接口和 SD 存储卡用于互相之间的通信。其硬件引脚的详细设计如下:通用低电平有效的 IO 端口连接到 SD 卡芯片上的片选引脚 CD_DATA3。当串行外设接口与 SD 存储卡通信时,必须拆掉一般的 IO 端口才可以操作 SD 存储卡。STM32 板上串行外设接口的关键输出来自发送和接收主机输出从机输入的信号。STM32 板子是 CPU,SD 卡等于硬盘存储。文件数据的输送流程从处理器到 SD 卡。而其执行 SD 存储卡流程,主要依靠信号总线传递的指令,。STM32 迷你型开发板上的串行外设接口的时钟信号总线。如果想操控写入或读取 SD 存储卡文件的速度则可以通过改变串行外设接口时钟频率来完成。STM32 迷你型开发板上串行外设接口的关键输送来自发送接收的从机输出主机输入信号总线。文件的传输的流程是从 SD 存储卡送到到开发板的处理器,目的是反馈 SD 存储卡的部分情况以及核心寄存器的存在的情况等。还有一个 IO 端口用作扫描 SD 卡是否已经感应到。如果 SD 卡被完全感应到,IO 端口电平是低的,否则它将是高的。

3.3.2 音频编解码芯片与 STM32 的连接

以前的设计使用 STM32 迷你型开发板上的串行外设接口和 VS1053 音频编解码芯片进行相互通信。这种音频编解码芯片是 VS1053,而被用作引入引脚的则是模块上的两个芯片。VS1053 的指令请求的引脚接口。假如 VS1053 的数据被更改并且需求新数据时,DRIQ 被置高。基于该信号,STM32 迷你型开发板将新的音乐文件流发送到音频解码模块中。系统时钟连接到 STM32 Mini 开发板处理器板上的串行外设接口时钟信号线。因此,从发送和接收主机输入从机输出的信号线连接到 STM32 迷你开发板上串行外围接口的主发送和接收端。因此在这样的系统中,我们使用类似于中央处理单元的 STM32 迷你开发版,VS1053 音频编解码芯片相当于外部声卡。为了反馈部分 VS1053 音频编解码芯片及其自身的寄存器值,设计了文件流程。文件流传输过程从 VS1053 音频编解码器芯片传输到 STM32 迷你开发板的处理器。例如:寄存器工作后反馈给自己寄存器的值。 SI 通过发送和接收主机输出从输入信号线连接到 STM32 mini 开发板上串行外设接口的主输出。文件流方向从 STM32 传送到音频编解码器模块,音频编解码器模块输入音频编解码器芯片和音频文件文件流的一些指令。音频文件解码的芯片 CS 处于低状态。如果引脚被拉低,则通过 SPI 发送命令。音频编解码芯片对于自身寄存器的读写,音频编解码芯片的初始化,左声道,右声道,立体声等音量的设定就是上述的各种指令主要部分。 DCS 在低水平时处于活动状态。如果引脚被下拉,通过 SPI 发送的数据就是信号源。例如,当你将各种格式的音频文件文件流输送到音频编解码器芯片时,你需要降低片选引脚。复位引脚是有低电平,拉低引脚是可以复位 VS1053 芯片。

四、软件设计

4.1 硬件驱动设计

本次设计在软件上主要分为以下两个方面:第一是硬件驱动程序的设计使用,这一步主要是为了能够让硬件正常的使用,第二是功能模块的设计和使用,这一步主要是为了实现具体要求的功能;软件设计开发环境用的是 Keil,其中软件流程图如图 4.1 所示



图 4.1.1 软件流程图


便携式音乐播放器其实就是 MP3,可以说是个微型计算机,它有处理控制器,输入输出设备,存储设备等。在一个便携式音乐播放器中,它应该具备以下硬件模块:存储程序和音乐的存储器、能够显示歌词和操作界面的显示屏幕、控制全体的一个主中央处理器、能够完成音频解码的数字信号处理器,输入和输出的具体设备。为了满足以上的要求也是为了更好的完成音乐的音乐播放,本设计采用 STM32 迷你型开发板读取 SD 存储卡中的音频和歌词文件,并将其中的音频文件发送到 VS1053 音频解码器进行音频解码,通过连接的耳机进行音频的收听。于是该设计应该具有中央处理器,音频解码器,显示屏,SD 存储卡,耳机接口,USB 接口这些部件,现在将他们统一设计,其总体框架如图 3.1 所示。



图 4.1.2 MP3 系统框图

4.2 STM32 处理器驱动

我们一定要先对 STM32 库有一个基本的了解。才能够去了解 STM32 迷你型开发板是如何启动的,STM32 库是意法半导体的设计人员为 STM32 添加的功能引脚。就是 API 应用程序引脚。普通开发人员可以使用这些功能引脚来实现分配控制器的寄存器,以便用户可以摆脱基址寄存器配置。它具有开发快速,易读,易维护等优点。实际上,STM32 库旨在使我们的用户更容易配置寄存器,从而减少繁琐的代码量并使开发控制器变得更加容易。就 STM32 来说,由于其丰富的外设,不可避免地会增加寄存器的数量和杂乱度,这是程序开发速慢效率、可读性差的原因。上述两个缺点会降低用户的使用频率,而库文件的产生正好解决了这些难题。


微控制器软件接口标准的详细准则是它的关键内容,内容如下所示:首先在内核函数层:包含由英国 ARM 公司研发和商用的用作分配内核寄存器的标识和地址确认。其次在外围接入设备方面:它能够不用顾及到硬件的诸多不同,这样就使得利用别的软体拥有极大的便利程度。原因如下,中断产生和片上外围设备的地址,大部分是控制器制造商开发和使用的。至于微控制器软件接口标准层在硬件层与磁盘操作系统、使用人员,能够为引脚外围设备和实时磁盘操作供应一个简易的控制器软件引脚。这让它能够不用顾及到硬件的诸多不同,这样就使得利用别的软体拥有极大的便利程度。STM32 库在 CMSIS 的准则下完成。STM32 库 3.0 版本可以直接在网上下载,下载后查找到超文本标记语言文件和库文件。当超文本标记语言文件(即 html 文件)示意制造商意法半导体公司完成了编写了一切外围驱动程序时,库文件开启文件和各种驱动的编码。需要用到时,把库文件下的库函数文件加进至项目去。完成上述步骤就几乎完成了寄存器的分配,下列是一些常用的头文件。


core_cm3.c 文件:这个文件能够用来无视不一样的编译器的不同,最关键的是,文件包含 STDIN .H 的头文件独立于控制器,目的是建立其它新的函数定义。


system_stm32f10x.c 文件:本文档由意法半导体的设计人员提供,符合微控制器软件接口标准。其主要作用是引脚分配系统时钟与总线时钟。在经过一个 32 位处理器内核的内部寄存器,使用芯片内部的时钟,或者将一个内部晶振 8MHz 的时钟的输入信号变为其本身的数倍或几分之一。该库文件的时钟分配非常的重要,因为一切使用外接接口的设备都与 STM 迷你型开发板的时钟频率拥有紧密的联动。


Stm32f10x.h 文件:此函数头文件很关键。这是一个非常基础的函数头文件。因为几乎所有的控制器厂商比如意法半导体的设计人员都会把内存操作封存到寄存器中,同时意法半导体的设计人员也将相关操作封存到系统文件中,该系统文件都会放在对应的开发体系里。如此,只有头文件包含在应用程序中。


stm32f10x_it.c 文件:主要用于写入中断服务功能。其更改之前,该文件就确立了很多系统异常引脚,而更多需要用到的中断服务功能文件将自己加入,并且这些中断服务功能的引脚能都够在开启文件中查找。


stm32f10x_conf.h 文件:该文件已经含有了 STM32F10X.H 文件,它用于配置外设的使用,并且使用该头文件能够很容易地添加或删除驱动目录下的外围驱动,例如 GPIO、RCC、SPI 和 USAT 外围设备。

4.3 TFT 显示驱动

4.3.1 TFT 显示驱动原理

之前的显示器采用 LCD1602 和 LCD12864,因为它们的像素和图像显示效果不佳。然后发现可以使用 ILI9325 为显示驱动器的 TFT-LCD 屏幕,分辨率也能够大大提升到 320×240 的,该屏幕的电源电压为 2.5-3.3V,具有 16 位数据接口,高对比度,高 BRI。高性价比和低能耗,采用彩色成像,这种设计采用了 2.6 英寸 TFT 彩色屏幕。


过去,LCD 1602 或 LCD 12864 常用于电路设计,但基本上是黑白屏幕,并没有提供彩色图像显影的性能。目前,TFT-LCD 屏幕正在快速的普及,所以 TFT-LCD 屏幕的价格一直在降低,但是性能却在慢慢变强。因此,本次设计采用 TFT-LCD 屏幕。综上,本次设计决定采用显示驱动使用 ILI9325 的 2.3 英寸 TFT-LCD 屏幕。它的分辨率为 320×240,电源电压为 2.5 至 3.3V 和 16 引脚。 STM32 开发板中的 STM32 芯片通过驱动由 TSC2046 芯片控制的 ILI9325 芯片来控制 TFT 显示屏。液晶彩屏像素点的数据格式如下图 4.3.1 所示。



图 4.3.1


(0,0)位置位于屏幕的左上角。对于 ILI9325(0,0)位置,存储器地址也对应于地址 0000H。 GRAM 的低 8 位用于表示 X 轴。范围:0~EFH(0~239),高 12 位表示 Y.轴,范围:0~13FH(0~319)右下角地址是:13FEFH = 81903 超过 240 * 320 = 76800,因为屏幕像素的坐标地址不连续,但问题不大。因为默认情况下,每次将像素数据写入 gram 时,iLI9325 的 gram 地址会默认先进行从左到右的自动增加,再进行从上到下的自动增加,其中从左到右比从上到下要先进行。 ILI9325 使用 R20H 和 R21H 寄存器来确定 GRAM 地址并在某一点写入数据。过程是:


1、向寄存器 R20H,R21H 写像素地址


2、通过写一次 R22H 命令的方式,来通知 ILI9325 准备接受 RGB 数据


3、写 RGB 数据

4.3.2 寄存器

写寄存器的步骤是实现 TFT_LCD 显示屏显示性能的核心步骤。首先写入寄存器号,然后写入相应的操作数据,即实现相干的指令操作。该设计驱动器所示的命令看图 4.3.1。每个数字的具体含义如下



图 4.3.2


R0:该命令有两个功能。写入数据时,用于打开或关闭振荡器的最低位是 OSC。当它被读取时,将反馈这个处理器的类型。


R3:导入表单中的那些形式指令,可以通过运行 I / D0,I / D1 和 AM 来实现对屏幕的控制。当数据被更新时,地址计数器根据 I/D[1:0]中的这两个比特的化,其关系如图 4-5 设置自动添加/减去 1。AM 用于管理 GRAM 的初始化进程:如果 AM=0,地址将沿行方向进行初始化;如果 AM=1,地址将沿列方向上初始化,具体情况如下图 4.3.2。



R7:查看指令。当 Cl=1 时,它是 8 位色彩,CL=0 是 26 万。D0,D1 和 BASEE 管理显示开关。如果整体设置为 1,则显示屏将打开;设置为 0 时,显示屏将关闭。



图 4.3.2


R32 和 R33:用来区分 gram 的行地址和列地址,R32 和 R33 分别对应 X 坐标和 Y 坐标。当需要写入颜色时,这两个指令可以设置该色彩所在的像素点地址,地址设置完成后就可以写入颜色数据了。


R34:将信息写入 GRAM 指令。如果写入此指令,地址计数器将放大或缩小。


R80~R83:表示 GRAM 地址线的大小。地址列的大小。

4.3.3 ILI9325 初始化

为了完成 TFT-LCD 屏幕的显示功能需要一下几个步骤,第一首先需要初始化 ILI9325,然后是系统上电,接下来延迟 10ms,然后是寄存器设置,接下来设置背光,再是寄存器设置,在最后是显示设置。

4.4 SD 卡初始化及读写

普通的音乐播放器必须有较大容量的储存空间,用来存储一些较大的文件,如音乐,文本和汉字识别库。带电可擦写可编程存储器的容量无法满足 MP3 播放器文件数据的需求。因此,在制作 MP3 播放器时应加入配件 SD 储存卡。 SD 储存卡早已在多种嵌入式设备中被使用,SD 储存卡是一种新一代的记忆设备,它是基于半导体快闪记忆器制作的。它拥有安全性好,数据传到效率高,存储空间大的特点。


SD 卡的初始化,SD 卡的典型初始化过程如下:


1、初始化连接 SD 卡的硬件条件(MCU 的 SPI 配置,IO 端口配置);


2、上电延迟(> 74 CLK);


3、复位卡(CMD0),进入 IDLE 状态;


4、发送 CMD8 以检查是否支持 2.0 协议。


5、根据不同的协议检查 SD 卡(命令包括:CMD55,CMD41,CMD58,CMD1 等);


6、消除 CS,发多八个时钟,结束初始化


所以我们已经完成了 SD 卡的初始化,注意最后发送的八个时钟是 SD 存储卡的额外时钟。


做一些事情。通过 SD 卡初始化,我们可以知道 SD 卡的类型(V1,V2,V2HC 或 MMC)。


初始化完成后,您可以开始读取和写入数据。


SD 卡读取数据,由 CMD17 实现。具体过程如下:


1、发送 CMD17;


2、接收卡响应 R1;


3.接收数据起始标记 0XFE;


4、接收数据;


5.接收 2 个字节的 CRC。如果不使用 CRC,则读取后可以丢弃这两个字节。


6.芯片禁用后,再发送 8 个 CLK。

4.5 FAT 文件系统介绍

音频文件、图像文件、歌词文件(文本文件)等文件格式在 SD 存储卡中储存为 FAT 文件格式。FAT 是一个文件配置表,也可以理解为是一个标准。设计采用 FATl6 / 32。以 FATl6 为例,它将储存的信息一般分 5 个区域:MBR,DBR,FAT,FDT 和 DATA。一般情况下 SD 存储卡是不会去进行分区操作的,因为它一般意义上不会用来当作引导磁盘。通常,从 DBR 区域开始没有 MBR 区域。每个分区的含义如下。


MBR 区:储存分区表和其余信息的主姚初始化记忆区域位于 SD 卡物理扇区中,它记载了 DBR 在其分区信息中的方位。


DBR 区:内容是系统初始化记载。在当中有两个模块,其中一个被称为参数记载表,也称之为 bios paramter block,另外一个模块通常用于初始化作用。BPB 往往用于存储各种各样的扇区,底层目录数据,以及保存数据的通用格式,FAT 数量和供应单元范围。


FAT 区:也就是所谓的文件配置表区域,通常有两个文件分配表在一张 SD 存储卡上,其一用于备份,其一用于运用。文件分配表一般遵循 DBR,而另一文件分配表遵循第一个文件分配表。FAT 表记载每个文件的方位和大小范围。这是一种链式结构。 FAT 使其占用 8 个字节,例如“F8 FF FF 0F FF FF FF FF”是 FAT 表的开始。在这种情况下,四个字段是一个块(从第二个开始),用于指示以下组的存在方向,以便每个位置都可以本地化,并且只能通过该表成功找到文件的整个内容。。如果找到下一个集群,则将其标识为“FFFFF0F”,这是文件的末尾,并且没有后续集群,因此将读取该文件。


FTD 区:这个区域表示的是一个文件数据目录。FATFS 模块的主要目的是将某个文件视为特别标记的文件。 FAT32 可以将根目录视为文件。该分区中的一切目录文件能够被视为用于存储文件数据的列表。因此,目录所占空间的大小不等于目录所包含的数据,但一定不是零,通常占用的存储空间较少。原则是,无论文件目录的组数、扇区数和数据字节数、系统会被分为 32 字节、目录文件和字段是多少,都要详细说明。如表所示 3-1。所示。


DATA 区:文件数据的具体文件存储在该区域, SD 存储卡中的最大空间都被这个文件和区域所占用。如果文件数据长度超过群集长度,则需要多个群集来存储文件。该文件由文件分配表来链接。

4.6 音乐播放的功能设计

播放音乐必须要获取相应的音频文件信息。依据 SD 存储文件中的文件和特定驱动器的存储格式,获得对应的 MP3 文件信息。当 VS1053 音频解码芯片完成初始化且处于接收数据的状态时,文件将会被被读取并以三十二字节的速率发送到 VS1053 的内存中。 VS1053 将进行数据的各种处理并将转换出模拟的信号。使用文件的名字比较来搜索 SD 存储卡中的歌词文本文件。如果相应轨道有文本文件,则所有不超过 6144 个字节文件数据都将传输到内存,用来刷新显示的歌词的是设置的三十毫秒的中断计时器。


加载 SD 存储卡中的 MP3 文件,并选择读取 MP3 文件;


加载音乐播放界面;


初始化 VS1053;输送音频数据至 VS1053 读取解码;


频谱时间同步;


文件读取完毕,自动跳取下一个音频文件。

4.7 音乐播放的控制设计

根据任务书的要求本次设计需要音乐播放器能做到支持按键或者触摸屏切换歌曲和调整音量。借助完整的 VS1053 音频解码模块可以实现这些功能,详细代码如下:


音乐播放的设置控制部分代码:


//设定VS1053播放的音量和高低音//volx:音量大小(0~254)void VS_Set_Vol(u8 volx){    u16 volt=0;       //暂存音量值    volt=254-volx;      //取反一下   volt<<=8;    volt+=254-volx;      //得到音量设置后大小    VS_WR_Cmd(SPI_VOL,volt);//设音量 }//设定高低音控制//bfreq:低频上限频率  2~15(单位:10Hz)//bass:低频增益      0~15(单位:1dB)//tfreq:高频下限频率   1~15(单位:Khz)//treble:高频增益       0~15(单位:1.5dB)void VS_Set_Bass(u8 bfreq,u8 bass,u8 tfreq,u8 treble){    u16 bass_set=0; //暂存音调寄存器值    signed char temp=0;        if(treble==0)temp=0;         //变换  else if(treble>8)temp=treble-8;   else temp=treble-9;    bass_set=temp&0X0F;        //高音设定  bass_set<<=4;  bass_set+=tfreq&0xf;      //高音下限频率  bass_set<<=4;  bass_set+=bass&0xf;        //低音设定  bass_set<<=4;  bass_set+=bfreq&0xf;      //低音上限      VS_WR_Cmd(SPI_BASS,bass_set);  //BASS }//设定音效//eft:0,关闭;1,最小;2,中等;3,最大.void VS_Set_Effect(u8 eft){  u16 temp;     temp=VS_RD_Reg(SPI_MODE);  //读取SPI_MODE的内容  if(eft&0X01)temp|=1<<4;    //设定LO  else temp&=~(1<<5);      //取消LO  if(eft&0X02)temp|=1<<7;    //设定HO  else temp&=~(1<<7);      //取消HO                 VS_WR_Cmd(SPI_MODE,temp);  //设定模式    }    /////////////////////////////////////////////////////////////////////////////////设置音量,音效等.void VS_Set_All(void)         {         //VS_Set_Vol(vsset.mvol);  VS_Set_Bass(vsset.bflimit,vsset.bass,vsset.tflimit,vsset.treble);    VS_Set_Effect(vsset.effect);}//装载获取频谱数据所需要的补丁void VS_Load_SPEC_Patch(void){  int i=0;//  printf("VS_Load_SPEC_Patch:%d",(sizeof(dtab)/sizeof(dtab[0])));  for(i=0;i<970;i++){    VS_WR_Cmd(atab[i], dtab[i]);     }}/////////////////////////////////////////////////////////////////////////////////////////// //频谱显示部分#define SPEC_DATA_BASE   0X1810   //0X1380 for VS1011//得到频谱数据//*specbuf:频谱数据缓存区//返回值:频段数.u8 VS_Get_Spec(u16 *p){  u8 bands;  u8 i;  VS_WR_Cmd(SPI_WRAMADDR,SPEC_DATA_BASE+2);    bands=VS_RD_Reg(SPI_WRAM);          //获取频段数                                                                                            VS_WR_Cmd(SPI_WRAMADDR,SPEC_DATA_BASE+4);    for (i=0;i<bands;i++)   {  //读到的频谱数据范围都是0~31  //[5:0]:当前值  //[11:6]:峰值                                      *p++=VS_RD_Reg(SPI_WRAM);    //读取当前值和峰值 //printf("频谱:%d\r\n",*p);   }   return bands;    }//设定新的中心频率   //buf:中心频率值//bands:buf的大小.对VS1053最大为15void VS_Set_Bands(u16 *buf,u8 bands){  u8 i;    #if SYSTEM_SUPPORT_OS    CPU_SR_ALLOC();  #endif  #if SYSTEM_SUPPORT_OS    OS_CRITICAL_ENTER();  //临界区  #endif        VS_WR_Cmd(SPI_WRAMADDR,SPEC_DATA_BASE+0X58);//地址总是1868,对VS1053,SPEC_DATA_BASE是0X1810.所以加上0X58    for (i=0;i<bands;i++)   {    VS_WR_Cmd(SPI_WRAM,buf[i]);//发送频率数据    }  if(i<15)VS_WR_Cmd(SPI_WRAM,25000);    VS_WR_Cmd(SPI_WRAMADDR,SPEC_DATA_BASE+1);//地址SPEC_DATA_BASE+1,为Samples Rates的起始地址  VS_WR_Cmd(SPI_WRAM,0);  //开始新频率  #if SYSTEM_SUPPORT_OS    OS_CRITICAL_EXIT();  //退出临界区   #endif    }
复制代码

五、系统开发与测试

5.1 开发环境

此设计使用 keil 开发环境。 Keil5 是该系列开发软件的较新版本。它由 Keil Software 制作。它是一种结合了 MCU 和 C 语言的开发软件。它有完整的库文件。是初学者非常友好的开发软件,可以自己测试修改,编辑语言十分的智能,方便; C 语言现在是排行第二的编程的语言,在 STM32 的使用中更是异常强大,C 语言功能系统庞大繁杂,构架比较简单,便于后期的检查学习和维护,最重要的是 C 语言本身是大学课程之一,而且也具有易学,易用的特点;而 keil 软件为开发者提供了一个便捷的平台,该软件拥有很多的编程工具,只有你想不到,没有他找不到,真可谓是应有尽有。 而且该软件要求运行在我们日常使用的 Windows 系统上,这也大大降低了开发者对于开发设备的投入。

5.2 开发步骤

5.2.1 需求分析

根据设计题目及需求,明确了本次设计需要的核心处理器,音频文件格式的处理解码,TXT 格式文件处理,音频文件的存储和传输,显示屏显示歌曲信息和歌词,耳机接听。

5.2.2 芯片选型和器件选择及硬件制作

选择 MiniSTM32F103RCT6 开发板和 VS1053 音频解码模块来完成这次设计。

5.2.3 固件库的使用

这一步骤主要是检查一遍能用到的库文件是否完好,虽然一般情况下是不会出现错误或者漏洞的,即使存在固件库的缺少或者那些固件库是有漏洞的,也可以去网络上下载下来,剪切到对应文件夹。为了达到快速的给中央处理器提供针对驱动的目的,需要熟悉对于固件库的使用和检查。

5.2.4 读写 SD 卡

通过查看 SD 存储卡制造商提供的操作文件,操作验证串行外设接口状态下的 SD 存储卡的各种操作。

5.2.5 操作 FAT 文件系统

在完成读写 SD 存储卡的基础上,试一试对 FAT 文件系统的测试,可以执行部分简单的操作,比如查看全部的文件夹或者是针对文件夹的修改和增删。

5.2.6 音频解码器的调试

通过串行外设接口向音频解码芯片传输文件,该文件是从 SD 存储卡中读取的,当然在读取音频文件是也需要在 SD 存储卡中搜寻同名的文本文件,这个文本文件是在用来生成歌词最终显示在屏幕上的。并在测试过程中针对出现的问题进行调试。

5.2.7 显示屏驱动调试

在 STM32 迷你型开发板的接口上插上 TFT_LCD 显示屏,然后完成显示驱动的测试,同样的也可以利用一些基础的程序去测试显示屏的功能是否完备。

5.2.8 字库的检验

直接使用现成的字库拷入元器件中,然后利用显示屏的驱动配合字库完成对于中文的显示。

5.2.9 系统总体测试与调试

在硬件调试过程中,有两个问题:


1、TFT 屏幕显示屏幕状态。经过多次检查发现是显示屏和开发板接触不良,重新稳定接口后此问题得到解决。


2、播放音乐是耳机内并无无声音,检查后发现是耳机孔和耳机并不配套更换耳机该问题得到解决。

六、总结

本设计采用了 SD 卡、STM32F103RCT6 和 VS1053 的组合, STM32F103RCT6 丰富的外围设备使硬件电路设计更加简单,节省了设计成本。VS1053 供应优秀的音乐解码处理能力,以保证高质量的音质。在显示方面,本设计采用目前流行的彩色屏幕,使播放器显示歌词和歌曲信息更加丰富多彩、立体化。

发布于: 刚刚阅读数: 2
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022-01-06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
基于STM32设计的音乐播放器_三周年连更_DS小龙哥_InfoQ写作社区