成品效果展示:
目录:
详细工程资料下载:毕设&竞赛&课设&实训-基于STM32的音乐播放器完整电路+PCB源文件+源码等.zip资源-CSDN文库
一、介绍
1.1 背景
随着计算机技术、微电子技术和数字信号处理技术的不断发展和普及,各种消费电子产品如MP3、数码相框等产品层出不穷。其中,新一代数码产品具有强大的MP3播放功能,并不断开发出其他新颖功能,例如可以直接播放电影、显示照片等。这些产品集成了MP3的优点,并拥有更多新功能,使得它们在市场上得到了消费者的青睐。
对于MP3来说,尽管其销量在近年来有所下滑,但随着MP5的出现,MP3的市场地位已经岌岌可危。MP5不仅具备了MP3的功能,还具有MP4、AVI、RMVB等多种主流电影格式的播放功能,这使得它几乎完全取代了MP3的地位。此外,数码相框作为一种新型数码产品,也具有强大的图像播放功能,同时还可以播放MP3音乐,使照片浏览更加有声有色。
新一代数码产品之所以能够受到消费者的喜爱,是因为它们不仅具备了原有的MP3功能,还不断开发出其他新颖功能,例如直接播放电影、显示照片等。这些产品集成了MP3的优点,并拥有更多新功能,使得它们在市场上具有更强的竞争力。
1.2 本次设计的主要内容
设计一个基于STM32F103的多功能MP3,需要实现MP3播放、收音机、图片播放、温度计、彩色台灯、功率放大、万年历、闹钟、游戏和电子书等功能。整个系统由音频解码部分、收音机部分、音效处理部分、SD卡部分、功率放大、电源部分、人机交互等几个部分组成,通过一块MCU(STM32F103RBT6)控制运行,各部分协调运作,使用LCD和触摸屏作为人机交互工具,通过彩色液晶屏作为输出,使用触摸屏作为输入。这个系统的设计具有很多挑战性,因为涉及到FAT文件系统解析、JPEG/BMP数据格式解析和触摸屏控制等技术。
为了解决这些挑战,设计团队决定采用各个击破的方法,逐步实现各项功能。最终,他们成功地实现了整个系统的功能,从而完成了一个具有多功能和实用性的MP3设计。
表1.1:
任务/功能 | 描述/数据 |
---|---|
MP3播放 | 使用音频解码器播放MP3文件,通过MCU控制音量和播放进度。 |
收音机功能 | 通过收音机模块接收无线电信号,并将其转换为音频信号播放。需要选择合适的频率范围。 |
图片播放功能 | 使用SD卡存储图片文件,通过MCU控制图片的加载和播放。 |
温度计功能 | 连接温度传感器,实时监测环境温度,并通过LCD显示。 |
彩色台灯功能 | 使用LED灯作为台灯,通过MCU控制灯的颜色和亮度。 |
功率放大功能 | 将音频信号放大到足够的功率,供外部扬声器或耳机使用。 |
万年历功能 | 通过连接实时时钟模块,显示当前日期和时间。 |
闹钟功能 | 设置闹钟时间,并在到达闹钟时间时通过蜂鸣或震动提醒用户。 |
游戏功能 | 预留游戏开发空间,根据需求添加游戏内容。 |
电子书功能 | 使用SD卡存储电子书文件,通过MCU控制电子书的加载和翻页。 |
MCU选择 | STM32F103RBT6,具有丰富的外设和接口,适合作为主控制器。 |
人机交互工具 | LCD显示屏和触摸屏,用于显示信息和接收用户输入。 |
输出设备 | 彩色液晶屏用于显示温度计、闹钟等功能的输出信息。 |
输入设备 | 触摸屏用于选择菜单、输入数据等操作。 |
文件系统解析 | FAT文件系统用于存储MP3、图片、电子书等文件。需要实现FAT文件系统的读取和写入功能。 |
数据格式解析 | JPEG/BMP格式的图片文件需要实现解析和显示功能。 |
触摸屏控制 | 通过STM32F103RBT6控制触摸屏的驱动和交互逻辑。需要实现触摸屏的读取、识别和响应功能。 |
二、系统硬件设计
2.1 整体设计思路
由于多功能MP3需要实现图片浏览和MP3播放两大功能,对RAM和处理速度的要求较高,因此首先需要考虑控制芯片的选择。可供选择的八位机有AVR、PIC等,而可供选择的32位处理器有SAMSUNG、NXP、STM32、ATMEL等。
对于控制芯片的选择,首先要有丰富的RAM,八位机主要靠扩展,内部RAM一般在4Kbyte以内,更多的RAM得靠外扩,而32位机里面,SAMSUNG一般不内带RAM,也要外扩。对于本设计来说,成本越低越好,外扩RAM和FLASH芯片必然加大成本。因此,控制芯片最好拥有自带的FLASH和RAM。
其次,由于本系统需要存储MP3音乐和JPEG图片等文件,存储媒介的选择也很重要。可供选择的有FLASH芯片和SD卡、U盘等。如果选择FLASH芯片,则整个系统要求较多的IO口来读取,扩容存在困难。而U盘和SD卡都是不错的选择,但SD卡相对于U盘,读取容易且相同容量的SD卡价格较低。因此,系统选择SD卡作为存储媒介。
另外,系统播放MP3需要同时读取SD卡和VS1003,都要用到SPI口,因此控制芯片最好有两个SPI接口。
最后,彩色台灯的控制需要通过PWM调制来实现调光,因此控制芯片需要至少三路PWM输出。通过以上分析,本系统选择STM32作为控制芯片。STM32是ST公司最新推出的基于Cortex-M3构架的STM32F103RBT6芯片。该芯片具有6通道的16位PWM输出、RTC时钟、两个高速SPI、两个IIC、三个串口、自带USB和CAN接口等优点,能够满足本系统的需求。同时,该芯片还具有128K flash和20K的SRAM,对本系统来说足够使用,并且还有很大的升级空间。
2.2 硬件器件的选择
在系统实现过程中,硬件选择是一个关键环节。我们已经选定了控制芯片,现在需要选择其他芯片来实现系统的各项功能。接下来,我们将对系统相关其他芯片的选型进行重点分析。
2.2.1 MP3解码芯片选择
由于采用了ARM处理器,MP3解码有两种方法。其中,通过ARM处理器软解码需要较高的处理器运算能力,在高码率MP3解码时可能会影响处理器的性能,导致解码效果不佳。另外,解码后的音频还需要外部DAC进行输出。因此,我们选择了通过外部解码芯片直接解码的方法。
MP3解码芯片常见的有VS100X系列和STA01X系列。VS系列解码芯片自带DAC输出,支持多种格式解码,而STA系列则需要外加DAC,相对麻烦一些。经过对比,我们选择了VS1003作为本系统的MP3解码芯片。
VS1003支持MP3、WMA、WAV、MIDI等多种格式的解码,自带DAC输出。同时,它还具有调节音量、高低音等功能,并且具有MIC功能,可以实现录音功能。这为我们以后扩展功能提供了可能性。
2.2.2 收音机芯片选择
本系统只支持FM收音功能,采用TEA5767芯片实现。TEA5767是飞利浦公司生产的一款低功耗电调谐调频立体声收音机芯片,具有内部集成的中频选频和解调网络,可完全免调,只需少量小体积的外围元件。该芯片适用于欧洲、美国和日本等地的FM波段环境。通过IIC总线控制该模块,即可实现调频接收,频率覆盖范围从76~108MHz,为立体声接收,并带有信号强度指示。由于TEA5767芯片体积较小,焊接难度较大,因此我们选择直接使用TEA5767模块,其体积小、价格低、使用方便,不仅可以节省时间和成本,而且效果也相当好。
2.2.3 温度传感器选择
该系统具有温度指示功能,用来指示当前温度,因为日常温度的范围一般是-20~50℃以内,所以,温度传感器要能在这个范围内给出正确的温度。
经过分析,选用美信公司的单总线数字温度传感器DS18B20,该数字温度传感器将检测的温度信息转化为相应的数字量,独特的一线接口,只需要一个IO口线就可以读写该器件了。简化了分布式温度传感应用,并且无需外部元件可用数据总线供电,电压范围为3.0 V至5.5 V,无需备用电源。该芯片的测量温度范围为-55℃至+125 ℃ 。在 -10 ℃至+85 ℃范围内精度为±0.5℃。
2.2.4 彩灯驱动芯片选择
本系统采用3W的共阳RGB三基色LED作为彩色台灯的光源,每个灯芯功率为1W,驱动电压一般为3.3V左右。由于系统采用STM32控制,需要使用PWM调光且IO口的电压为3.3V,因此对驱动芯片的选取比较严格。
经过分析,我们选择了AP2306来驱动LED,它需要3.3V电压,我们通过LM2576来获得该电压。LM2576是降压开关型集成稳压电路,内含固定频率振荡器、基准稳压器和保护电路,包括电流限制及热关断电路等,只需极少的外围器件便可构成高效稳压电路。
获得3.3V驱动电压后,通过控制AP2306来调节LED亮度。AP2306为低压驱动的N型MOSFET,具有极低的导通电阻和栅极电压,可以提供2.6A的输出电流。它满足系统的要求,并且在AP2306上消耗的功耗非常低。
2.2.5 音效处理芯片选择
VS1003已经自带音效处理功能,但效果不佳,且无法对外部音源进行处理,导致外部音源和收音机的音源无法得到有效处理。因此,本系统选择使用一块外部数字音效处理芯片来进行音效处理。
本系统总共有三个音源:MP3音源、收音机音源、外部输入音源。因此,音效处理芯片需要具有多个音源选择功能,否则需要外扩音源选择芯片。经过选择,本系统最终选择了PT2314作为音效处理芯片。
PT2314是一个具有四组立体声输入的双声道数字音质处理器。它可以将音量、音调(低音和高音)、声道平衡(左/右)和响度等处理以及输入增益选择内建于单一芯片中。通过使用PT2314,本系统仅需要少数外部组件即可实现高效能的音质处理系统。所有功能均由I2C总线来达成控制。启动时的设定状态为音量-78.75dB,输入声道为四通道立体声,所有扬声器输出皆为静音,输入增益、低音和高音设置皆为0dB。
2.2.6 EEPROM芯片选择
本系统需要保存部分用户数据,但是由于STM32内部没有EEPROM,因此需要外扩EEPROM芯片以实现用户数据的保存。为此,本系统选择了美国Ramtron公司的新一代FRAM铁电存储器FM24C16。
铁电存储器是FRAM的核心技术,这种特殊材料使铁电存储器兼具RAM和非易失性存储器的特性。当铁电晶体材料上加入电场时,晶体中的中心原子会沿着电场方向运动,达到稳定状态。晶体中的每个自由浮动的中心原子只有两个稳定状态,一个记为逻辑中的0,另一个记为1。中心原子能在常温下停留在此状态达数十年之久。
与EEPROM相比,FRAM具有以下优点:
1. FRAM可以以总线速度写入数据,写入后不需要延时等待;
2. FRAM有近乎无限次写入寿命;
3. FRAM的写入速度更快,功耗更低,写入能量需求更小。
因此,本系统选择FRAM铁电存储器FM24C16作为外扩EEPROM芯片,以满足用户数据保存的需求。
2.2.7 功率放大芯片选择
本系统包括两块放大芯片。第一块芯片主要用于放大从PT2314输出的音频信号,以驱动耳机。在此,我们选择了音质较好且输出功率较大的TPA152芯片。
另一方面,考虑到作为台灯使用时,体积小巧且不需要散热的D类功放更为适合。因此,我们选择了TPA3100D2作为功率放大芯片。
TPA3100D2是一款高效率的立体声D类音频功率放大器,由德州仪器生产。它可以向8欧姆负载提供20W的功率,而向12V电源的8欧姆负载则提供10W的功率。其工作电压为10V-26V,效率高达92%,不需要散热器。该芯片适用于本系统,满足功率放大和体积小巧的要求。
2.2.8 电源芯片选择
为了满足本系统的多个电压输入需求(2.5V、3.3V、5V、12V),需要对电源进行特殊处理,并分为两组:功率电源和系统电源。
功率电源主要包括给彩色台灯供电和给TPA3100D2供电的电源。对于TPA3100D2的功率电源,采用外部电源(DC12V)直接输入,不经过稳压芯片。而彩色台灯的电源则需要经过稳压芯片,这里选择了LM2576-3.3V。
系统电源主要包括给数字芯片供电的电源,包括2.5V、3.3V和5V。这些电源的功率不大,可以选择REG1117-2.5V和REG1117-3.3V稳压芯片提供2.5V和3.3V的电压。REG1117可以输出800ma的电流,足以满足要求。
至于5V输入,考虑到整个系统的数字部分电源都来自5V,且电流较大,因此选择继续使用LM2576。更主要的原因是,直接从12V降至5V如果采用一般的线性稳压芯片,功耗会很大。而采用LM2576开关型集成稳压电路可以有效降低功耗。
2.2.9 人机交互设备选择
人机交互设备中,输出设备需要采用彩色液晶屏幕,因为系统具有电子相册功能。经过考虑,选择了一款2.4寸的TFT液晶屏,其分辨率为240*320,65K色,工作模式为8位数据模式,并且所需IO口较少,速度也较快。
至于输入设备,为了方便和人性化控制,选择了触摸屏控制。采用电阻式的4线模拟屏,控制简单且效果良好。触摸屏的控制芯片选择了ADS7846,这是TI(BB)公司生产的12位四线触摸屏控制芯片,具有12位精度,可以提供4096的水平和垂直分辨率,而屏幕大小为240*320,所以具有很高的分辨率,有利于提高屏幕控制精度。
在人机交互设备中,输出设备选择彩色液晶屏幕是因为系统具有电子相册功能;输入设备选择触摸屏是因为其控制简单且效果好。为了提高屏幕控制精度,人机交互设备的控制芯片选择具有高精度的ADS7846芯片。
2.3 硬件系统框图
经过上两节的分析可知,整个硬件系统由一个STM32F103RBT6控制器控制。各个模块电路在下面将有详细介绍,这里给出整个硬件系统框图,如图2.1所示。
图2.1 硬件系统框图
从方框图可以看出,整个系统以STM32F103RBT6为核心,通过控制各个模块的工作,使整个系统达到预定的功能。由于电源和功率放大器不受MCU的控制,所以没有在方框图中画出。整个系统由多个模块与MCU连接,形成了一个有机整体,共同实现预定的功能。
2.4 硬件模块化原理图设计
在本节中,将根据上一节的硬件系统框图进行具体的硬件设计。整个硬件系统可以分为若干个模块。下面对这些模块经行逐一介绍。
2.4.1 MCU和DS18B20模块电路设计
MCU在整个系统中的核心作用不可忽视,它负责控制整个系统的运行。为了保证MCU的稳定运行,图2.2所示的原理图包括一个后备电源UPS1、一个主电源VCC3.3和一个模拟电源,并配备了外围必须电路,如滤波电容、下载电路(串口1)以及复位开关。
为了实现时钟功能的后备电源电路,系统采用了双电源结构,当外部电源断开时,后备电源才给实时时钟供电,以保持时钟的计时。此外,为了调试方便,电路还增加了一个多余的按键和LED灯。考虑到某些模块对速度的要求,对MCU的IO口进行了特殊安排,虽然增加了布线难度,但提高了执行速度。多余IO口则全部引出,方便以后扩展其他功能。
为了节省IO口资源,将PT2314、TEA5767和FM24C16这三个器件挂在了IIC总线上。这三个器件都是使用IIC总线控制的,因此这样的安排可以节省MCU的IO口。
图2.2 MCU和DS18B20模块电路
温度传感器DS18B20的电路比较简单,通过一个简单的RC滤波给其供电再通过一个普通IO口连接到MCU上,实现MCU和DS18B20的连接。
2.4.2 MP3解码模块电路设计
MP3解码模块使用VS1003解码芯片,该芯片能够解码MP3、WMA、MIDI、WAV等格式的音频文件,并支持录音功能。然而,在本系统中未使用录音功能,但保留了相关电路以备日后升级。整个模块电路如图2.3所示。
图2.3 MP3解码模块电路
为了确保VS1003芯片工作稳定,该模块中使用了大量滤波和去耦电容,以提供稳定的外部条件。由于该芯片既有模拟电源又有数字电源,对音质有直接影响,因此对这些电源的处理至关重要。
以上内容是对“MP3解码模块电路”和“VS1003芯片的电源处理”的描述。
2.4.3 收音机模块电路设计
本系统直接采用了TEA5767收音机模块,这大大简化了外部电路的设计。只需要几个元件就能实现收音机功能。在电路原理图(图2.4)中
图2.4 收音机模块电路
需要注意的是收音机模块对电源的敏感性和对外部电路的干扰较大。为了降低干扰和确保电源的稳定性,对模块电源的处理采用了RC滤波加大电容的方式。同时,通过外接天线ANT可以提高收音机的灵敏度。以上内容是对收音机模块电路和电源处理方式的描述。
2.4.4 SD卡模块电路设计
由于MCU没有专门的SD卡模式接口,只能通过SPI模式访问SD卡,电路图如图2.5所示:
图2.5 SD卡模块电路
SD卡通过SPI模式与MCU进行通信,因此将其连接到MCU的SPI2接口。为了确保SPI通信的正常进行,每个IO口都需要连接一个40K左右的上拉电阻,这里选择了45K。STM32的SPI口在72M时钟的条件下,其SPI时钟速度可达到惊人的18M,这将提升SD卡的读写速度,最高可达2.25Mbyte/s,足以播放任何音频格式。
2.4.5 音效处理模块电路设计
我们选择了PT2314作为音效处理芯片,其电路图如图2.6所示。PT2314支持最多四个输入通道,我们使用了其中三个,其中通道2用于收音机音源,通道3用于外部音源,通道4用于MP3音源。通过IIC控制,可以实现这三个音源的切换。处理后的音频信号从输出端输出到耳机放大器TPA152,通过放大器驱动耳机,从而让用户能够听到所需的声音。
图2.6 音效处理模块电路
PT2314的供电,这里也采用了RC滤波的形式,减少电源上的纹波对芯片工作影响,继而影响音质。图中对该芯片的数字地和模拟地也是进行了严格区分,坚持分开走线,减少了数字信号地对音质的影响。这么做的目的只有一个:让音质更好,更纯净。
2.4.6 FM24C16模块电路设计
铁电存储器FM24C16的电路也是很简单,只要通过简单的供电,然后连接IIC总线,就可以了。电路如图2.7 所示:
图2.7 FM24C16模块电路
2.4.7 彩灯驱动模块电路设计
彩灯驱动采用MOS管AP2306,这款MOS管采用SOT23封装,占用PCB面积很少,因为有RGB三个通道,这里采用三个AP2306来驱动,电路结果如图2.8 所示:
图2.8 彩灯驱动模块电路
上图电路中,对每个AP2306的栅极都通过两个电阻连接,其中一个1K电阻连接到的MCU,另一个通过100K电阻接地。这样的设计非常有意义。1K电阻的作用是在MOS管损坏时,通过电阻回流到MCU的电路电流不会太大,最多3.3mA,而MCU的IO最大能承受8mA的电流。这样,即使在电路出现问题时,也不会导致MCU烧坏。
而100K电阻的主要作用是确保AP2306的可靠关断。由于AP2306是N型的MOS,只有在栅极为高电压时才会导通。因此,加一个下拉电阻接地,确保了MCU的IO在开漏输出或受到干扰时,AP2306也不会误导通。
2.4.8 功放模块电路设计
由于本系统同时具备耳机输出和喇叭输出,因此需要两个音频放大电路:
(1)基于TPA152的立体声耳机放大电路。这个电路结构官方推荐,用于缓冲从PT2314送来的音频信号,并推动耳机工作。耳机输出通过五针专用耳机插座实现,该插座具有开管功能,信号从1、4脚输入,从2、3脚输出。如果没有耳机插上,2、3脚会有音频信号输出;如果耳机插上,2、3脚将不会有音频信号输出,从而实现耳机和功率输出在同一时间只能有一个工作的功能。
(2)基于TPA3100D02的功率放大电路。由于TPA152也是音频信号输出的一部分,因此对其供电也采用了LC滤波形式,以减少电源干扰对音质的影响。
总的来说,这个系统通过两个不同的音频放大电路,实现了既有耳机输出又有喇叭输出的功能,同时通过不同的电路结构和元件选择,确保了音质和系统的稳定性。
图2.9 TPA152耳机放大电路
功率放大电路如图2.10 所示:
图2.10 TPA3100D02功率放大电路
该芯片提供的输出功率与负载电阻和输入电压有关。当采用12VDC供电、负载电阻为4欧姆时,能够提供的输出功率为15W。根据其DATASHEET,可以计算出输出LC滤波环路的参数,其中电感取15mH,电容分别为1uF和0.22uF。
该芯片具有两种功能选择模式:(一)将MUTE接地,则芯片将一直处于工作状态;(二)将MUTE与FAULT相连,可以实现短路检测。在没有出现输出短路时,芯片正常工作,如果出现输出短路,FAULT端将输出高电平,通过MUTE控制芯片停止输出,这样可以有效地保护芯片。
2.4.9 触摸屏控制电路和TFTLCD驱动电路设计
触摸屏控制芯片ADS7846的电路比较简单,电路如图2.11所示:,
图2.11 触摸屏控制电路
TFTLCD驱动电路如图2.12所示。该部分电路也比较简单,不过要注意三个地方,
图2.12 TFTLCD驱动电路
第一个地方是R2,它是LCD背光的限流电阻,用于限制流过LCD背光的电流,防止电流过大烧坏背光灯。第二个地方为了节省IO口,将LCD_BL控制信号与ADS7846的CS共用,因此在软件编写时需要特别注意。第三个地方是TOU_PEN信号在与MCU连接的地方,加入了RC滤波电路。由于这个信号连接到了MCU的中断上,信号线在连接入MCU之前经过了较长的走线且存在较多干扰,而MCU不支持电平触发,因此必须加入滤波电路以使信号平稳。滤波电路如图2.13所示。
图2.13 PEN脚滤波电路
通过示波器观察,正常的中断信号在100HZ以下,而干扰信号则从几Khz到几百Khz不等,所以选取RC滤波电路的参数为R=1Khz,C=1uF,这样得到截止频率为159Hz左右,把干扰基本全部滤掉了。
2.4.10 电源电路设计
电源是整个电路的基础,好的电源能使整个系统更加稳定可靠。对于本系统,按电流大小,电源分为:功率电源和系统电源。功率电源部分如图2.14 所示:
图2.14 功率电源电路
功率电源给主控板和彩灯分别供电,均采用LM2576作为稳压芯片,该芯片可以提供大电流,并具有82%的变换效率,减少了功率损耗,无需散热片,可有效降低电路的面积。外部电源输入处加入了一个二极管,可防止电源被烧坏,并能有效保护系统。系统电源通过REG117获得,该电路简单,如图2.15所示。
图2.15 系统电源电路
这个电路采用两块REG1117芯片给系统提供电源,一块提供3.3V的数字电源和模拟电源,它们通过电感连接,以减少数字电源对模拟电源的干扰。另外一块提供2.5V的电压,给VS1003的DSP提供核心电压。两者的输入电压均来自功率电源的5V输出。
2.5 硬件PCB设计
考虑到系统的复杂性,为了方便调试,将整个电路分为电源板、显示板和系统板三个部分进行PCB布局。电源板由电源、功率放大和彩灯驱动三部分组成。显示板包括TFTLCD、ADS7846和触摸屏三个部分。其他部分的电路都在系统板上。这样的设计有利于调试。
在进行PCB布局时,需要注意以下八个问题:
对于电流较大的走线,应使用较宽的线宽,以降低阻抗,提高电路稳定性。
对于功率放大电路,建议采用单点接地的方式连接芯片,以降低相互干扰,提高放大效果。
走线时应避免锐角和直角,最好采用弧形走线,以减少尖端产生的EMI(电磁干扰)。
去耦电容应靠近芯片放置,以提供更好的电荷存储和滤波效果。
信号线应避免长距离平行走线,以防止信号相互耦合。
对于高频部分,走线应尽量短,如电路中的晶振,应尽量安排在离芯片最近的地方。
数字地和模拟地应严格区分,在其连接处可通过磁珠、电感或电阻进行滤波,以减少数字部分对模拟部分的干扰。
在空白区域,可以适当地覆铜并连接到地线,以提高系统的抗干扰性,但严禁构成回路,以免引入其他干扰。
以下是一个设计表格,其中包含了上述提到的八个问题以及相应的解决方案:
问题 | 解决方案 |
---|---|
电流较大的走线 | 使用较宽的线宽以降低阻抗,提高电路稳定性。 |
功率放大电路 | 建议采用单点接地的方式连接芯片,以降低相互干扰,提高放大效果。 |
锐角和直角走线 | 最好采用弧形走线,以减少尖端产生的EMI(电磁干扰)。 |
去耦电容 | 去耦电容应靠近芯片放置,以提供更好的电荷存储和滤波效果。 |
信号线长距离平行走线 | 信号线应避免长距离平行走线,以防止信号相互耦合。 |
高频部分走线 | 走线应尽量短,如电路中的晶振,应尽量安排在离芯片最近的地方。 |
数字地和模拟地连接处 | 数字地和模拟地应严格区分,在其连接处可通过磁珠、电感或电阻进行滤波,以减少数字部分对模拟部分的干扰。 |
空白区域覆铜并连接到地线 | 在空白区域,可以适当地覆铜并连接到地线,以提高系统的抗干扰性,但严禁构成回路,以免引入其他干扰。 |
根据以上布线原则,设计了本系统的电源板PCB如图2.16所示、显示板PCB如图2.17所示、系统板PCB如图2.18所示。
图2.16 电源板PCB
图2.17 显示板PCB
图2.18 系统板PCB
在本章中,我们首先对整个设计的总体方案进行了选取,包括存储媒介的选择、MCU的选型、硬件器件的选型以及互交方式的确定,经过总体方案论证,我们得到了初步的技术方案,具体确定了硬件器件的选型。接着详细介绍了各模块硬件电路的设计,并且介绍了一些本系统的PCB布线规则,接着下来的任务就是设计该系统的软件系统。软件系统的设计将在下一章详细说明。
三、 系统软件设计
3.1 设计思路
上一章我们已经完成了多功能MP3的硬件系统设计,但要使其正常工作,软件系统的支持不可或缺。软件作为硬件的灵魂,控制着整个系统的运行,其重要性在某种程度上甚至超过了硬件。
对于整个MP3的软件系统来说,其复杂性不容小觑。因此,我们需要采用模块化的设计思想,逐步将整个软件系统划分为子系统,再细化为单一功能的模块,最后整合成一个大系统来实现预期的功能。
总的来说,软件系统的设计是整个MP3系统的关键部分,它决定了MP3能否正常运行,能否提供预期的功能。因此,我们需要认真对待软件系统的设计,确保其质量和性能。
3.2 软件模块化设计
从整个系统来看,软件可以被分为两个主要部分,与硬件直接相关的底层驱动软件子系统和与硬件无关的应用软件子系统。这两个子系统再细分为许多模块。
对于底层驱动软件子系统,包括如LCD驱动模块、触摸屏驱动模块、SD卡驱动模块等模块程序。这些模块主要实现一些基本的底层功能,如硬件初始化、与硬件密切相关的时序函数等。
对于应用软件子系统,包括如JPEG/BMP解码模块、音乐播放模块、图片浏览模块等模块程序。这些模块实现整个软件系统的应用功能函数。
在进行模块化程序设计时,我们需要明确每个模块的功能作用,将其划分为独立的功能模块,封装为函数,以便其他模块调用。底层驱动主要实现一些基本的底层功能,如硬件初始化、时序函数等。而应用层则实现整个软件系统的应用功能函数。这样设计有助于提高软件的可维护性和可扩展性。
3.2.1 LCD模块驱动程序设计
本系统使用的LCD支持八位数据模式,驱动IC型号为FMT0371,这是一个由松下合资厂生产的LCD驱动IC,最高支持26万色的TFT LCD。配套的LCD使用的是六十五千色八位数据模式。根据该LCD的DATASHEET,每个像素点的GRAM实际上是一个18bit的数据寄存器。在16bit模式下,与写入数据的对应关系如图3.1所示。这意味着,如果要在16bit模式下写入数据,需要按照图3.1中的对应关系进行操作。
图3.1 写入数据与GRAM对应关系
上述材料中详细描述了LCD的驱动过程,其中包括关键函数和如何与MCU(微控制器)进行连接。其中还详细说明了如何对LCD寄存器进行读写以及初始化操作,并且阐述了如何通过写数据来画点。下面是具体说明:
1. 对LCD寄存器的操作:为了将数据写入LCD寄存器,需要将RS线设置为低电平,表示要写入寄存器。然后拉低片选信号(CS),向BL线发送数据。接着,通过一个WR脉冲,数据就可以被写入LCD了。完成操作后,需要释放RS、CS线,以完成此次操作。读取寄存器的过程类似,只不过要将WR脉冲替换为RD脉冲。
2. LCD读写数据:对LCD数据进行读写的过程与读写寄存器类似,只需要将RS线设置为高电平,表示要对数据进行读写操作。
3. LCD初始化:初始化过程涉及到LCD内部许多寄存器的初始化,比较复杂。具体过程在附件中的代码中有详细说明。
4. LCD画点:首先需要设置LCD开始显示和结束显示的区域,然后通过0X02H~0X04H这四个命令实现。之后写入0X0E命令,开始写入像素值(16bit)。对于画点,只需写入一个像素点即可,这样就完成了在LCD上画一点。
这段描述对理解和使用LCD驱动非常有帮助,尤其是在如何设置寄存器、读写数据、初始化LCD以及画点等方面提供了详细步骤和指导。
3.2.2 触摸屏模块驱动程序设计
触摸屏工作原理及ADS7846的工作原理对于整个系统的控制至关重要。电阻式触摸屏通过测量触摸点在屏幕上的坐标位置,配合显示屏,以获取触摸者的意图。触摸屏的两个金属导电层上施加电压后,可在对应电极上反映触点的坐标值。四线式触摸屏通过两根X线对和两根Y线来实现触点位置的检测。
ADS7846是一个具有快速转换和低噪声性能的ADC(模数转换器)。它通过串行接口与微控制器通信,支持高达250kHz的转换率,能够提供高精度的数字输出。它具有双电源供电,可以同时处理模拟和数字信号,以及高速、低噪声和低功耗的特点。ADS7846的控制流程简单易行,可以在嵌入式系统中广泛应用。
在触摸屏控制算法中,需要考虑到触摸屏的响应速度、精度和稳定性等因素。通过对ADS7846的正确配置和使用,可以确保整个系统的稳定性和可靠性。因此,对触摸屏和ADS7846的工作原理的理解和掌握,对于设计和实现嵌入式系统输入系统至关重要。
图3.2 触摸屏触摸示意图
图3.3 触摸屏输入系统的组成
ADS7846控制器的主要功能是分时向X、Y电极对施加电压,并将测量电极上的电压信号转换为相应的触摸点坐标。ADS7846内部有一个由多个模拟开关组成的供电-测量电路网络和12位的A/D转换器。根据微控制器发来的不同测量命令,ADS7846会导通不同的模拟开关,向工作面电极对提供电压,并将相应测量电极上的触点位置所对应的电压模拟量引入A/D转换器。在触摸点X、Y坐标的测量过程中,测量电压与测量点的等效电路如图所示,通过该电路,可以获得测量点的电压模拟量,进而通过A/D转换器转换为数字信号,以实现触摸点的精确定位。
图3.4 ADS7846的功能框图
图3.5 测量关系
图3.6 笔中断请求
ADS7846 通过笔中断请求向 MCU 表示有触摸发生。当有触摸时,笔中断输出引脚通过内部连接到地而输出低电平,向 MCU 发中断请求。MCU 接收到中断后,读取 ADS7846 的数据,得到 X、Y 的坐标值。这些坐标是在触摸屏上的绝对坐标(0~4096),需要通过校正转换为实际坐标。
校正原理是触摸屏的绝对坐标系统在同一点的输出数据是稳定的,但由于技术原理的原因,不能保证绝对坐标定位,点不准,这就是触摸屏最怕出现的问题:漂移。为了解决漂移问题,很多应用触摸屏的系统启动后,需要先执行校准程序。
触摸屏校正的思路是从触摸屏上采集到四个角的物理坐标,根据这些坐标和像素坐标之间的关系,使用待定系数法算出坐标系之间的平移关系。在读取触摸屏坐标的特定函数中,按照这个变换关系可以把物理坐标转换为像素坐标。
本系统采用 4 点校准,在 void touch_adjust(void) 函数中实现。ADS7843 的初始化在 void touch_init(void) 函数中实现,该函数能自动检测是否需要校准,还包括了对实时时钟中断的配置。其他触摸屏控制的函数均在 touch.c 文件中。
简单来说,触摸屏的校正就是通过采集物理坐标和像素坐标之间的关系,根据这些关系进行转换,以达到实际应用中的精确控制。
3.2.3 SD卡模块驱动程序设计
SD卡有两个可选的通讯协议:SD模式和SPI模式。其中SD模式是SD卡标准的读写方式,但是它需要使用带有SD卡控制器接口的MCU或者加入额外的SD卡控制单元。然而,STM32F103RBT6没有集成SD卡控制器接口,但是它拥有强大的SPI接口,因此选择了SPI模式来读取SD卡。
在SD卡上电初期,它会自动进入SD总线模式,并发送复位命令CMD0。如果SD卡在接收复位命令过程中CS(片选线)保持低电平有效,则进入SPI模式进行通信;否则,它将在SD总线模式下工作。
SD卡的初始化过程可以通过SD_Init()函数实现,该函数还包括对STM32F103RBT6的SPI2接口的初始化。具体的实现细节可以参考附件中的说明。
总的来说,由于STM32F103RBT6没有集成SD卡控制器接口,因此为了支持SD卡的读写,我们选择了使用其强大的SPI接口来与SD卡进行通信。具体的初始化过程通过SD_Init()函数来实现,包括了对STM32F103RBT6的SPI2接口的初始化。
图3.7 SD卡初始化
SD卡可以通过发送SD卡命令完成读写操作。初始化SD卡后,可以进行读写操作。SPI总线模式支持单块和多块写操作,其中多块操作是指从指定位置开始写下去,直到SD卡收到一个停止命令才停止。单块写操作的数据块长度只能是512字节。当应答为0时,说明可以写入数据,且数据块被正确写入SD卡。
读取SD卡中的数据时,需要发送CMD17命令,接收正确的第一个响应命令字节为0xFE,随后是512个字节的用户数据块,最后为2个字节的CRC验证码。这些操作的实现代码包括SD初始化的代码都在MMC_SD.c文件中。
3.2.4 VS1003模块驱动程序设计
VS1003是一款采用SPI模式进行通信的模块,它被挂载在SPI1总线上。在对相关IO口进行正确配置后,可以对VS1003模块进行初始化。VS1003通过7根线与MCU进行通信,包括XRST(复位线)、XDCS(数据片选信号)、XCS(命令片选信号)、DREQ(数据请求)、SCK、SI、SO。
初始化VS1003模块需要按照一定的步骤进行。首先进行硬复位,将XRST设置为0。接着进行延时,将XDCS、XCS、XRST置为1。在此之后,等待DREQ变为高电平,表示数据请求已经准备好。
接下来,需要对VS1003进行软件复位,将SPI_MODE设置为0X0804。等待DREQ再次变为高电平,表示软件复位已结束。
然后,需要设置VS1003的时钟和采样率。将SCI_CLOCKF设置为0X9800,并对其进行3倍频,以获得合适的时钟频率。同时,将SPI_AUDATA设置为0XBB81,以设置采样率为48K,并且立体声模式。
接着,需要对VS1003进行重音、音量等设置。将SPI_BASS和SCI_VOL分别设置为合适的值。
最后,向VS1003发送四个字节无效数据,启动SPI发送过程。这些操作都在VS1003x.c文件中通过void Vs1003_Init(void)函数实现,该文件还包括其他相关的VS1003操作函数。
总的来说,VS1003模块的初始化需要经过一系列步骤,包括硬复位、延时、软件复位、设置时钟和采样率、设置重音和音量等操作。这些操作都在VS1003x.c文件中通过相应的函数实现。
步骤 | 描述 |
---|---|
硬复位(XRST = 0) | 将VS1003模块复位。 |
延时(XDCS、XCS、XRST置1) | 等待一段时间,可能用于模块的初始化和准备。 |
等待DREQ为高 | 等待数据请求(DREQ)线变为高电平,表示数据已经准备好。 |
软件复位(SPI_MODE=0X0804) | 对VS1003进行软件复位。 |
等待DREQ为高(软件复位结束) | 等待软件复位完成后,确保模块处于正确的状态。 |
设置时钟(SCI_CLOCKF=0X9800,3倍频) | 设置VS1003的时钟频率。 |
设置采样率(SPI_AUDATA=0XBB81,采样率48K,立体声) | 设置VS1003的采样率。 |
设置重音(SPI_BASS=0X0055) | 设置VS1003的重音效果。 |
设置音量(SCI_VOL=0X2020) | 设置VS1003的音量。 |
向VS1003发送四个字节无效数据,启动SPI发送 | 向VS1003发送四个无效的数据字节,然后启动SPI发送过程。这可能是为了启动VS1003的通信机制。 |
3.2.5 PT2314模块驱动程序设计
PT2314采用IIC总线和MCU通信,IIC总线应用很多,这里就不在介绍。PT2314的控制寄存器如图3.8所示
图3.8 PT2314控制寄存器
MCU通过IIC总线写入相关的数据,就可以对音量等音效进行设置了。高2~4位用来表示此次操作是对具体哪个功能经行操作,PT2314的器件地址为:0X88,在执行PT2314的操作时,需要注意。PT2314的操作函数均在PT2314.c文件里面,具体请看附件。
3.2.6 FM24C16模块驱动程序设计
FM24C16是一款采用IIC总线和MCU通信的存储芯片,通过标准的IIC操作,可以轻松实现对FM24C16的读写。FM24C16的器件地址与页地址是连在一起的,需要注意。
FM24C16有2048字节的总容量,其中高四位为固定的1010,第四位用来表示页地址0~7。每页拥有256个字节。
对于FM24C16的读操作,先写入0XAx(x:0~7),再写入要读入的地址,就可以开始读取数据了。而对于FM24C16的写操作,则需要先执行上述过程,然后再写入0XAx+1,以执行读操作。
FM24C16的相关操作函数均在fm24c16.c文件中。这些函数提供了对FM24C16进行读写、初始化等操作的接口,方便开发者使用。
3.2.7 TEA5767模块驱动程序设计
TEA5767收音机模块支持IIC和三线模式,这里我们使用IIC来控制。TEA5767的器件地址是0XC0,在对TEA5767的读操作通过写入0XC1来执行。
TEA5767写操作:
- 发送IIC起始信号
- 发送器件地址0XC0
- 等待应答
- 发送一个字节,等待应答,再发送一个字节,等待应答,循环5次
- 发送IIC停止信号
TEA5767的读操作与写操作基本相同,只是IIC开始之后写入0XC1,将发送一个字节改为接收一个字节就可以了。关于TEA5767的其他操作函数均在TEA5767.c里面,见附件。
3.2.8 温度传感器驱动程序设计
温度传感器采用一线数字温度传感器DS18B20,读取DS18B20的温度读取操作过程如下:
- 复位DS18B20
- 检查DS18B20
- 发送0XCC(跳过64bitROM地址)
- 发送0X44启动一次转换
- 复位DS18B20
- 检查DS18B20
- 发送0XCC(跳过64bitROM地址)
- 发送0XBE(读暂存寄存器)
- 获取温度的低字节
- 获取温度的高字节
通过以上操作可以很方便的获取DS18B20的温度值。具体的实现函数在temperate.c文件里面,见附件。
3.2.9 RTC实时时钟驱动程序设计
RTC实时时钟是利用STM32F103RBT6内部的时钟模块实现的,根据STM32的DATASHEET,得到RTC实时时钟的初始化过程如下:
- 使能电源时钟
- 使能备份区域时钟
- 取消备份区域写保护
- 软复位备份区域
- 开启外部低速晶振
- 等待晶振就绪
- 设置LSI作为RTC时钟
- RTC时钟使能
- 设置时钟分频系数
- 等待RTC寄存器操作结束
- 允许RTC配置
- 配置秒钟寄存器
- 配置更新
- 等待RTC寄存器操作完成
到这里就结束了对RTC时钟的设置,RTC时钟在完成以上配置之后,就会每隔固定的时间,对秒钟寄存器(RTC->CNT)进行增1操作。此操作不需要软件参与,全部硬件执行。固定时间由时钟分频系数(RTC->PRL)确定,理论上由于外部低频晶振是32.768Khz,故只要在RTC->PRL内写入32768-1就可以得到精确的1秒了,但是由于晶振的误差,通常需要调整这个值,来得到比较准确的走时。
RTC的具体初始化函数和其他相关操作函数均在calendar.c里面,见附件。
3.2.10 彩灯模块驱动程序设计
彩灯模块采用PWM控制,使用的是TIM4的CH1,CH2,CH3这三个通道来控制。因为要控制每个通道灯的亮度,故采用固定频率,调制脉宽的方式来实现,对应到STM32上则为PWM模式1:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。通过设置TIM4的CCR1值,就可以调整输出的脉宽,从而控制LED的亮度。
TIM4的PWM初始化过程如下:
- TIM4时钟使能
- PORTB时钟使能
- 设置PB6、7、8为复用功能输出
- 设置TIM4计数器自动重装值
- 设置TIM4与分频器值
- 设置TIM4,CH1~3的工作模式
- 设置TIM4,CH1~3的预装载使能
- 使能TIM4预装载
- 使能TIM4
通过以上过程就完成了对TIM4三个通道的初始化,只要在程序里面修改每个通道的比较寄存器(TIM4->CCRx)就可以实现不同占空比的输出了。在这里,我们设置TIM4的分频值为0,即不分频,这样TIM4的计数频率为系统时钟(72Mhz)。自动重装值为500,就可以得到72000/500=144Khz的PWM输出频率。TIM4的具体初始化函数和其他相关操作函数在rgbled.c文件里面,见附件。
以上介绍了驱动部分的程序设计,下面,我们介绍应用软件子系统的程序设计。
3.2.11 JPEG/BMP解码模块程序设计
JPEG/BMP图片播放是本系统的一个重要功能,两者的解码均采用软件实现,BMP的解码相对JPEG比较简单,这里重点介绍JPEG的解码原理。
JPEG解码算法原理:
JPEG压缩是一种有损压缩。它利用人的视角系统特性,使用量化和无损压缩编码相结合的方式去掉视角的冗余信息和数据本身的冗余信息来达到压缩的目的。JPEG算法可分为基本JPEG(Baseline system)和扩展JPEG(Extended system)。其中Baseline system应用尤其广泛。本文主要讨论Baseline system的解码。JPEG解码算法框图如图3.9 所示:
图3.9 JPEG解码算法框图
(1)JPEG算法中不包含颜色空间变换,因为JPEG算法本身与颜色空间无关。然而,由于输出位图数据通常需要RGB表示,因此在算法框图中表示了颜色空间变换,如RGB到YUV变换和YUV到RGB变换。
(2)在JPEG编码过程中,图像被划分为8×8的数据块,称为最小编码单元(MCU)。每个块对应于原图像的一个8×8的像素阵列。各行的编解码顺序是从上到下,行内的编解码顺序是从左到右。为了将整个图像划分为整数个MCU,需要对图像的最右边一列或其最下边一行进行填充,并在解码输出时抛弃这些复制的行列。
(3)在JPEG的熵编码过程中,首先利用空间相关性对各块的直流值进行差分编码,即对相邻块之间的直流差值编码。然后对于交流部分以ZigZag方式扫描块中的元素,并对块内元素采用先游程编码后哈夫曼编码的混合编码方式,得到一维二进制块码流。解码端需要根据哈夫曼编码的原理及其各级码表生成的细节,生成哈夫曼解码表,再根据解码算法来恢复DCT的直流和交流系数。
(4)在JPEG解码端,需要对熵解码出来的系数矩阵乘上相应的量化矩阵以恢复量化值。这个过程被称为反量化。JPEG文件通常包含一个亮度分量的量化表和一个色度分量的量化表。
其中,C(u,v)代表熵解码输出,Q(u,v)代表相应的量化矩阵。
(5)IDCT变换是JPEG解码算法的关键部分,它决定了算法能否满足实时应用的需求。在解码阶段,IDCT将频率域的图像数据转换回空间域,而这个过程的速度取决于8×8的二维IDCT计算速度。在本系统中,JPEG/JPG的解码是通过int Decode(void)函数实现的,该函数之前需要先执行两个函数void InitTable(void)和int InitTag(void),这两个函数分别用于清空量化表和获取解码所需的各种参数。
对于BMP图片的解码,是通过BOOL BmpDecode(FileInfoStruct *BmpFileName)函数实现的,参数BmpFileName包含了BMP图片文件的信息。解码BMP时需要注意一个问题,即每一行的字节数必须是4的整倍数,如果不是,则需要补齐。这意味着BMP的水平像素必须是4的倍数,如果不是,则需要取一个最近的整倍数作为BMP的水平像素。
外部接口函数AI_LoadPicFile(FileInfoStruct *FileName, u8 sx, u16 sy, u8 ex, u16 ey)用于加载并显示图片文件。FileName是待打开的文件信息,sx、sy和ex、ey分别指定了图片在显示时的起始和结束坐标。
3.2.12 FAT文件系统模块程序设计
上述文本主要介绍了FAT32文件系统的构成,包括DBR(DOS BOOT RECORD 操作系统引导记录区)和BPB(BIOS Parameter Block)部分。DBR是FAT32文件系统的首道防线,而BPB是DBR的核心部分。DBR各字节的意义如图3.10所示。DBR和BPB共同构成了FAT32文件系统的基本框架,通过对它们的理解,可以实现和操控FAT32文件系统下的文件。
图3.10 DBR区各字节意义
DBR区内,对我们有用的数据只不过90个字节(即BPB字段)。仅仅是这90 个字节就可以告诉我们关于磁盘的很多信息,比如每扇区字节数、每簇扇区数、磁道扇区数等等。对于这些信息的读取,只要遵循DBR 中的字段定义即可。BPB部分数据字节意义如图3.11所示:
图3.11 BPB部分字段意义
上述文本主要介绍了FAT32文件系统中的FAT表。通过对FAT表的读取,我们可以获取FAT32文件系统的许多重要信息,如每扇区字节数、每簇扇区数、根目录簇号、卷总扇区数以及FAT表所在的扇区号等。FAT表是FAT32文件系统中用于索引和定位磁盘数据(文件)的一种链式结构,它的链式存储机制是FAT32的精华所在。FAT表通常存在于特定的扇区中,并且与另一个FAT表同步,时刻保证它们内容的一致性。当一个FAT表遭到破坏时,可以从另一个FAT表进行恢复。FAT表的内容通常如图3.12所示。
图3.12 FAT表
上述文本主要介绍了FAT32文件系统中的根目录区和FAT表的相关知识。根目录区是FAT32中的一种特殊文件,类似于目录,具有文件名和属性结构。通过文件名可以查到它的首簇,进而获取文件数据。FAT表是FAT32文件系统中用于索引和定位磁盘数据(文件)的一种链式结构,它的链式存储机制是FAT32的精华所在。获取文件的首簇需要知道文件数据的首簇号,只有知道了首簇号才能继续查找下一簇数据的位置,直到数据结束。根目录区可以通过卷标来查询文件名和首簇号。需要注意的是,簇作为FAT32进行数据存储的最小单位,内部扇区是不能进一步细分的,即使一个文件的数据写到一个簇中后,簇中还有容量的剩余,也不能接在后面继续数据的存储。FAT32的簇大小可能会根据存储设备的容量而变化,因此需要特别注意读取和存储文件时的操作方式。
图3.13 FAT文件属性结构
根目录的簇号在BPB信息段已经说明了。找到根目录簇号之后,我们就可以得到其他任何文件的起始簇号了。例如某SD卡的根目录簇如图3.14所示:
图3.14 根目录信息
上述文本主要介绍了FAT32文件系统的文件记录格式和文件读取方法。FAT32文件系统中的文件记录包括文件名、扩展名、卷标、归档等信息,通过读取这些信息可以获取文件的起始簇,进而读取文件内容。FAT32文件名以大写字母表示,长度不足的部分用空格符补齐,并会用~符号替换过长部分,以避免与其他文件名冲突。FAT32文件系统的控制和管理函数可以在FAT.c文件中找到。文件系统的介绍就此结束,相关函数的具体实现和应用将在附件中提供。
3.2.13 音乐播放模块程序设
详细介绍了本系统的第一大功能——强大的MP3播放功能。该功能支持多种格式的音频文件播放,包括MP3、WMA、MIDI、WAV等。此外,还支持歌词显示、频谱显示、音乐彩灯控制等功能。
为了实现MP3播放,需要管理文件和控制VS1003播放音乐文件。为此,使用了两个非常重要的函数:File_Browse和Get_File_Info。File_Browse用于浏览指定类型的文件,Get_File_Info用于获取指定文件的详细信息或当前目录下该类型文件的个数。通过这两个函数的组合,可以方便地实现文件浏览。
此外,还介绍了如何通过接口函数Mus_Play实现播放音乐文件。该函数接受三个参数:要播放的MP3名字、该文件的编号和整个文件夹下面的文件数目。
同时,还提到了频谱显示、歌词显示和音乐彩灯控制等其他功能的实现方法。频谱显示由VS1003执行,通过定时读出频谱分析后的结果并显示到液晶屏上。歌词显示通过初始化处理过程,获取歌词TAG并按照排序后的顺序读入到SRAM里面。音乐彩灯的实现是根据频谱变换得到的值来控制PWM的寄存器,以控制彩灯不同颜色亮度的变化。
此外,还提到了其他处理函数在mp3player.c文件中有详细说明,并提供了附件供查阅。
3.2.14 图片浏览模块程序设计
图片浏览支持JPEG/JPG和BMP格式的图片,并具有自动调整大小的功能,以适应不同大小的图片。您可以选择手动浏览、顺序浏览或随机浏览模式,并可以设置浏览间隔时间。
系统使用AI_LoadPicFile
函数来加载并显示JPEG/JPG和BMP图片。该函数根据指定的坐标范围自动调整图片大小并在屏幕上显示。您可以通过指定起始坐标和结束坐标来定义图片的显示位置。
整个图片浏览和显示的接口函数是Pic_Viewer
,该函数在picture.c
文件中实现。您可以在附件中找到更多与图片显示相关的函数。
3.2.15 游戏模块程序设计
系统的第三大功能是闹钟,目前只实现了一个拼图游戏,但可以方便地添加其他游戏。拼图游戏实现了三个难度级别:3x3、4x4和5x5,并具有保存当前游戏状态的功能,可以在下次开机时继续未完成的游戏,并显示最佳排行。
拼图游戏界面控制使用了一个重要函数Load_Fun_Sel
,该函数可以方便地实现多级界面控制。通过传递目录项列表list
、标题内容title
、确定按钮名称func
、目录项条数len
和开始选中的目录项sel
,可以实现界面的控制和显示。
拼图游戏的算法比较简单,初始化时生成随机乱序时需要注意判断游戏是否能够完成。游戏的核心功能接口在Game_Play
函数中实现。
3.2.16 闹钟模块程序设计
这个闹钟系统功能强大,包括八个闹铃、支持多种铃声(MP3和FM收音)、闹钟响铃设置灵活(单次、每天或自定义)、闹钟处理函数(播放闹钟、获取下一个闹钟时间等)以及闹钟显示接口函数。这个系统为用户提供了全面的时间管理功能,可以根据用户的需求设置不同的闹钟,并在闹钟响起时提供相应的处理和显示。
3.2.17 时间模块程序设计
这个万年历系统功能强大,提供了阳历日期显示、阴历日期显示、24节气显示、星期功能、温度功能以及任意一天的周显示等众多功能。它支持从-55~125度内的温度检测,并提供了一个强大的节气显示功能,涵盖了从2000年到2050年的所有节气。同时,系统还提供了 RTC内时间和当前时间的转换功能,获取RTC时钟的操作也很简单,可以通过函数rtc_get()完成。此外,该系统还提供了一个将阳历日期转换为阴历日期的函数GetChinaCalendar(),以及一个用于获取任意一个阳历日期所对应的周的函数GetWeek()。时间部分的功能接口通过函数Time_Viewer()实现,为用户提供了丰富的日历查询功能。
3.2.18 设置模块程序设计
本系统除了必须有应用型软件,也必须要有管理型软件,对系统的相关参数进行设置。所以本系统有设置模块程序的设计。设计模块主要实现:时间设置、图片浏览设置、音效管理、触摸屏校准、音乐彩灯等设置。
时间设置包括对时间和日期的设置;图片浏览设置则包括对浏览模式的设置和浏览时间间隔的设置;音效管理主要对PT2314相关功能进行设置,还包括对VS1003的设置;触摸屏校准可以使用户在发现屏幕精度下降的时候进行一次校准来提高精度;音乐彩灯的设置主要对音乐彩灯的模式选择,包括禁止、渐变模式和跳变模式。
设置部分的接口函数通过void Set_Viewer(void)实现,见附件。
3.2.19 电子书模块程序设计
这个系统的电子书功能支持多种格式,包括TXT文件、C文件、H文件和LRC歌词文件,可以方便地实现电子书的浏览和阅读。实现电子书功能比较简单,因为系统已经支持了文件系统的浏览、汉字和字符显示。
电子书阅读主要通过Read_Book函数来实现,该函数接受一个FileInfoStruct指针作为参数,用于指定要打开的电子书文件。在函数内部,实现了对中英文字体的识别,并使用有序的字体在LCD上显示文字。LCD的大小为240*320,使用的字体为16*16大小的宋体,如果全部用来显示汉字,则整个屏幕可以显示300个汉字。
字体文件保存在SD卡的SYSTEM文件夹下的FONT文件夹内,包括FONT16和FONT12两种大小的字体。字体文件是通过在电脑上用专门的软件按特定格式生成的字体点阵数据。在读取字体点阵时,只需按照字体的GB2312码值,在字体文件中偏移相应的位置,读取相应长度字节的数据即可得到该字体的点阵码,然后输出到LCD上即可显示文字。
在Get_HzMat函数中,得到了汉字的点阵数据。对于字库中未找到的字体,则在mat数组中返回全1。显示字体通过show_font函数实现,该函数接受坐标、字体数据和显示模式作为参数。通过组合以上几个函数,再加入文件浏览函数和控制函数,可以实现电子书阅读功能。电子书模块的接口函数通过Txt_Viewer函数实现,用户可以通过该函数来调用电子书阅读功能。
3.2.20 收音机模块程序设计
这个系统的第七大功能是收音机功能,它包括搜索模式选择、搜索级别设置、频段选择和后台播放等功能。收音机模块的接口函数Radio_Play()可以实现收音机的播放功能,同时系统在做其他功能时仍可以同时收听收音机。用户可以通过选择不同的搜索模式、频段和级别来满足不同的收听需求,同时后台播放功能也使得用户在操作其他功能的同时可以继续收听收音机。
3.2.21 彩灯控制模块程序设计
这个系统的第八大功能是彩灯功能,通过该功能可以实现彩色台灯的功能。由于采用了大功率的LED光源,彩灯既可以作为装饰,也可以作为照明。彩灯模块程序实现了模式选择、时间间隔设置、后台执行、色彩调用和保存等功能。
彩灯控制模块的接口函数RGBLED_Play()实现了彩灯的控制,用户可以通过选择不同的模式、设置时间间隔、后台执行以及保存和调用色彩来满足不同的需求。用户可以在看到自己喜欢的颜色后方便地保存和调用,同时也可以在系统执行其他功能时让彩灯正常工作。
3.3 系统整合
接下来,需要将各个模块程序的整合起来,形成一个完整的系统。主控制程序通过调用各个模块的相关函数,实现了整个系统的功能整合。系统开机后,首先进行硬件模块的初始化,然后初始化FAT文件系统,并判断是否成功。如果系统文件未能成功加载,系统将一直检索SD卡,直到检测到能被系统识别的卡和文件系统为止。接下来查找系统文件,包括字体文件、图标文件和游戏图标文件。其中,字体和图标文件在系统加载时是必须的,如果丢失,系统将一直检索,直到搜索到所有系统文件。游戏图标文件则在游戏时进行检索,以提高启动成功率和速度。整个流程图清晰地展示了整个系统的运行过程,为系统的整合提供了明确的方向。
图3.15 系统主控程序流程图
系统整合在int main(void)函数里面实现,见附件。
3.4 本章小结
本章详细介绍了本系统的软件设计,包括各个部分的软件设计思想和实现方法。重点阐述了触摸屏原理、JPEG/BMP的解码方法和FAT32文件系统的解析。最后对整个系统的运行进行了解析整合。至此,多功能MP3系统的设计已经基本完成,接下来的任务是对系统进行调试和测试。
第四章 系统调试
4.1 独立调试
上两章针对软硬件系统进行了设计,实际上在以上设计中,已经包括对调试中出现的问题处理。在设计的时候不可对所有问题都想的做到,这就需要调试中发现问题,再解决问题。最终实现我们设计的目标。这一章主要讲述在调试过陈中发现的几个典型问题。
4.1.1 硬件调试问题
硬件调试时遇到三个问题。第一个问题是触摸屏中断的误触发问题,通过加入滤波电路解决了这个问题。第二个问题是LED光源极性与设计相反的问题,通过调整硬件解决了这个问题。第三个问题是FM24C16在低电压(3V)时不能正常工作,这个问题需要通过更换元件或调整电压来解决。
图4.1 RC滤波
问题2是在调试RGBLED时,LED不亮,但实际上LED是好的,只是灯上标志的正负极弄反了。如图4.2所示。
图4.2 RGBLED上的标志
这样原电路上的驱动电路就不能用了,只能修改电路来适应RGBLED,原本采用IRF7314驱动的不得不改成AP2306驱动,如图4.3所示:
图4.3 修改后的LED驱动电路
修改电路后,驱动RGBLED正常。
问题3,该问题在调试FM24C16代码的时候发现的,在模拟IIC的时候,发现FM24C16有的时候可以读写,有的时候无法读写。开始怀疑是代码问题,修改代码多次未果,怀疑是硬件问题,测量FM24C16两端的电压均在3V以上,但发现了在3.16V以上的时候是可以读写的,在3.16V以下则读写失败。此就是问题所在,FM24C16的DATASHEET说正常电压范围为2.7~5.5V,显然此说法是错误的。因为开始调试的时候使用的是USB供电,才导致了电压问题,在采用专用电源供电之后,问题消失。
4.1.2 软件调试问题
因为以前知识和代码的积累,很多程序的调试都是比较顺利的,比如FAT文件系统、DS18B20驱动等,不过在软件调试的时候,还是有很多问题的,这里挑两个比较典型的问题说明。第一个问题是VS1003播放音乐的问题。第二个问题是IIC总线使用的问题。
问题1,在调试VS1003播放音乐的时候,发现移植以前VS1003驱动到STM32上后,播放SD卡音乐文件只能播放一下,然后就无声音了,修改代码多次无效,怀疑是VS1003坏了,最后换成VS1003模块,结果现象一样。因此怀疑模块也是坏的,通过查看VS1003的DATASHEET,发现其有几种测试模式,比如正弦测试,于是给VS1003进行正弦测试来确定是否是VS1003坏了,结果正弦测试OK。此时,问题的关键就到软件上了,根据现象,重点对比了移植前后数据发送代码部分,最终发现了问题的所在,原来代码里面一个标记换簇的变量没有进行增加,所以在发送完一个簇的数据之后就一直没有再下一个簇的数据了,于是就出现了播放一下声音就完了的现象。通过更正此部分代码,以上问题消失。
问题2,在调试IIC驱动PT2314、FM24C16、TEA5767的时候,利用系统自带的IIC来驱动,可以实现PT2314和FM24C16的控制,但是对于TEA5767,却一直没能成功,怀疑是TEA5767坏了,于是拿来以前的TEA5767驱动,利用MEGA8驱动TEA5767,结果发现模块工作正常。于是问题又回到软件上来了,经过两天的努力及网上资料查找,推断STM32的自带IIC可能存在缺陷,于是,舍弃自带的IIC,开始自己模拟IIC,通过模拟IIC最终解决了上述问题。
4.2 本章小结
本章是整个设计的最后一章,主要针对调试过程中出现的软件问题和硬件问题进行了举例说明。解决了整个系统的最后问题,使系统的所有功能得到了实现,并发现了一些器件问题,为以后的工作研究积累了经验。整机图片如图4.4所示,系统的主界面图片如图4.5所示,所有其他功能都通过九个功能图标,集中在一起,调用非常方便,达到了预期的设计效果。
图4.4 整机图片
图4.5 系统主界面图片
五、 总结与展望
本文描述了设计一款多功能MP3播放器的过程及其成果,涉及到了智能家电领域。以下是对整个设计过程的总结:
经过三个多月的努力,设计出一款基于CM3构架的STM32的多功能MP3播放器,实现了音频播放、触摸屏控制、JPEG/BMP图片浏览、拼图游戏、闹钟、万年历功能、电子书、收音机、七彩灯等功能。
STM32的CM3构架提供了丰富的资源,性能提升方便,基本不需要添加外部器件,可以通过软件升级来增加功能。然而,IIC总线设计存在问题,使用困难且不稳定。
触摸屏控制的使用方便了整个系统的操作,使操作更加人性化。未来,越来越多的产品可能会采用触摸屏控制。
KEIL FOR ARM对STM32的开发提供了很好的支持,软件仿真为开发提供了很大的便利。在设计产品时考虑未来的提升空间是必要的,预留相应的功能接口可以方便地提升产品性能。
通过此次设计,熟悉了FAT文件系统、BMP/JPEG的解码方法以及触摸屏的工作原理,掌握了IIC总线协议和CM3构架的STM32使用,以及KEIL FOR ARM编译器的使用等许多软件和硬件方面的知识。
尽管这款多功能MP3播放器已经实现了许多功能,但仍有很多提升空间,如录音、画图、计算器、遥控等实用功能。未来,随着网络技术和计算机技术的不断发展和完善,智能家电市场必将得到更大的发展,本文只是对未来智能家电市场的一点初步试探。智能家电的功能将越来越强大,智能家电的研发还有很长的路要走。
详细工程资料下载:毕设&竞赛&课设&实训-基于STM32的音乐播放器完整电路+PCB源文件+源码等.zip资源-CSDN文库
资料详情:
总文件夹:
PCB&SCH:
系统文件夹:
源码:
【项目资源】:
设计一个基于STM32F103的多功能MP3,需要实现MP3播放、收音机、图片播放、温度计、彩色台灯、功率放大、万年历、闹钟、游戏和电子书等功能。整个系统由音频解码部分、收音机部分、音效处理部分、SD卡部分、功率放大、电源部分、人机交互等几个部分组成,通过一块MCU(STM32F103RBT6)控制运行,各部分协调运作,使用LCD和触摸屏作为人机交互工具,通过彩色液晶屏作为输出,使用触摸屏作为输入。这个系统的设计具有很多挑战性,因为涉及到FAT文件系统解析、JPEG/BMP数据格式解析和触摸屏控制等技术。
【项目质量】:
所有源码都经过严格测试,可以直接运行。
功能在确认正常工作后才上传。
【适用人群】:
适用于希望学习不同技术领域的小白或进阶学习者。
可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。
【附加价值】:
项目具有较高的学习借鉴价值,也可直接拿来修改复刻。
对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。
【沟通交流】:
有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
鼓励下载和使用,并欢迎大家互相学习,共同进步。