嵌入式实验zpy
- 格式:doc
- 大小:268.00 KB
- 文档页数:21
如果有截图就插入每个实验的相应位置。
实验十三音频实验
通信2班朱鹏宇E08680230
一、实验目的
1.掌握S3C44B0X自带的IIS音频接口的使用方法。
2.掌握DMA数据传输方式。
二、实验内容
学习S3C44B0X自带的IIS音频接口的使用,通过DMA数据传输方式编程实现对W AV声音文件(不超过10秒)的循环播放。
三、实验设备及工具
硬件:ARM嵌入式开发平台,用于ARM7TDMI的JTAG仿真器、PC机Pentium100以上、耳麦。
软件:PC机操作系统win98以上、ARM SDT 2.51或ADS1.2集成开发环境、仿真器驱动程序、Source Insight 3.0。
四、实验原理及说明
1.W A V音乐格式
在Windwos 环境下,大部分的多媒体文件都依循着一种结构来存放信息,这种结构称为“资源互换文件格式”( resources interchange file format , 简称RIFF)。例如声音的WA V文件、视频的AVI文件等等均是由此结构衍生出来的。RIFF可以看作是一种树状结构,其基本构成单位为chunk ,犹如树状结构中的节点,每个chunk由“辨别码”、“数据大小”及“数据”所组成。辨别码由 4 个ASCII码所构成,数据大小则标示出紧跟其后数据的长度(单位为Byte),而数据大小本身也用掉4 个Byte,所以事实上一个chunk的长度为数据大小加8。一般而言,chunk 本身并不允许内部再包含chunk,但有两种例外,分别为以“RIFF”及“LIST”为辨别码的chunk 。而针对这两种chunk,RIFF又从原先的“数据”中切出4个Byte。这4个Byte 称为“格式辨别码”,然而RIFF又规定文件中仅能有一个以“RIFF”为辨别码的chunk。只要是依循这一结构的文件, 我们均称之为RIFF文档。这种结构提供了一种系统化的分类。如果和MS-DOS文件系统作比较,“RIFF”chunk就好比是一台硬盘的根目录,其格式辨别码便是此硬盘的逻辑代码(C:或D:),而“LIST”chunk 即为其下的子目录,其他的chunk则为一般的文件。至于在RIFF文件的处理方面,微软提供了相关的函数。视窗下的各种多媒体文件格式就如同在磁盘上规定仅能放怎样的目录,而在该目录下仅能放何种数据。
WA V 为waveform(波形)的缩写。声音文件的结构如表4-1所示,“RIFF”的格式辨别码为“W A VE”。整个文件由两个chunk 所组成:辨别码“fmt ”(注意,最后一个是空白字符!)及“data”。
表4-1W AV 文件结构
“RIFF”
××××
“WA VE”
“fmt”
sizeof(PCMW A VEFORMA T
)
struct of
PCMW A VEFORMA T
data
××××
wave form data
在“fmt”的chunk下包含了一个PCMW A VE-FORMAT数据结构,其定义如下:
typedef struct pcmwaveformat-tag{
WA VEFORMAT wf;
WORD wBitsPerSample;
}PCMW A VEFORMA T;
typedef struct waveformat-tag{
WORD wFormat Tag ;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesperSec;
WORD nBlockAlign;
}WA VEFORMAT;
其意义分别为:
wFormat Tag:记录着此声音的格式代号,例如W A VE- FORMA T- PCM,W A VE- FORAM- AD-PCM等等。
nChannels:记录声音的通道数。
nSamplesPerSec:记录每秒取样数。
nAvgBytesPerSec:记录每秒的数据量。
nBlockAlign:记录区块的对齐单位。
wBitsPerSample:记录每个取样所需的位数。
“data”Chunk包含着真正的声音数据。Windows目前仅提供W A VE- FORMAT- PCM一种数据格式,所代表的意义是脉冲编码调制(pulse code modulation)。针对这种格式,Windows 定义了在“data”的chunk中数据的存放情形,图4-1中列出了四种不同通道数及取样所需的位元数以及位元位置的安排。
图4-1 PCM 文件中位元安排方式
第一排表示单声道8位元,第二排表示双声道8位元,第三排表示单声道16位元,第四排
表示双声道16位元。8位元代表音量大小由8个位元所表示,16位元则代表音量大小由16 个位元所表示。理论上8位元可以表示0~255,16位元可表示0~65535,不过Windows 规定16 位元其值的范围为-32168~32167。此外尚有一点要注意的是,0并不一定代表无声,而是由中间的数值来决定,也就是在8位元时为128,16 位元时为0才是无声。所以,若程序设计时需放入无声的数据,需特别注意声音格式是16或是8位元,以放入适当的值。五、实验步骤
1.新建工程,将“Exp13音频实验”中的文件添加到工程。
2.编辑主任务函数(Main_Task()),如下图4-2所示:
void Main_Task(void *Id) //Main_Test_Task
{
U32 nbyte;
FILE *pfile;
char filename[]="1.wav";
rIISCON=0; //disable;
rIISMOD=IISMOD_TX|IISMOD_16BIT|IISMOD_32FS|IISMOD_MCLK_384FS;
rIISFCON=IISFCON_TXDMA|IISFCON_TXFIFO;
rIISPSR=0x11;
rIISCON=IISCON_PRESCALE|IISCON_ENABLE;
Init_UDA1341();
pfile=OpenOSFile(filename, FILEMODE_READ);
if(!pfile)
return ;
ReadOSFile(pfile, (U8*) buffer, 0x16*2);//读取头文件信息
nbyte=ReadOSFile(pfile, (U8*) buffer, sizeof(buffer));//读取波形数据
for(;;)
{//死循环
/****** BDMA0 Initialize ******/
//for Source
rBDISRC0=(1<<30)+(1<<28)+(int)buffer; //Half word,inc,Buf
//for des
rBDIDES0=(1<<30)+(3<<28)+((int)0x1d18010); //M2IO,fix,IISFIF
//Size
//iis,reserve,done_int,not auto-reload/start,DMA enable,COUNT
rBDICNT0=(1<<30)+(1<<26)+(3<<22)+(0<<21)+(0<<20)+(sizeof(buffer)&(~0x3));
rBDICNT0 |= (1<<20);//enable
//Enable DMA
rBDCON0 = 0x0<<2;
//Tx DMA
rIISCON|=IISCON_TXDMA;
}