ARM体系课程设计实验报告.docx
《ARM体系课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《ARM体系课程设计实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
ARM体系课程设计实验报告
目录
1绪论-------------------------------------------------------------1
2课程设计的目标---------------------------------------------------2
3课程设计的意义---------------------------------------------------2
4需求分析---------------------------------------------------------3
5概要设计---------------------------------------------------------3
5.1存储模块设计------------------------------------------------4
5.2音频解码模块设计--------------------------------------------4
5.3液晶显示模块设计--------------------------------------------5
6相关技术说明-----------------------------------------------------6
6.1VS1003的初始化--------------------------------------------6
6.2MP3文件数据写入---------------------------------------------8
7详细设计---------------------------------------------------------10
7.1SD模块-----------------------------------------------------10
7.2VS1003模块-------------------------------------------------14
7.3图形人机交互模块-------------------------------------------16
8.总结-------------------------------------------------------------16
绪论
随着消费类电子产业的蓬勃发展,越来越多的嵌入式电子产品走进了千家万户。
电脑的形态也不再局限于以前的PC机,各式各样的嵌入式系统出现在了众多的行业和应用中,其中ARM和Linux结合的产品在市场上最受青睐。
ARM由于其低功耗、高性能、小体积、低成本受到了越来越广泛的重视,成为众多公司产品开发的主流硬件。
而Linux则因其开放的源代码,可裁剪的内核,便利的开发环境,各硬件平台的通用性,逐渐成为嵌入式开发的主流操作系统。
本课题的嵌入式MP3设计就是基于ARM和linux平台的。
本课题实现了一个完整的嵌入式系统,选用zq2410开发板为目标平台,linux作为目标操作系统,在这样的软硬件环境下研究实现MP3播放器。
文章首先综述了嵌入式系统开发方法,介绍了ARM处理器及其特点,Linux操作系统,嵌入式系统的开发模式以及如何搭建交叉开发环境,然后介绍了所选硬件平台zq2410目标板的各种资源,在系统软件开发中,介绍Uboot、Linux的裁剪和移植,根文件系统的制作以及核心驱动程序的开发,应用程序开发中,介绍了MP3的原理,移植MadplayMP3播放器,最后成功对Madplay播放器实现了综合控制。
关键词:
嵌入式ARMLinux驱动程序MP3
第1章课程设计的目标
1、了解嵌入式Linux的工作原理,掌握嵌入式Linux的移植方法。
2、了解主流BootloaderUboot的工作原理。
3、掌握嵌入式Linux字符设备驱动程序开发方法。
4、掌握嵌入Linux下应用程序的开发、编译、调试、执行技术。
5、掌握MP3播放程序madplay的移植与测试。
拟解决的关键问题:
●嵌入式linux的移植裁剪
●LED驱动程序设计及测试
●MadPlayMP3播放程序移植及测试
第2章课程设计的意义
《ARM体系结构》课程设计为学生提供了一个理论与实践相结合的机会。
既锻炼了学生动手能力,又会加深理解学生在课堂所学习的理论知识。
通过课程设计可以将课本上的理论知识和实际应用有机的结合起来,培养学生又动脑,又动手,独立思考分析问题的能力,提高学生运用所学知识解决实际问题的综合素质。
《ARM体系结构》课程设计的主要目标是:
(1)掌握ARM相关的指令集、流水线技术、存储及异常处理方式;
(2)掌握构建嵌入式系统软硬件平台的基本技能;
(3)具备基本嵌入式系统下C语言、汇编语言编程能力、嵌入式操作系统基本调试的能力。
第3章需求分析
采用STM32系列微控制器,结合解码芯片VS1003、SD卡、LCD等外围设备设计并实现了MP3播放器。
其主要功能有:
播放VS1003支持的所有音频文件,如MP3、WMA、WAV文件,且音质非常好;通过触摸屏实现按键功能,控制播放上一首/下一首、音量增减等;通过LCD显示歌曲名字和播放状态;本系统还实现了读卡器功能,PC机可通过USB接口直接对开发板上的SD卡进行读写操作,以方便拷贝音频文件。
MP3播放过程是STM32通过SPI1接口将数据从SD卡中取出,然后通过SPI2接口送至解码芯VS1003解码播放。
这里解码模块单独使用一个SPI接口,以减小干扰和噪声、提高音质。
第4章概要设计
本系统在硬件上分为6个模块:
微控制器STM32F103、解码模块VS1003、存储模块SD卡、触摸屏、USB接口和显示屏LCD。
系统硬件框架如图5所示。
系统硬件框架图
4.1存储模块设计
SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。
在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。
SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。
SD卡支持两种总线方式:
SD方式与SPI方式。
其中SD方式采用6线制,而SPI方式采用4线制,采用单片机对SD卡进行读写时一般都采用SPI模式。
可用不同的初始化方式使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内部接口SPI1的时钟(SCLK)信号线。
可设置SPI的时钟频率来调整读取SD卡数据的快慢。
PA6:
已连接到STM32内部接口SPI1的主输入从输出(MISO)信号线。
数据的传输方向是从SD卡传输给STM32,主要返回SD卡的一些状态、内部寄存器值等。
PC12:
用于检测SD卡是否完全插入。
当SD卡完全插入时,PC12为低电平,否则为高电平。
4.2音频解码模块设计
音频解码模块完成MCU从SD卡里读取的数字MP3音频数据流进行解析、并转化成模拟信号进行输出。
在这里,系统使用VS1003音频解码芯片来实现音乐数据流的解析。
VS1003是由芬兰VLSI公司出品的一款单芯片的MP3/WMA音频解码芯片,其拥有一个高性能低功耗的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芯片的功能控制,如初始化、软复位、暂停、音量控制、播放时间的读取等,均是通过SCI写入到特定寄存器的内容来实现的。
两条SCI指令之间要通过DREQ引脚信号判断上次处理是否完成。
该系统使用STM32内部接口SPI2与VS1003进行通信,下面介绍其引脚连接情况。
PA3:
VS1003的中断请求引脚。
当VS1003内部数据已处理完毕,需要新的数据时,将DREQ拉高。
STM32根据这个信号来给VS1003发送新的数据流。
PB13:
已连接到STM32内部接口SPI2的时钟(SCLK)信号线。
PB14:
已连接到STM32内部接口SPI2的主输入从输出(MISO)信号线。
这里STM32是主设备,VS1003是从设备。
数据流的传输方向是从VS1003传输给STM32。
主要用于读取VS1003的一些状态和内部寄存器值,比如寄存器测试返回的内部寄存器的值。
PB15:
已连接到STM32内部接口SPI2的主输出从输入(MOSI)信号线。
这里STM32是主设备,VS1003是从设备。
数据流方向是从STM32传输给VS1003,主要传输给VS1003一些控制命令、MP3/WMA数据流等。
PA1:
低电平有效,如果拉低该引脚,那么通过SPI传输的是控制信号。
控制信号包括读写VS1003的内部寄存器、对VS1003进行初始化、设置左右声道音量等。
PA2:
低电平有效,如果拉低该引脚,那么通过SPI传输的是数据信号。
比如在向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了,可以先写系统为它开辟的数据缓冲区,最后再刷新修改的部分就可以显示出要显示的内容,LCD3310与主控制器是SPI接口方式。
第5章相关技术说明
5.1VS1003的初始化
如其它芯片一样,初始化对于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_BASS=0x0055。
8.设置音量:
SCI_VOL=0x2020。
9.这一步被很多人忽视,向VS1003发送4个字节的无效数据,用以启动SPI发送。
实现代码如下:
voidMp3Reset(void){
XRESET=0;
delay(100);
XDCS=XCS=XRESET=1;
wr_commad(0x00,0x08,0x04);
delay(10);
DREQ=1;
while(!
DREQ);
wr_commad(0x03,0x98,0x00);
delay(10);
wr_commad(0x05,0xbb,0x81);
delay(10);
wr_commad(0x02,0x00,0x55);
delay(10);
wr_commad(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.2MP3文件数据写入
以上的对VS1003的初始化与测试都通过后,现在就可以给它发送MP3文件了。
但是这时就又出现一个新的问题。
MP3文件通常是比较大的,小的也要1M~2M,如果使单片机内部的FlashRom的话,容量是远远不够的。
需要有一种大容量的存储器来作为MP3文件的载体。
在笔者的调试系统中采用了SD卡(256M)、U盘(1G)与移动硬盘(40G)来存储MP3文件。
关于SD卡与U盘的读写方法可以参看相关章节。
这些大容量的存储设备通常也是按照扇区来进行读写的,但在实际的应用中更多的是结合FAT32等文件系统来进行文件读写。
文件系统部分可以参照《FAT32的存储机制及其在单片机中的实现》。
这里抛开存储介质不谈,只谈数据的写入方法。
其实写入数据的方法十分简单。
主要就是看DREQ信号,在VS1003的FIFO能够接受数据的时候输出高电平。
每次可以写入32个字节的数据。
而DREQ变低时,单片机就要停止数据的发送。
具体的写数据的方法如下:
1.将XDCS拉低。
2.等待DREQ为高。
3.通过SPI写入数据。
4.在文件没有结束前不断重复2与3操作。
5.在所有的数据都发送完毕后,最后发送2048个无效字节,用以清除VS1003的数据缓冲区。
6.将XDCS置高。
实现代码如下:
XDCS=0;
for(j=621;j<2783;j++){
for(k=0;k<8;k++){
MMC_get_data_LBA(j,64,get);
for(i=0;i<64;i++){
DREQ=1;
while(!
DREQ);
spi_write(get[i]);
//delay(60000);
}
}
}
for(temp=0;temp<2048;temp++){
DREQ=1;
while(!
DREQ);
spi_write(0);
}
XDCS=1;
第6章详细设计
//**************声音调节********************//
if(voice_global==1&PWMMR2!
=0)
PWMMR2-=PWMMR0/10;
elseif(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;
elseif(flag_b_n==4)
flag_b_n==1;
else
flag_b_n++;
}
if(b_n_global==4)
{
if(flag_b_n==0)
flag_b_n=4;
elseif(flag_b_n==1)
flag_b_n==4;
else
flag_b_n--;
}
if(flag_b_n==0)
{
for(i=temp;i{
PWMMR0=Fpclk/HCMM1[i];
PWMLER=0x05;
Delay(HCMM_L1[i]);
}
temp=0;
}
elseif(flag_b_n==1)
{
for(i=temp;i{
PWMMR0=Fpclk/HCMM1[i];
PWMLER=0x05;
Delay(HCMM_L1[i]);
}
temp=0;
}
elseif(flag_b_n==2)
{
for(i=temp;i{
PWMMR0=Fpclk/HCMM2[i];
PWMLER=0x05;
Delay(HCMM_L2[i]);
}
temp=0;
}
elseif(flag_b_n==3)
{
for(i=temp;i{
PWMMR0=Fpclk/HCMM3[i];
PWMLER=0x05;
Delay(HCMM_L3[i]);
}
temp=0;
}
elseif(flag_b_n==4)
{
for(i=temp;i{
PWMMR0=Fpclk/HCMM4[i];
PWMLER=0x05;
Delay(HCMM_L4[i]);
}
temp=0;
}
else
{
for(i=temp;i{
PWMMR0=Fpclk/HCMM1[i];
PWMLER=0x05;
Delay(HCMM_L1[i]);
}
temp=0;
}
/*if(b_n_msg==4)
for(i=temp;i{
PWMMR0=Fpclk/HCMM1[i];//设置输出频率
PWMLER=0x05;//更新匹配值后,必须锁存
Delay(HCMM_L1[i]);//延时,控制播放速度
}*/
}
}
第七章总结
通过这次课程设计,使我对以前完全陌生的ARM软件有了初步的接触,我学到了如何在ARM中实现基本的MP3播放功能。
原先我对嵌入式系统并没有很深刻的了解,在做完课程设计后,我对数码管、蜂鸣器及流水灯的结构和功能有了更进一步的了解,并且知道了一些相关函数的功能与运用,真正的把所学的东西运用到了实际中,更好的把课本知识与实际相结合,对我以后的学习有很大帮助。