嵌入式应用系统设计课程论文模板.docx
- 文档编号:6213883
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:12
- 大小:113.88KB
嵌入式应用系统设计课程论文模板.docx
《嵌入式应用系统设计课程论文模板.docx》由会员分享,可在线阅读,更多相关《嵌入式应用系统设计课程论文模板.docx(12页珍藏版)》请在冰豆网上搜索。
嵌入式应用系统设计课程论文模板
学号14082202643成绩
《嵌入式应用系统设计》课程论文
题目基于ARM的音频系统设计
作者汪渝班级08-3BF
院别信息与通信工程专业电子信息工程
完成时间2011年12月15日
1概述
1.1嵌入式系统的技术背景
在许多领域中广泛应用的嵌入式计算系统(简称为嵌入式系统),是在更大的电子器件中嵌入的重复完成特定功能的计算系统,它经常不被器件的使用者所识别,但在各种常用的电子器件中能够找到这些嵌入式系统。
例如,消费类电子产品中的手机、寻呼机、数字相机、摄像机、录像机、个人数字助理等,家用电器中的微波炉、洗衣机、烤箱、门禁系统、照明系统等,商用装置中的卡片读入器、扫描仪、打印机等。
1.2数字音频系统的应用
数字音频信号是对模拟信号的一种量化,典型方法是对时间坐标按相等的时间间隔做采样,对振幅做量化。
单位时间内的采样次数称为采样频率。
这样一段声波就可以被数字化后变成一串数值,每个数值对应相应抽样点的振幅值,按顺序将这些数字排列起来就是数字音频信号了。
这是ADC(模拟-数字转换)过程。
DAC(数字-模拟转换)过程相反,将连续的数字按采样时候的频率顺序转换成对应的电压。
2系统的硬件设计
2.1系统设计方案
音频ADC/DAC通俗一点来讲就是录音(音频ADC)和放音(音频DAC)。
放音是数字音频信号转换成模拟音频信号,以推动耳机、功放等模拟音响设备,而录音则是要将麦克风等产生的模拟音频信号转换成数字音频信号,并最终转换成计算机可以处理的通用音频文件格式。
2.2S3C2410的IIS模块
⏹S3C2410的IIS总线简介
IIS总线是近年出现的一种面向多媒体计算机的音频总线,该总线专责于音频设备之间的数据传输,为数字立体声提供一个序列连接至标准编码解码器。
S3C2410的IIS总线接口可以用实现对外部8/16位立体声音频数字信号编码解码电路的接口功能。
它支持IIS总线数据格式和MSB-justified数据格式。
IIS总线接口为FIFO操作提供DMA传输模式,代替中断模式,它可以同时传送或接收数据。
IIS模块特性:
——兼容IIS,MSB-justified格式数据
——每通道8/16位数据
——每通道16,32,48fs(采样频率)串行时钟
——可编程的分频器提供给主设备时钟和编解码时钟
——供给发送和接收用的32字节(2X16)的FIFO
——正常(Normal)传输模式和DMA传输模式
2.3音频芯片UDA1341
UDA1341是飞利浦公司的一款经济型音频CODEC,用于实现模拟音频信号的采集
(音频AD)和数字音频信号的模拟输出(DA),并通过IIS数字音频接口,实现音频信号的数字化处理。
UDA1341的IIS引脚分别连接到S3C2410对应的IIS引脚上,音频输入输出(VIN,VOUT)分别和麦克风扬声器连接:
UDA1341的L3接口相当于一个Mixer控制器接口,可以用来控制输入/输出音频信号的音量大小,低音等。
L3接口的引脚L3MODE,L3DATA和L3CLOCK分别连接到S3C2410的IICSCL,IICSDA和GPF6引脚上。
3系统的软件设计
3.1软件整体设计
嵌入式Linux是一种完全开放且免费的操作系统,其支持多种硬件体系结构,运行稳定,拥有完善的开发工具,为开发人员提供了优良的开发环境。
在嵌入式Linux系统中,设备驱动程序提供了应用程序和实际设备之间的一个软件层(接口),为应用程序屏蔽了硬件细节。
本设计中,音频设备驱动程序主要通过对硬件的控制实现音频流的传输,同时向上层提供标准的音频接口。
整个音频驱动程序包括设备初始化、打开设备、数字音频处理(DPS)驱动、混频器(MIXER)驱动和释放设备等部分。
3.2WAV 文件格式
WAV声音格式文件是Windows环境下的一种常用音频文件格式,它遵循着一种
称为"资源互换文件格式"(ResourceslnterchangeFileFormat)的结构,简称RIFF。
RIFF可以看作是一种树状结构,其基本构成单位为chunk,犹如树状结构中的节点,每个chunk由"辨别码"、"数据大小"及"数据"所组成。
WAV为WAVEFORM的缩写。
"RIFF"格式辨别码为"WAVE"。
整个文件由两个chunk所组成:
辨别码"fmt"及"data"。
在“fmt”的chunk下包含了一个PCMWAVEFORMAT数据结构,在“fmt”chunk之后是原始声音的采样数据,这些数据是可以直接送到IIS总线的数字音频信号。
典型的WAV文件结构:
它包含8字节RIFF头、4字节数据类型“WAVE”、"fmt"chunk(共0x18字节)和"data"chunk。
因此,WAV文件中从下式中的sizeoff开始的四个字节表示声音数据的大小,dataoff开始的位置为具体的声音数据。
sizeoff=0x8+0x4+0x18+0x4=0x28
dataoff=0x8+0x4+0x18+0x8=0x2C
3.3初始化UDA1341模块
Mode1
程序:
staticvoidInit1341(charmode)
{
//PortInitialize
//----------------------------------------------------------
//PORTBGROUP
//Ports:
GPB4GPB3GPB2
//Signal:
L3CLOCKL3DATAL3MODE
//Setting:
OUTPUTOUTPUTOUTPUT
//[9:
8][7:
6}[5:
4]
//Binary:
01,0101
//----------------------------------------------------------
rGPBDAT=rGPBDAT&~(L3M|L3C|L3D)|(L3M|L3C);//启动条件L3M=H,L3C=H
rGPBUP=rGPBUP&~(0x7<<2)|(0x7<<2);//禁止上拉电阻GPB[4:
2]
rGPBCON=rGPBCON&~(0x3f<<4)|(0x15<<4);//GPB[4:
2]=Output(L3CLOCK):
Output(L3DATA):
Output(L3MODE)
//L3Interface
_WrL3Addr(0x14+2);//地址设置(000101xx+10)
_WrL3Data(0x60,0);//数据输入0,1,10,000,0
_WrL3Addr(0x14+2);//STATUS(000101xx+10)
FsIdx=mode?
RecStatus.FsIdx:
PlayStatus.FsIdx;
if(CodecPara[FsIdx].ofs)
_WrL3Data(0x18,0);
else
_WrL3Data(0x28,0);
_WrL3Addr(0x14+2);//STATUS(000101xx+10)
_WrL3Data(0xc1,0);//1,0,0,0,0,0,01
//DAC增益控制为6dB,ADC增益为dB。
//Record
if(mode){//mode为1时选择录音状态
_WrL3Addr(0x14+2);//STATUS(000101xx+10)
//_WrL3Data(0xa2,0);//1,0,1,0,0,0,10
//状态1,DAC增益为0dB,ADC增益为6dB。
_WrL3Data(0xe3,0);//状态1,DAC增益为6dB,ADC增益为0dB。
打开使//录音时可从耳机听到声音
//_WrL3Addr(0x14+0);//DATA0(000101xx+00)
//_WrL3Data(0x3f,0);//00,111111Volumecontrol(6bits)
//_WrL3Data(0x00,0);//00,000000Volumecontrol(6bits)0dB
_WrL3Addr(0x14+0);//DATA0(000101xx+00)
_WrL3Data(0x7b,0);//01,1110,11:
Data0,BassBoost18~24dB,Treble6dB
//_WrL3Addr(0x14+0);//DATA0(000101xx+00)
_WrL3Data(0xc4,0);//11000,100:
Extendedaddr(3bits),100
//_WrL3Data(0x90,0);//100,100,00:
DATA0,EnableAGC,00,inputamplifiergainchannel2(2bits)
_WrL3Data(0xf0,0);//111,100,00:
DATA0,EnableAGC,00,inputamplifiergainchannel2(2bits)
//_WrL3Addr(0x14+0);//DATA0(000101xx+00)
_WrL3Data(0xc0,0);//11000,000:
Extendedaddr(3bits),000
_WrL3Data(0xe4,0);//111,00000:
MA=0dB
_WrL3Data(0xc1,0);//11000,001:
Extendedaddr(3bits),001
_WrL3Data(0xe4,0);//111,00000:
MB=0dB
//_WrL3Addr(0x14+0);//DATA0(000101xx+00)
_WrL3Data(0xc2,0);//11000,010:
Extendedaddr(3bits),010
//_WrL3Data(0x59,0);//010,110,01:
DATA0,MICAmplifierGain27dB,inputchannel1select(inputchannel2off)
_WrL3Data(0xf9,0);//111,110,11:
DATA0,MICAmplifierGain27dB,input1XMA+input2XMB
}
}
3.4录音模块
程序:
voidRecordTest(void)
{
intsize,i,j,err;
WAVEFORMATEXfmt;
WAVEHDRhdr[2048];
HWAVEINhwi=1;
fmt.nSamplesPerSec=fsTable[3];
fmt.wBitsPerSample=16;
fmt.wFormatTag=WAVE_FORMAT_PCM;
fmt.nChannels=2;
fmt.nBlockAlign=fmt.wBitsPerSample*fmt.nChannels/8;
fmt.nAvgBytesPerSec=fmt.nSamplesPerSec*fmt.nBlockAlign;
download_addr=0x30800000;//_NONCACHE_STARTADDRESS;
download_len=size=2*1024*1024;
for(i=0;i i=0; while(size>0) { hdr[i].lpData=(LPSTR)(download_addr+0x2c+i*BUF_SIZE); hdr[i].dwBufferLength=(size>BUF_SIZE)? BUF_SIZE: size; size-=BUF_SIZE; i++; } *(U16*)(download_addr+0x14)=fmt.wFormatTag; *(U16*)(download_addr+0x16)=fmt.nChannels; *(U32*)(download_addr+0x18)=fmt.nSamplesPerSec; *(U32*)(download_addr+0x1c)=fmt.nAvgBytesPerSec; *(U16*)(download_addr+0x20)=fmt.nBlockAlign; *(U16*)(download_addr+0x22)=fmt.wBitsPerSample; *(U32*)(download_addr+0x28)=download_len; err=waveInOpen(&hwi, 0, &fmt, 0, 0, 0); printf("\nerr=%x\n",err); for(j=0;j if(waveInAddBuffer(hwi,&hdr[j],0)) puts("Addbuffererror! "); printf("Added%dbufferforrecord\n",i); //puts("PressanytoRecord\n"); //getch(); puts("Nowbeginrecording,PressEsctoexit\n"); waveInStart(hwi); while (1) { U8key; key=getkey(); if(key==ESC_KEY) break; } waveInClose(hwi); REC_OK=0xff; PlayMusicTest(); REC_OK=0; } 3.5放音模块 程序: voidPlayMusicTest(void) { intsize,i,j,err; WAVEFORMATEXfmt; WAVEHDRhdr[2048]; HWAVEOUThwo; U8pause=0; U8mute=0; U32volume; unsignedchar*buf; if(REC_OK==0) { download_addr=DFT_DOWNLOAD_ADDR; buf=(unsignedchar*)download_addr; for(i=0;i<243552;i++)buf[i]=WindowsXP_Wav[i]; download_len=243552; } size=*(U32*)(download_addr+0x28); i=0; while(size>0) { hdr[i].lpData=(LPSTR)(download_addr+0x2c+i*BUF_SIZE); hdr[i].dwBufferLength=(size>BUF_SIZE)? BUF_SIZE: size; size-=BUF_SIZE; i++; } fmt.wFormatTag=WAVE_FORMAT_PCM; fmt.nChannels=*(U16*)(download_addr+0x16); fmt.nSamplesPerSec=*(U32*)(download_addr+0x18); fmt.nAvgBytesPerSec=*(U32*)(download_addr+0x1c); fmt.nBlockAlign=*(U16*)(download_addr+0x20); fmt.wBitsPerSample=*(U16*)(download_addr+0x22); printf("SampleRate=%d,Channels=%d,%dBitsPerSample,size=%d\n", fmt.nSamplesPerSec,fmt.nChannels,fmt.wBitsPerSample,*(U32*)(download_addr+0x28)); hwo=0; err=waveOutOpen(&hwo, 0, &fmt, 0, 0, 0); printf("\nerr=%x\n",err); for(j=0;j waveOutWrite(0,&hdr[j],0); puts("Nowplayingthefile\n"); puts("PressEsctoexit,'+'toincvolume,'-'todecvolume,'y'tomute,Enterto'pause'\n"); waveOutGetVolume(0,&volume); while (1) { U8key=getch(); if(key==ESC_KEY) break; if(key==ENTER_KEY) { pause^=1; if(pause&1) waveOutPause(0); else waveOutRestart(0); } if(key=='y'||key=='Y') { mute^=1; if(mute&1) waveOutSetVolume(0,0); else waveOutSetVolume(0,volume); } if((key=='+')&&(volume<=64535)) { volume+=1000; waveOutSetVolume(0,volume); } if((key=='-')&&(volume>=1000)) { volume-=1000; waveOutSetVolume(0,volume); } } waveOutClose(0); 4总结 这次课程设计是对我们综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程。 随着科学技术发展的日新日异,ARM嵌入式系统已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。 因此作为二十一世纪的大学来说掌握嵌入式的开发技术是十分重要的。 通过这次设计,我又学习到音频接口、IIS接口的相关知识,了解到了ARM设计的一般方法,更有利于我以后的学习。 参考文献 湖南理工学院专业实验辅导资料。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 应用 系统 设计 课程 论文 模板