1、ARM体系课程设计实验报告 目 录1 绪论-12 课程设计的目标-23 课程设计的意义-24 需求分析-35 概要设计-35.1存储模块设计-45.2音频解码模块设计-4 5.3 液晶显示模块设计-56 相关技术说明-6 6.1 VS1003 的初始化-6 6.2 MP3文件数据写入-87详细设计-10 7.1 SD模块-10 7.2 VS1003模块-14 7.3 图形人机交互模块-168.总结-16绪论 随着消费类电子产业的蓬勃发展,越来越多的嵌入式电子产品走进了千家万户。电脑的形态也不再局限于以前的PC机,各式各样的嵌入式系统出现在了众多的行业和应用中,其中ARM和Linux结合的产品在
2、市场上最受青睐。ARM由于其低功耗、高性能、小体积、低成本受到了越来越广泛的重视,成为众多公司产品开发的主流硬件。而Linux则因其开放的源代码,可裁剪的内核,便利的开发环境,各硬件平台的通用性,逐渐成为嵌入式开发的主流操作系统。本课题的嵌入式MP3设计就是基于ARM和linux平台的。本课题实现了一个完整的嵌入式系统,选用zq2410开发板为目标平台,linux作为目标操作系统,在这样的软硬件环境下研究实现MP3播放器。文章首先综述了嵌入式系统开发方法,介绍了ARM处理器及其特点,Linux操作系统,嵌入式系统的开发模式以及如何搭建交叉开发环境,然后介绍了所选硬件平台zq2410目标板的各种
3、资源,在系统软件开发中,介绍Uboot、Linux的裁剪和移植,根文件系统的制作以及核心驱动程序的开发,应用程序开发中,介绍了MP3的原理,移植Madplay MP3播放器,最后成功对Madplay播放器实现了综合控制。 关键词:嵌入式ARM Linux驱动程序MP3第1章 课程设计的目标 1、了解嵌入式Linux的工作原理,掌握嵌入式Linux的移植方法。 2、了解主流Bootloader Uboot的工作原理。 3、掌握嵌入式Linux字符设备驱动程序开发方法。 4、掌握嵌入Linux下应用程序的开发、编译、调试、执行技术。 5、掌握MP3播放程序madplay的移植与测试。拟解决的关键问
4、题: 嵌入式linux的移植裁剪 LED驱动程序设计及测试 MadPlay MP3播放程序移植及测试第2章 课程设计的意义ARM体系结构课程设计为学生提供了一个理论与实践相结合的机会。既锻炼了学生动手能力,又会加深理解学生在课堂所学习的理论知识。通过课程设计可以将课本上的理论知识和实际应用有机的结合起来,培养学生又动脑,又动手,独立思考分析问题的能力,提高学生运用所学知识解决实际问题的综合素质。ARM体系结构课程设计的主要目标是:(1)掌握ARM相关的指令集、流水线技术、存储及异常处理方式;(2)掌握构建嵌入式系统软硬件平台的基本技能;(3)具备基本嵌入式系统下C语言、汇编语言编程能力、嵌入式
5、操作系统基本调试的能力。第3章 需求分析采用STM32系列微控制器, 结合解码芯片VS1003、SD卡、LCD等外围设备设计并实现了MP3播放器。其主要功能有:播放VS1003支持的所有音频文件,如MP3、WMA、WAV文件,且音质非常好;通过触摸屏实现按键功能,控制播放上一首/下一首、音量增减等;通过LCD显示歌曲名字和播放状态;本系统还实现了读卡器功能,PC机可通过USB接口直接对开发板上的SD卡进行读写操作, 以方便拷贝音频文件。MP3播放过程是STM32通过SPI1接口将数据从SD卡中取出,然后通过SPI2接口送至解码芯VS1003解码播放。这里解码模块单独使用一个SPI接口,以减小干
6、扰和噪声、提高音质。第4章 概要设计本系统在硬件上分为6个模块: 微控制器STM32F103、解码模块VS1003、存储模块SD卡、触摸屏、USB接口和显示屏LCD。系统硬件框架如图5所示。 系统硬件框架图4.1 存储模块设计SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。SD卡支持两种总线方式: SD方式与SPI方式。其中SD方式采用6线制,而SPI方式采用4线制,采用单片机对SD卡进行读写时一般都采用SPI
7、模式。可用不同的初始化方式使SD卡工作于SD方式或SPI方式。在本设计中,音频数据MP3文件是以SD卡为载体。所以在电路设计中必须含有读取SD卡模块。该系统使用STM32内部接口SPI1与SD卡进行通信,下面介绍其引脚连接情况。PE3:低电平有效,连接到SD卡的片选引脚CD/DAT3。SPI在和SD卡进行通信时,需要将PE3拉低才能对SD卡进行操作。PA7:映射为STM32内部接口SPI1的主输出从输入(MOSI)信号线。这里STM32是主设备,SD卡是设备。数据流的传输方向是从STM32传输给SD卡。该信号线用于传输一些控制命令来完成SD卡的操作,如读、写等。PA5: 已连接到STM32内部
8、接口SPI1的时钟(SCL K)信号线。可设置SPI的时钟频率来调整读取SD卡数据的快慢。PA6 :已连接到STM32内部接口SPI1的主输入从输出(MISO)信号线。数据的传输方向是从SD卡传输给STM32 ,主要返回SD卡的一些状态、内部寄存器值等。PC12 :用于检测SD卡是否完全插入。当SD卡完全插入时,PC12为低电平,否则为高电平。4.2 音频解码模块设计音频解码模块完成MCU从SD卡里读取的数字MP3音频数据流进行解析、并转化成模拟信号进行输出。在这里,系统使用VS1003音频解码芯片来实现音乐数据流的解析。VS1003是由芬兰VLSI公司出品的一款单芯片的MP3/WMA音频解码
9、芯片,其拥有一个高性能低功耗的DSP处理器核VS_DSP, 5K的指令ROM, 0.5K的数据RAM,串行的控制和数据输入接口, 4个通用I/O口,一个UART口,同时片内带有一个可变采样速率的ADC、一个立体声DAC以及音频耳机放大器接口。VS1003与核心控制器MSP430F149的数据通信是通过SPI总线方式进行的。VS1003主要通过串行命令接口(SCI)和串行数据接口(SDI)来接收MSP430F149控制器的控制命令和MP3的数据。通过XCS、XDCS引脚的置高、置低来确认是哪一个接口处于传送状态。对于VS1003芯片的功能控制,如初始化、软复位、暂停、音量控制、播放时间的读取等,
10、均是通过SCI写入到特定寄存器的内容来实现的。两条SCI指令之间要通过DREQ引脚信号判断上次处理是否完成。该系统使用STM32 内部接口SPI2 与VS1003 进行通信,下面介绍其引脚连接情况。PA3 :VS1003 的中断请求引脚。当VS1003 内部数据已处理完毕,需要新的数据时,将DREQ 拉高。STM32根据这个信号来给VS1003 发送新的数据流。PB13 : 已连接到STM32 内部接口SPI2 的时钟(SCL K) 信号线。PB14 :已连接到STM32 内部接口SPI2 的主输入从输出(MISO) 信号线。这里STM32 是主设备,VS1003 是从设备。数据流的传输方向是
11、从VS1003 传输给STM32 。主要用于读取VS1003 的一些状态和内部寄存器值,比如寄存器测试返回的内部寄存器的值。PB15 :已连接到STM32 内部接口SPI2 的主输出从输入(MOSI) 信号线。这里STM32 是主设备,VS1003 是从设备。数据流方向是从STM32 传输给VS1003 ,主要传输给VS1003 一些控制命令、MP3/ WMA 数据流等。PA1 :低电平有效,如果拉低该引脚,那么通过SPI 传输的是控制信号。控制信号包括读写VS1003 的内部寄存器、对VS1003 进行初始化、设置左右声道音量等。PA2 :低电平有效,如果拉低该引脚,那么通过SPI 传输的是
12、数据信号。比如在向VS1003 传输MP3/ WMA 的数据流时需要拉低该引脚。PA0 :低电平有效,拉低该引脚则硬件复位VS1003 。4.3 液晶显示模块设计 LCD3310芯片是一个48行84列的液晶显示器主要模块。其内存带有低功耗PCD8544的CMOSLCD控制驱动器,串行输入速度最高可达4. 0Mbits/S,而且所有必须的显示功能集成在一块芯片上,包括LCD电压及偏置电压发生器,所以LCD3310是一款低功耗的液晶显示器。为了让LCD3310液晶能够显示4行12* 12的汉字,系统开辟了一个6* 84字节的缓冲区,要写液晶时,就不用直接写LCD3310的静态DDRAM了,可以先写
13、系统为它开辟的数据缓冲区,最后再刷新修改的部分就可以显示出要显示的内容,LCD3310与主控制器是SPI接口方式。第5章 相关技术说明5.1 VS1003 的初始化如其它芯片一样,初始化对于VS1003 来说同样是极其重要的。初始化的过程大致是这样的: 1.硬件复位:接XRESET 拉低。 2.延时,将XDCS、XCS、XRESET 置高。 3.向MODE 中写入0X0804。 4.等待DREQ 为高。 5.设置VS1003 的时钟:SCI_CLOCKF=0x9800,3 倍频。 6.设置VS1003 的采样率:SPI_AUDATA=0xbb81,采样率48k,立体声。 7.设置重音:SPI_
14、BASS=0x0055。 8.设置音量:SCI_VOL=0x2020。9.这一步被很多人忽视,向VS1003 发送4 个字节的无效数据,用以启动SPI发送。实现代码如下:void Mp3Reset(void)XRESET=0delay(100)XDCS=XCS=XRESET=1wr_commad(0x00,0x08,0x04)delay(10)DREQ=1while(!DREQ)wr_commad(0x03,0x98,0x00)delay(10)wr_commad(0x05,0xbb,0x81)delay(10)wr_commad(0x02,0x00,0x55)delay(10)wr_comm
15、ad(0x0b,VOL_VALUE,VOL_VALUE) / 音量delay(10)spi_write(0)spi_write(0)spi_write(0)spi_write(0)在进行了正确的初始化后,还要着重检查一下VS1003 的模拟部分是否正常将VS1003 的所有DVDD、AVDD 管脚以及XRESET、TEST(第32 个引脚)接+3.0V,然后测量RCAP 引脚,它应该是1.3V 左右,否则芯片模拟部分未正常工作。5.2 MP3 文件数据写入 以上的对VS1003 的初始化与测试都通过后,现在就可以给它发送MP3 文件了。但是这时就又出现一个新的问题。MP3 文件通常是比较大的,
16、小的也要1M2M,如果使单片机内部的Flash Rom 的话,容量是远远不够的。需要有一种大容量的存储器来作为MP3 文件的载体。在笔者的调试系统中采用了SD 卡(256M)、U 盘(1G)与移动硬盘(40G)来存储MP3 文件。关于SD 卡与U盘的读写方法可以参看相关章节。这些大容量的存储设备通常也是按照扇区来进行读写的,但在实际的应用中更多的是结合FAT32 等文件系统来进行文件读写。文件系统部分可以参照FAT32 的存储机制及其在单片机中的实现。这里抛开存储介质不谈,只谈数据的写入方法。其实写入数据的方法十分简单。主要就是看DREQ 信号,在VS1003 的FIFO 能够接受数据的时候输
17、出高电平。每次可以写入32 个字节的数据。而DREQ 变低时,单片机就要停止数据的发送。具体的写数据的方法如下: 1.将XDCS 拉低。 2.等待DREQ 为高。 3.通过SPI 写入数据。 4.在文件没有结束前不断重复2 与3 操作。 5.在所有的数据都发送完毕后,最后发送2048 个无效字节,用以清除VS1003 的数据缓冲区。6.将XDCS 置高。实现代码如下:XDCS=0for(j=621j2783j+)for(k=0k8k+)MMC_get_data_LBA(j,64,get)for(i=0i64i+)DREQ=1while(!DREQ)spi_write(geti)/delay(6
18、0000)for(temp=0temp2048temp+)DREQ=1while(!DREQ)spi_write(0)XDCS=1第6章 详细设计 /*声音调节*/ if(voice_global=1 &PWMMR2!=0) PWMMR2 -=PWMMR0 / 10; else if(voice_global=2&PWMMR2!=9*(PWMMR0 / 10) PWMMR2 +=PWMMR0 / 10; else ;/*上一曲 下一曲*/ if(b_n_global = 3) if(flag_b_n=0) flag_b_n=1; else if(flag_b_n=4) flag_b_n=1;
19、else flag_b_n+; if(b_n_global=4) if(flag_b_n=0) flag_b_n=4; else if(flag_b_n=1) flag_b_n=4; else flag_b_n-; if(flag_b_n=0) for(i = temp; i sizeof(HCMM1); i+) PWMMR0 = Fpclk / HCMM1i; PWMLER = 0x05; Delay(HCMM_L1i); temp=0; else if(flag_b_n=1) for(i = temp; i sizeof(HCMM1); i+) PWMMR0 = Fpclk / HCMM1
20、i; PWMLER = 0x05; Delay(HCMM_L1i); temp=0; else if(flag_b_n=2) for(i = temp; i sizeof(HCMM2); i+) PWMMR0 = Fpclk / HCMM2i; PWMLER = 0x05; Delay(HCMM_L2i); temp=0; else if(flag_b_n=3) for(i = temp; i sizeof(HCMM3); i+) PWMMR0 = Fpclk / HCMM3i; PWMLER = 0x05; Delay(HCMM_L3i); temp=0; else if(flag_b_n=
21、4) for(i = temp; i sizeof(HCMM4); i+) PWMMR0 = Fpclk / HCMM4i; PWMLER = 0x05; Delay(HCMM_L4i); temp=0; else for(i = temp; i sizeof(HCMM1); i+) PWMMR0 = Fpclk / HCMM1i; PWMLER = 0x05; Delay(HCMM_L1i); temp=0; /* if(b_n_msg=4) for(i = temp; i sizeof(HCMM1); i+) PWMMR0 = Fpclk / HCMM1i; / 设置输出频率 PWMLER = 0x05; / 更新匹配值后,必须锁存 Delay(HCMM_L1i); / 延时,控制播放速度 */ 第七章 总结通过这次课程设计,使我对以前完全陌生的ARM 软件有了初步的接触,我学到了如何在ARM中实现基本的MP3播放功能。原先我对嵌入式系统并没有很深刻的了解,在做完课程设计后,我对数码管、蜂鸣器及流水灯的结构和功能有了更进一步的了解,并且知道了一些相关函数的功能与运用,真正的把所学的东西运用到了实际中,更好的把课本知识与实际相结合,对我以后的学习有很大帮助。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1