《基于armMP3播放器论文.doc》由会员分享,可在线阅读,更多相关《基于armMP3播放器论文.doc(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 摘 要二十一世纪是信息技术的时代,信息的交流量非常大,这就会使人们在计算机面前工作的时间大大增加,因而增加了人们的负担和压力。再加上飞快的生活节奏,物质生活的逐步改善,更会给人们带来身心的劳累,人们在这种身体状况下去工作,不但效率不高,而且还很容易犯错,人们对精神层面的需求逐渐增强。因此人们需要一些娱乐和消遣的软件来减轻压力,消除疲劳,让人们更好的去工作和生活。由于不满足于仅在家中欣赏电视提供的多媒体,便携的媒体播放器应运而生。本Mp3播放器就是为了实现这个目的而编写的。由于嵌入式Linux操作系统功能强大又易于移植。本次设计的是MP3播放器应用程序,就是一个基于嵌入式开发的一个媒体播放器软
2、件,采用嵌入式ARM9经典开发平台。关键词: 嵌入式系统,Linux,Mp3播放器 目 录 第一章 绪论.11.1 开发嵌入式MP3播放系统的目的.11.2 开发嵌入式MP3播放系统的意义.1第二章 系统方案及嵌入式LINUX环境的搭建.22.1嵌入式系统方案的设计.22.2 嵌入式Linux环境的搭建.2第三章 硬件开发平台及其操作系统的构建.33.1开发平台的硬件资源.43.2 开发平台的体系结构.53.3 开发平台硬件间的工作流程.63.4 开发平台操作系统的搭建.7 3.4.1 U-Boot的编译.7 3.4.2烧写U-boot.8 3.4.3 内核(kernel)的编译与烧写.8 3
3、.4.4 根文件系统的制作.9第四章 系统的硬件设计与软件设计.12 4.1 硬件设计.12 4.2 软件设计.13第五章MP3播放器的制作与移植.155.1 Madplay原理.155.2移植到TX2440开发板上.15 5.2.1 编译文件.15 5.2.2移植madplay到TX2440.16第六章 课程设计总结.18致 谢.19参考文献.20 第一章 绪论1.1 开发嵌入式MP3播放系统的目的二十一世纪是信息技术的时代,信息的交流量非常大,这就会使人们在计算机面前工作的时间大大增加,因而增加了人们的负担和压力。再加上飞快的生活节奏,物质生活的逐步改善,更会给人们带来身心的劳累,MP3作
4、为高质量音乐压缩标准,正进入越来越多人的生活,给数字音频工业带来强劲的冲击。MP3技术音乐数据压缩比较大,回放质量较高。如将CD格式的音乐数据压缩成MP3格式,音效相差无几,但大小至少可压缩12倍。由于MP3音乐的较小数据量和近乎完美的播放效果,使MP3格式的音乐文件在网络上传输得以实现。1995年,采用MP3格式的音乐开始在网上传播时,主要是用类似Winamp的播放软件进行播放,使MP3音乐无法脱离计算机进行播放,给欣赏音乐带来不便。19971998年间,韩国Saehan公司制造了世界上第一台便携式MP3播放器MP-F20(MPMan系列MP3播放器的第一款商业产品)。1998年8月,Dia
5、mond Multimedia公司在美国推出了Rio系列MP3随身听,正式启动了MP3播放器市场。随着技术的发展,人们对MP3播放器的要求也越来越高,因而制造商从各个方面提升其附加功能,扩大MP3播放器的适用领域。随着MP3播放器的出现和市场的快速发展为微控制器(MCU)甚至MCU/DSP混合器件应用带来了新的机遇。许多半导体公司提供各种供MP3播放器使用的器件,包括解码器、数模转换器、模数转换器、现场可编程门阵列(FPGA)、专用标准产品(ASSP)以及MCU/DSP混合器件等,这就为MP3播放器的选型、设计、开发提供了多种方案。随着MP3播放器的激烈竞争,产品开发的发展以及技术的不断发展,
6、一些芯片厂商已经推出了集成MP3解码及其它附加功能的微控制器MP3播放芯片,使MP3播放器向集成化方向发展。另外MP3播放器的附加功能也越来月具有吸引力,如将MP3中的储存器开辟为移动存储设备,增加了MP3录音、调频收音机、以及多种现场环境感觉功能的播放模式,可播放多种数字音乐格式(如WMA、AAC等),集成时钟日历,同步显示中文歌词等等。1.2 开发嵌入式MP3播放系统的意义社会信息化、智能化、网络化高速发展的今天,嵌入式系统技术也随之提高,嵌入式Linux操作系统功能强大又易于移植,嵌入式产品渗入各个行业,如图1-1所示。嵌入式系统开发无疑成为当今最热门最有发展前途的IT领域之一。 图1-
7、1嵌入式产品渗入各个行业由于嵌入式Linux操作系统功能强大又易于移植。本次设计的是MP3播放器应用程序,就是一个基于嵌入式ARM9开发的一个媒体播放器软件,采用S3C2440经典开发平台,基于嵌入式ARM9开发的。本软件所具有的功能就可以满足一般用户的要求。本软件能支持所有MP3格式的音频文件,这些文件在网上都很容易找得到。根据个人的不同喜好,可以下载自己喜欢的MP3歌曲类型进行播放。因为音乐能使人们的神经放松,消除疲累,使人们有更好的状态工作和生活。19第二章 系统方案及嵌入式Linux环境的搭建2.1嵌入式系统方案的设计嵌入式系统开发环境建立在一台主机(pc)上,开发是使用主机上的交叉编
8、译、汇编及连接工具形成在目标板上可以运行的二进制代码。然后下载到板子上运行。本设计的宿主机Linux 操作系统是建立在Linux-Red Hat 9.0虚拟机中,这样可以灵活的与我们熟悉的Windows操作系统进行数据共享,加快开发速度。之后在宿主机上设置各种环境变量,建立交叉编译调试的环境,移植到开发板。 2.2 嵌入式Linux环境的搭建嵌入式Linux(Embedded Linux)是指对Linux经过小型化裁剪后,能够固化在容量只有几十万字或几十字节的存储器芯片或单片机中,应用于特定嵌入式场合的专用Linux 操作系统。通常它的体积小,性能稳定,源代码免费,将大大减少开发商的成本,更具
9、市竟争力。最基本的嵌入式Linux系统需要4个基本元素:(1)u-boot移植:包括固化在固件中的启动代码和Bootloader 两大部分,用于完成机器加电后的系统定位引导。(2)LINUX 系统内核的编译和烧写:为嵌入式应用提供一个软件环境,为应用程序完成基本的底层的资源管理工作。(3)根文件系统的制作: 操作系统中负责管理和存储文件信息的软件机构。(4)为了最小嵌入式系统具有一定的实用性,还需加上硬件驱动程序及一个或几个应用进程以提供必要的应用功能支持。第三章 硬件开发平台及其操作系统的构建3.1开发平台的硬件资源我们采用的硬件开发平台为S3C2440经典开发平台。(1) 核心板S3C24
10、40 核心板:S3C2440 ARM CPU、64M SDRAM、64M NAND FLASH,通过280Pin 精密插座与主板连接。核心板上可以配置2M 或4M 容量的Nor Flash AM29LV160/320,硬件支持从NorFlash 启动并可增加NandFlash 容量。PXA270 核心板:PXA270 XScale CPU、64M SDRAM、64M NAND FLASH,16M Nor FLASH。经典平台的核心板接口设计完全兼容博创的 PXA270 核心板和S3C2440 核心板,在软件支持下,两个核心板在经典开发平台主板上均可以实现大部分硬件功能,完全可以替换原有的244
11、0-S 和270A 系列产品。(2) 双100M EtherNet 网卡:由两片DM9000AE 构成的双网卡,一般可只用其一。(3) 4 HOST / 1 DEVICE USB 接口:从CPU 的主USB 口扩展为4 个,由AT43301 构成USB HUB。USB 从口保持处理器本身的1 个。(4) 3 UART/IrDA: 2 个RS232 串口。另有1 个RS485 串口,1 个IrDA 收发器,均从处理器的UART2 引出,由CPLD 内部逻辑进行选择。(5) 168Pin EXPORT:提供一个168Pin 扩展卡插槽,引出所有总线信号和未占用资源。(6) LCD 和VGA 接口:
12、标配8 寸16bit 真彩屏,同时预留一个24bit 接口。扩展了VGA 接口和AV 接口,可以连接VGA 显示器。(7) TouchScr:采用2440 内部ADC 构成的控制和转换电路,或者PXA270 的AC97 CODEC 芯片的触摸屏控制器,二者根据核心板的不同由软件设置CPLD 逻辑进行选择。(8) AUDIO:CODEC 采用UDA1341 和UCB1400,二者根据核心板的不同由软件设置CPLD 逻辑进行选择,具有放音、录音和线路输入等功能。功放电路由LM386 构成,板载扬声器可播放音频。(9) PS2 KEYPAD:使用ATMEGA8 单片机控制2 个PS2 接口和板载17
13、 键小键盘。两个PS2 可接PC 键盘和鼠标。(10) LED:扩展2 个数码管和1 个8x8 点阵发光管显示器,均由CPLD 逻辑驱动。(11) POWER SUPPLY、RESET、RTC 等必须资源。经典平台主板集成了UP-LINK 调试电路,可以直接用并口电缆连接计算机进行仿真、下载等(12) ADC:板载3 个电位器,同时在板上设模拟电压输入专用接口。(13 )IDE/CF 卡插座:扩展有笔记本硬盘接口和PCCARD 模式的CF 卡接口电路,使用CPLD 芯片实现PCCARD 逻辑。(14) SD 卡插座:从CPU 扩展SD 接口。(15) IC 卡。也由ATMEGA8 单片机控制。
14、(16) 直流电机。扩展直流电机驱动电路,由PWM 控制。带有红外线测速电路。(17) CAN BUS:设置1 个CAN 口,采用MCP2510 和TJA1050 芯片构成。(18) DA 输出:采用MAX504 ,SPI 总线操作,输出模拟电压。(19) 设置了PWM DA、IIC 存储器、IO 控制LED 和可产生硬中断的按键等简单调试资源(20) 可以提供配套的GPRS/GPS、FPGA、WLAN、USB2.0、RFID、指纹识别等扩展板。3.2 开发平台的体系结构S3C2440开发平台的体系结构如图1-2所示。图1-2 体系结构3.3 开发平台硬件间的工作流程S3C2440开发平台的工
15、作流程如图1-3所示。图1-3 工作流程3.4 开发平台操作系统的搭建3.4.1 U-Boot的编译在 U-boot 的board 目录下就是其支持的开发板,数量非常多。这里我们选择2440开发板。(1) 在board 下建立开发板目录,修改Makefile 文件,添加我们自己开发板的配置信息:在 Makefile 中找到TX2410的配置信息,在下面加上与TX2440 相关的信息(2) 建立开发板的头文件TX2440.h, 再把所有的文件全部删除,只留TX2440.h,用以下命令建立TX2440.h: cp include/configs/TQM866M.h include/configs/
16、Giga_Switch.h (3) 建立TX2440 开发板的私有目录,即把TX2410目录下的所有文件拷贝到TX2440目录下,包括Makefile.(4) 设置编译工具,我们使用的是3.4.1版本,所以要在Makefile 文件里做相应的修改:将 ifeq($(ARCH),PPC)CROSS_COMPILE = powerpc-linux-修改为:ifeq ($(ARCH),arm) CROSS_COMPILE = arm-linux-(5) 执行make。如果可以完成u-boot 编译的全过程,说明TX2440 移植框架成功建立。但是显然现在编译生成的这个U-boot.bin 仍然不适合
17、我们的开发板,实际上它还是为TX2410 开发板设计的源代码。结合具体开发板修改文件,一般来说,虽然U-boot 可以支持很多开发板,但是在开发时有些文件还是要注意结合开发板的具体信息来修改,以下是需要注意修改的几个地方。SDRAM 的设置:在board/TX2440/lowlevel_init.S中,检查#define B6_BWSCON (DW32) 位宽为32根据HCLK设置SDRAM的刷新参数,主要是REFCNT寄存器。开发板HCLK为100M将 #define REFCNT 0x1113 改为#define REFCNT 0x4f4,将FCLK设为400MHz,分频比为FCLK:HC
18、LK:PCLK=1:4:8。修改board/TX2440/TX2440.c中的board_init函数,在程序开头增加一行DECLARE_GLOBAL_DATA_PTR;,这样才可以使用gd变量,修改get_PLLCLK函数.支持NAND Flash:首先在配置文件include/configs/TX2440.h的宏CONFIG_COMMANDS中增加CFG_CMD_NAN,再在include/configs/TX2440.h的最后面增加3个宏。其次board_nand_init函数定义, board_nand_init需要自己编写,在cpu/arm920t/s3c24x0下新建nand_fl
19、ash.c编写之前,需要针对S3C2440 NAND Flash定义一些数据结构和函数,在include/s3c24x0.h中增加S3C2440_NAND数据结构,定义2440的函数:static inline S3C2440_NAND * const S3C2440_GetBase_NAND(void) return (S3C2440_NAND * const)S3C2410_NAND_BASE; 在cpu/arm920t/s3c24x0/nand_flash.c中添加代码,是从Linux-2.6.13中/drivers/mtd/nand/s3c2410.c中移植过来的。修改cpu/arm9
20、20t/s3c24x0/Makefile: COBJS = 加上一项nand_flash.o支持网卡芯片DM9000:在driver下,有网卡驱动DM9000x.c 和 DM9000x.h,网卡芯片DM9000接在BANK4,位宽16。在include/configs/TX2440.h中设置网卡的基地址,在drivers目录下,只留nand、nand_legacy、dm9000x.c、dm9000x.h和Makefile文件,其他文件全部删除,修改Makefile文件,将顶层目录下没用的lib_x 文件夹删除,只留lib_arm和lib_generic文件。然后,设置一下Linux启动参数就可
21、以了。运行执行make TX2440_config make all 生成生成支持NAND Flash和网卡芯片DM9000的u-boot.bin文件。3.4.2烧写U-boot将编译后生成的u-boot.bin文件烧入NAND Flash中运行。3.4.3 内核(kernel)的编译与烧写我们在网上下载内核源码并解压源码,进入目录linux-2.6.31,修改Makefile文件:指定系统硬件架构、交叉编译器、修改时钟和修改机器码(根据实际情况,这个要和bootloader的匹配)。接下来配置文件,在配置菜单中选择这一项:“Load an Alternate Configuation Fil
22、e”输入2440的默认配置: arch/arm/configs/s3c2410_defconfig配置完后,回到主菜单,选择这一项“save an Altenate configuration File” 输入要保存的配置文件名称:.config(默认),编译内核:#make zlmage。编译后,会在arch/arm/boot下生成zimage内核镜像文件,把zimage镜像烧进nandflash跑一下,检查是否正常打印出信息。支持NandFlas h:修改arch/arm/plat-s3c24xx/common-smdk.c文件,这里我们要使nandflash同时支持64M,256M或更高
23、容量。 接下来修改Nand读写匹配时间,这个改不改应该问题都不大,是根据Nand的读写特性相关的,也就是查芯片资料得到的值,每种Nand的值都不一样,修改Kconfig文件,在配置时选择NAND类型,修改driver/mtd/nand/Kconfig, 配置内核,支持NandFlash 。启动时输出: S3C24XX NAND Driver, (c) 2004 Simtec Electronics s3c24xx-nand s3c2440-nand: Tacls=1, 10ns Twrph0=3 30ns, Twrph1=1 10ns s3c24xx-nand s3c2440-nand: NA
24、ND hardware ECC NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit) Scanning device for bad blocks Creating 3 MTD partitions on NAND 256MiB 3,3V 8-bit: 0x000000000000-0x000000100000 : boot 0x000000120000-0x000000520000 : kernel 0x000000520000-0x000010000000 : yaffs2 支持
25、yaffs2文件系统:下载yaffs2源码并解压,进入yaffs2目录, 给内核打上yaffs2文件系统的补丁,这时内核源码fs目录下多了一个yaffs2目录,同时Makefile文件和Kconfig文件也增加了yaffs2的配置和编译条件。 配置对yaffs2支持这部分配置比较多,可根据自己的需要进行配置,把不用的文件系统都去掉就可以了。 支持LCD:内核里已经有很完善的LCD驱动了,只要根据所用的LCD进行简单的修改,在内核源码drivers/video/s3c2410fb.c是LCD驱动的源码,首先要设置LCD的时钟频率, 在s3c2410fb_display结构体中加入了setclkv
26、al变量,我们需要在结构体原型中加入这个变量,在arch/arm/mach-s3c2410/include/mach/fb.h中第40行加入:unsigned setclkval; /*clkval*/ 修改LCD参数配置并屏蔽掉第150行的语句,配置内核,支持LCD。支持声卡:(1)在网上下了一个uda1341的驱动文件s3c2440-uda1341.c稍作修改后,把它放到linux2.6.14/sound/oss/目录下。(2) 修改oss目录下的kconfig文件,以便在我们下面配置内核的时候可以选中它。(3) 修改Makefile文件,修改增加内存映射,以使内核知道该虚拟地址可用,而且
27、对应的物理地址是我们的声卡。修改/arch/arm/mach-s3c2410/smdk-s3c2410。(4)配置完毕后,在make menuconfig后,选择driver-sound-oss-uda1341 ,即选择对声卡的支持。3.4.4 根文件系统的制作创建根文件系统目录:/bin,/etc,/dev,/home,/lib,/mnt,/pot,/proc,/root,/sbin, /sys,/tmp,/usr,/var 建一个名为root_2.6.31,在文件夹下创建以上目录。编译busybox,修改 Makefile 文件,执行#make menuconfig进行配置busybox,
28、配置选项大部分都是保持默认的。然后执行 #make make install就会在上一级目录下生成rootfs文件夹,里包含几个文件/bin/sbin/usr/linuxrc把这些文件全部复制到刚建好的root_2.6.31目录下,用命令 #cp rf * ./root_2.6.31实现。接下来开始制作文件系统,在 dev目录下,创建设备节点,进入etc目录,添加文件:拷贝Busbox-1.15.2/examples/bootfloopy/etc/*和/etc/passwd,/etc/group,/etx/shadow到当前目录下。修改inittab、fstab 、init.d/rcS和pro
29、file文件内容。新建sysconfig 文件夹,在里面新建HOSTNAME文件,内容为:TX2440A 进入lib目录,然后拷贝交叉编译的库文件到lib目录下,文件系统的框架已经做好。把制作好的文件系统烧写进Nandflash中的yaffs2镜像文件。我们使用编译好的mkyaffs2image工具,把解压出来的可执行文件复制到/usr/bin目录下。最后制作文件系统镜像,root_2.6.31bin就是yaffs2文件系统镜像,要先修改它的权限,否则该文件无法被复制,把root_2.6.31.bin下载到nandflash中的文件系统分区中如果文件系统能正常挂载,终端会打印出:Please
30、press Enter to activate this console.Processing/etc/profile Done 第四章 、系统硬件设计与软件设计4.1 硬件设计4.1.1嵌入式处理器选型设计由于AT89C51SND1C芯片中集成有CPU、MP3解码器和USB控制器,可以大大简化硬件设计的复杂度,而且成本不算很高,所以本次课程设计打算采用AT89C51SND1C芯片做为系统的嵌入式处理器。AT89C51SND1C是美国ATMLE公司针对MP3解决方案新生产的一款芯片,具有C51内核,AT89C51SND1C在原有的89C51的基础上增加了MP3解码模块,支持48、44.1、32
31、、24、22.05、16KHz采样频率,左右声道独立的音量控制,重低音、中音、高音均衡控制,重低环绕声效果,辅助数据输出等功能。还增加了I2C/PCM音频输出模块,串并行接口模块(USB,SPI,IDE),以及其他的外存储器接口模块。AT89C51SND1C芯片包括8个功能块: (1)MP3音频解码器:AT89C51SNDlC可实时解码MP3数据为PCM音频数据,同时也支持MP3其他频率。解码器也支持其它特性如声音控制、低音放大、辅助数据提取等(2)音频输出接口:允许音频解码位流以不同的格式输出。(3)通用串行总线(USB)接口:支持USB存储类的MP3音频解码文件下载;支持USB固件类升级的
32、在系统编程。(4)外插闪存卡接口:该接口适应多媒体卡模式的2.2规范允许移动闪存卡上音频解码文件的存储,这样在应用时可轻易地插入和拔除,此接口亦可用于在系统编程。(5)IDEATAH接口:该接口允许C2LROM读卡机、压缩闪卡、硬盘等驱动设备的连结。由一个具有低电平ANSI规范的16位双向总线部分组成,具有多存储接口,但只能用于连接C2LROM时的在系统编程。(6)串行外设接口:支持主模式和从模式,具有以下功能:MP3音频解码文件存储到数据闪存的接口;主机远程控制芯片。 (7)双线控制器:支持4个标准的主模式和从模式,多主性能。具有以下功能:从设备如LCD控制器、音频DAC的连接;主机远程控制
33、AT89C51SNDlC芯片及在系统编程。(8)AD控制器:2道10位模数转换具有电源管理、录音等功能。(1) 存储系统设计AT89C51SNDl芯片具有64K字节的闪存程序空间和4K字节引导闪存以及2304字节的RAM存储器,利用微处理器核对数据流和MP3解码器进行控制,其中地址从F000FFFF的区域为4K字节的Boot Flash,这部分程序是出厂时已经固化的BootLoader代码,它使用DFU(Device Firmware Update设备固件升级)协议来更新芯片FLASH存储器中的用户程序。芯片上电后即执行Boot Loader,支持USB接口在线下载固件,这样,不需要硬件烧写器
34、便可下载目标代码到芯片,降低了芯片开发的投资。AT89C51SNDl芯片用两种不同的空间提供数据内存访问。内部空间被映射成3个独立的段:低128B RAM段、高128B RAM段、扩展的2048B RAM段;外部空间。在这里外部RAM扩展我选择了32KB的SRAM芯片HY62WT08081E。外存储采用闪存K9F5608,它共有8个I/O引脚,另外有指令锁存允许线、地址锁存允许线、芯片启用线、读激活线、写激活线、就绪/忙碌输出线、输出缓冲区电源线、设备电源线。K9F5608闪存拥有32MB存贮量。它在数据写入和数据读出的时候使数据在I/O缓冲区与存储区之间传递。K9F5608闪存采用8位I/O
35、线复用方式。当CE信号线为低电平时,激活WE信号线(即WE为下降沿),则指令,数据,地址都是由8条I/O线写入。数据锁存是在WE的上升沿。通过复用8条I/O线,数据,地址,指令分别由CLE,ALE控制传输。由于K9F5608闪存拥有32MB的存贮量,所以需要24条地址线。所以需要3个总线周期寻址。这三个周期分别为行周期,低列周期,高列周期。对层(page)的读操作和程序操作由于需要指令的输入所以也需要3个周期。在块的擦写中,需要2个周期。(2) 键盘设计AT89C51SND1C芯片已经提供了完善的键盘接口,引脚为KIN0、KIN1、KIN2、KIN3。在这里我直接借用它的键盘接口,直接将开关按
36、键接入到这四个引脚,分别作为STOP、FFW、REW、PLAY/PAUSE按键。(3) D/A转换和音频处理设计由于AT89C51SND1C中只带有MP3解码模块,所以需要对MP3解码出来的数字信号进行D/A转换得到模拟信号,然后经过伴音处理芯片TDA7050,输出到耳机。D/A转换芯片我选用的是CS4330。这个芯片工作电压为3V或者5V,所以电源提供的3.3V电压并不能完全满足它的要求,这里我加上两个电容C37(0.1uF)和C38(10uF)进行处理,给CS4330提供稳定的电压。AT89C51SND1C的DOUT引脚直接接到CS4330芯片的SDATA引脚。TDA7050芯片进行伴音处
37、理,它的最大电压为6V,正常输入电压为3V,这里分别将CS4330的AOL,AOR两个引脚输入接到芯片的IN1-和IN2-两个引脚,芯片处理后,输出OUT1和OUT2为左右声道的声音。(4) 电源设计使用Max1677芯片进行电压转换,将两节七号干电池电压升至3.3V。连接USB口处:用AS117把5V电压降至3.3V,并保证3.3V电压的输出。(5) 中断分配 AT89C51SND1C芯片内部集成了很多功能部件,也提供了完善的中断机制,表3.2是中断系统信号表,表3.3是本系统用到的中断的中断优先级和中断向量表。(6) RS232接口电路AT89C51SND1C芯片内部集成了UART,在这里
38、我选用了MAX232CWE芯片。数据由PC机A的串口RS232发出,经MAX232电平转换后,送入芯片。在芯片中,先由扩展串口UART接收数据,经内嵌8051的控制处理。4.2 软件系统设计主要使用51系统单片机中所使用的C语言来实现MP3源程序设计。没有实时操作系统的支持。可以利用单片机开发软件Keil软件方便开发mp3播放器,无需特殊软件平台。具有U盘功能的MP3程序由两大部分组成:MP3播放功能和USB通讯功能。(1)MP3播放功能MP3播放功能模块的工作分为两个部分:第一部分是循环播放MP3歌曲,该功能需要首先做一些初始化工作,MP3解码器一旦开始工作,就会一直向CPU请求数据,直至歌
39、曲结束,只有通过键盘操作才会使该功能提前结束。因为MP3文件的数据量较大,在flash存储器内是以页为单位进行存储的,所以MP3的播放程序初始化就是要把该文件的首地址和页数先读出到CPU中,然后CPU可以根据如上数据进行取数据工作。第二部分则一直在等待中断发生,该程序是与键盘结合起来的,主要用于使用者对播放过程的控制。键盘操作对MP3播放过程的控制还包括后退、跃进、跳到下一首、音量控制等。因为整个播放过程的键盘控制功能比较单一,没有键的复合操作,所以程序都很容易实现。歌曲播放器程序要与键盘和LCD配合起来设计。程序流程大概可分为:硬件初始化获取U盘中mp3歌曲列表歌曲播放和LCD显示。MP3播
40、放器部分主流程图如图4.1所示。歌曲播放和LCD显示是程序的核心部分。主处理器和LCD从处理器之间通过串口进行通信,以达到歌曲播放与歌词显示的同步以及键盘操作状态的及时刷新。 (2)USB通讯功能主处理器让USB海量存储设备在批量传输方式下工作,这样共需要3个端点。0端点:控制端点。用于控制传输,PC机通过与端点0相对应的管道来读取设备描述符,完成对设备地址的设置,并完成配置。此端点为双向数据传输端点。两个非0端点:批量传输端点。这种端点为单向数据传输端点,分别为批量输入端点和批量输出端点。主处理器通过一个端点中断寄存器(UEPINT)和PC机通信。如果某个端点完成了相应的操作,就会引发中断。
41、(3)文件管理功能因为该系统还要具有U盘的功能,所以存储器中的文件还要能够让计算机读写和识别,也就是所有的文件还要严格满足计算机文件系统格式的要求。在所有计算机文件系统中,FAT是比较常用的一种。一个FAT文件系统卷由4个部分组成:保留区、FAT区、根目录区、文件和目录数据区。其中保留区中的第一个分区必须是BPB,也称作“引导扇区”,因为它含有对文件系统进行识别的关键信息,计算机将以此信息识别存储器文件格式,因此十分重要。FAT区存放的是文件分配表。操作系统的存储空间是按簇来分配的,簇是操作系统分配的最小存储单元,每个簇在FAT表中占据一个16位的位置,称为一个表项。同一个文件的数据并不一定存
42、放在存储区的一个连续的区域内,往往会分成若干段,像一条链子一样的存放,这种存储方式称为文件的链式存储。为了实现文件的链式存储,必须准确地记录哪些簇已经被占用,还必须为每一个已经占用的簇指明后继内容的下一个簇的簇号,对于一个文件的最后一个簇,则要指明本簇没有后继簇,这些就是由FAT表来存储的。根目录区存放的是目录项,每个目录项为32个字节,记录一个文件或目录的信息。目录项所占的空间与目录项的个数有关。文件和目录数据区是真正存放文件数据的位置,所有数据都按照以上信息分配存储的。 第五章、MP3播放器的制作与移植5.1 Madplay原理madplay 是linux上的一个开源mp3播放器,是一个高
43、精度MPEG音频解码库。支持MPEG-1 Layer I, Layer II 和 LayerIII(也就是 MP3)标准,它利用libmad库进行mp3软解码。libmad提供 24-bit 的 PCM 输出,完全定点计算,使用 libmad 提供的一系列 API,就可以非常简单地实现 MP3 数据解码工作。在 libmad 的源代码文件目录下的 mad.h 文件中,可以看到绝大部分该库的数据结构和 API 等。madplay基于libmad还做了一些扩展功能,比如将mp3格式转成别的音频格式如 wav等,又集成了libid3tag库进行mp3信息显示,非常适合在没有浮点支持的嵌入式硬件平台上使用。libmad主要数据结构如表4-1所示:表4-1 libmad主要数据结构主要数据结构作用struct mad_stream存放解码前的Bitstream数据struct mad_synth存放解码合成滤波后的PCM数据struct mad_pcm定义了音频的采样率,声道个数和PCM采样数据,用来初始化音频struct mad_frame记录MPEG帧解码后PCM数据的数据结构,其中的mad_