嵌入式应用系统设计课程论文模板Word下载.docx
- 文档编号:19218997
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:12
- 大小:113.88KB
嵌入式应用系统设计课程论文模板Word下载.docx
《嵌入式应用系统设计课程论文模板Word下载.docx》由会员分享,可在线阅读,更多相关《嵌入式应用系统设计课程论文模板Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
——供给发送和接收用的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字节)和"
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
//STATUS(000101xx+10)
FsIdx=mode?
RecStatus.FsIdx:
PlayStatus.FsIdx;
if(CodecPara[FsIdx].ofs)
_WrL3Data(0x18,0);
else
_WrL3Data(0x28,0);
_WrL3Data(0xc1,0);
//1,0,0,0,0,0,01
//DAC增益控制为6dB,ADC增益为dB。
//Record
if(mode){//mode为1时选择录音状态
_WrL3Addr(0x14+2);
//_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);
_WrL3Data(0x7b,0);
//01,1110,11:
Data0,BassBoost18~24dB,Treble6dB
//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:
_WrL3Data(0xc0,0);
//11000,000:
Extendedaddr(3bits),000
_WrL3Data(0xe4,0);
//111,00000:
MA=0dB
_WrL3Data(0xc1,0);
//11000,001:
Extendedaddr(3bits),001
MB=0dB
_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<
download_len;
i+=4)*(U32*)(download_addr+i)=0;
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);
printf("
\nerr=%x\n"
err);
for(j=0;
j<
i;
j++)
if(waveInAddBuffer(hwi,&
hdr[j],0))
puts("
Addbuffererror!
);
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)
HWAVEOUThwo;
U8pause=0;
U8mute=0;
U32volume;
unsignedchar*buf;
if(REC_OK==0)
download_addr=DFT_DOWNLOAD_ADDR;
buf=(unsignedchar*)download_addr;
for(i=0;
243552;
i++)buf[i]=WindowsXP_Wav[i];
download_len=243552;
size=*(U32*)(download_addr+0x28);
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);
SampleRate=%d,Channels=%d,%dBitsPerSample,size=%d\n"
fmt.nSamplesPerSec,fmt.nChannels,fmt.wBitsPerSample,*(U32*)(download_addr+0x28));
hwo=0;
err=waveOutOpen(&
hwo,
waveOutWrite(0,&
hdr[j],0);
Nowplayingthefile\n"
PressEsctoexit,'
+'
toincvolume,'
-'
todecvolume,'
y'
tomute,Enterto'
pause'
\n"
waveOutGetVolume(0,&
volume);
U8key=getch();
if(key==ENTER_KEY)
{
pause^=1;
if(pause&
1)
waveOutPause(0);
else
waveOutRestart(0);
}
if(key=='
||key=='
Y'
)
{
mute^=1;
if(mute&
1)
waveOutSetVolume(0,0);
waveOutSetVolume(0,volume);
if((key=='
)&
&
(volume<
=64535))
volume+=1000;
waveOutSetVolume(0,volume);
(volume>
=1000))
volume-=1000;
}
}
waveOutClose(0);
4总结
这次课程设计是对我们综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程。
随着科学技术发展的日新日异,ARM嵌入式系统已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握嵌入式的开发技术是十分重要的。
通过这次设计,我又学习到音频接口、IIS接口的相关知识,了解到了ARM设计的一般方法,更有利于我以后的学习。
参考文献
湖南理工学院专业实验辅导资料。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 应用 系统 设计 课程 论文 模板