DSP实验基于CCS报告.docx
《DSP实验基于CCS报告.docx》由会员分享,可在线阅读,更多相关《DSP实验基于CCS报告.docx(12页珍藏版)》请在冰豆网上搜索。
DSP实验基于CCS报告
《DSP与嵌入式系统》实验报告
IO端口实验
一、实验目的
了解ICETEK-VC5416-徽在TMS320VC5416DSPO空间上的扩展。
了解ICETEK-VC5416-徽上指示灯扩展原理。
学习在C语言中使用扩展的控制寄存器的方法。
二、实验原理
I/O空间的扩展及使用:
C54xDSP的I/O空间被保留用于外部扩展。
由于在程序中访问I/O空间的语句只有in
和out指令,所以在扩展时一般将带有控制能的寄存器或分离地址访问的存储单元的地址映射到I/O空间,访问这部分的单元又称I/O端口访问。
例如:
可将控制指示灯组的寄存器或锁存器映射到一个I/O端口地址上;A/D、D/A等专用芯片控制端和状态寄
存器也常映射到I/O端口上。
总之,在I/O空间中扩展的设备一般重点用于控制,而
使用大片连续存储空间的存储器单元一般映射到数据空间。
ICETEK-VC5416-A板将指示灯、DIP开关、A/D、D/A、异步串行通信接口和WatchDog的控制端等映射在I/O空间。
0001-0001h:
WatchDog控制寄存器
3006-3006h:
A/D转换控制寄存器
1000-1001h:
D/A转换控制寄存器
2000-2007h:
异步串口通信控制寄存器
3002-3002h:
板上指示灯控制寄存器
3003-3003h:
板上DIP拨动开关控制寄存器
ICETEK-VC5416-A实验箱上控制模块也使用I/O端口控制大部分设备:
8001-8001h:
读-键盘扫描值,写-液晶控制寄存器
8002-8002h:
液晶控制寄存器
8003-8004h:
液晶显示数据寄存器
8005-8005h:
发光二极管显示阵列控制寄存器
8006-8006h:
保留
8007-8007h:
发光二极管显示阵列控制寄存器
8008-9FFFh:
保留
在程序中,访问I/O端口的语句较为简单。
对于汇编语言程序,可用PORTR和PORTW
指令,例如,从端口0008h读入一个字到变量x的指令为portr8,x,而向端口000ch输出x变量的值的指令为portw#0Ch,x;在C语言中访问I/O端口则必须首先声明I/O端口的类型,然后才能访问,以下语句仍完成上面汇编语言所完成的功能:
ioportunsignedintport0008;
ioportunsignedintport000c;
x=port0008;
指示灯扩展原理
详见上图,其中7个指示灯是D3-D9;D10在硬件上没做控制扩展。
实验程序流程图
三、实验代码
.依次类推。
实验二定时器实验
一、实验目的
.通过实验熟悉VC5416A的定时器;
.掌握VC5416A定时器的控制方法;
.掌握VC5416A的中断结构和对中断的处理流程;
.学会C语言中断程序设计,以及运用中断程序控制程序流程。
二、实验原理
.通用定时器介绍及其控制方法
片内定时器是一个软件可编程定时器,可以用来产生周期的中断信号。
定时器主要由3个寄存器所组成:
定时器寄存器(TIM)、定时器周期寄存器(PRD和定时器控制寄存器(TCR。
这3个寄存器都有映象寄存器,它们在数据存储器中的地址分别为24H、25H和26H。
TIM是一个递减计数器;PRD中存放计数值;TCR中有定时器的控制位和状态位:
15—12保留
11--10softfree
9—6PSC定时器预定标计数器
5TRB定时器重新加载位,用来复位片内定时器
4TSS定时器停止状态位,用于停止或启动定时器
3—0TDDR定时器分频系数
在正常工作卜#况下,当TIM减到0后,PR叶的时间常数自动地加载到TIM。
复位后,定时器控制寄存器(TCR的停止状态位TSS=O,定时器启动工作,时钟信号CLKOUT至IJ预定标计数器PSCPSCfc是一个递减计数器,每当复位或其减到0后,自动地将定时器分频系数TDDRt1载至IJPSCPSCECLKOUT用下,作减1计数。
当PS(M到0,产生一个借位信号,令TIM乍减1计数。
TIM减到0后,产生定时器中断信号TINT,传送到CP生口定时器输出引
TOUT。
定时器中断白周期为:
CLKOUT(TDDR+1X(PRD+1
其中,CLKOUT时钟周期,TDDROPR盼别为定时器的分频系数和时间常数
对定时器初始化的步骤如下:
⑴先将TC种的TS3&置1,关闭定时器。
⑵加载PRD。
⑶重新加载TCR(使TDD初始化;令TS/=0,以接通CLKOUTTR阶值1,以使TIM减到0后重新加载定时器时间常数),启动定时器。
-对中断的处理:
⑴设置INTM=1
⑵将IFR中的TINT位置1,消除尚未处理完的定时器中断。
⑶将IMR中的TINT位置1,开放定时器中断。
⑷将ST1中的INTMS请0,开放所有可屏蔽中断。
.TMS320VC5416中断结构
5416的IMR和IFR寄存器的结构,其中包含了可响应的中断:
中断响应过程
外设事件要引起CPU中断,必须保证:
IMR相应位被使能(置1),ST1寄存器中的INTM
使能(置0)。
当CPU响应中断时,PC指针指向中断向量表中对应中断的地址,进入
中断服务子程序。
中断向量表是DSP存放中断服务程序的一段内存区域,大小为80H。
在中断向量表中,每一个中断占用4个字的空间,一般情况是将一条跳转或延时跳转指
令存放于此。
中断向量表的位置是可以改变的,修改PMST寄存器中的中断向量表基地
址可以实现这一点。
中断程序设计程序中应包含中断向量表,5416默认向量表从程序区FF80地址开始存放。
向量表中每
项为4个字,存放一个跳转指令,跳转指令中的地址为相应服务程序入口地址;第一个
向量表的首项为复位向量,即CPU复位操作完成后自动进入执行的程序入口;程序中包
含相应的中断服务程序,应将其入口地址加入相应中断向量表中。
.实验程序分析
本实验设计的程序是在上一个实验基础上修改得来,由于上一实验控制指示灯闪烁的延
时控制是用循环计算方法得到的,延时不精确也不均匀,采用中断方式可以实现指示灯
的定时闪烁,时间更加准确。
对于定时器的周期寄存器为计数f423H,分频系数定为15,
即1,000,000个CPU时钟计数一次,由于DSP工作在8MHz主频(ICETEK-VC5416-A
板上DIP开关U2的CLKMD1-3均为OFF时),正好是125ms中断一次,所以在中断
服务程序中计算中断4次时改变指示灯状态,实现指示灯亮秒再灭秒,即每秒闪烁
1次。
实验程序的工程中包含了两种源代码,主程序采用C语言编制利于控制,中断向
量表在汇编语言文件中,利于直观地控制存储区分配。
在工程中只需将它们添加进来即
可,编译系统会自动识别分别处理完成整合工作。
实验程序的C语言主程序中包含了内
嵌汇编语句,提供一种在需要更直接控制DSP状态的
方法,同样的方法也能提高C语言部分程序的计算效率。
.程序流程图
主程序流程图中断服务程序流程图如下:
三、实验代码
mage")
intmix[256];
intkk=0;
intkkk=0;
#defineFIRNUMBER64
#defineSIGNAL1F1000
#defineSIGNAL2F4500
#defineSAMPLEF10000
#definePI
floatInputWave();
floatFIR();
voidinitMcBSP2(void);
floatfHn[FIRNUMBER]={
};
floatfXn[FIRNUMBER]={};
floatfInput,fOutput;
floatfSignal1,fSignal2;
floatfStepSignal1,fStepSignal2;
floatf2PI;
inti;
floatfIn[256],fOut[256];
intnIn,nOut;
intflage=0;
intuWork;
intinp1[256];
intinp2[256];
intlength1,length2;
intchannel;
intwww;
main()
inti,j;
asm("ssbxINTM");
*(int*)0x58=0x0;
j=PMST;
PMST=j&0xff;
IMR=0x8;
TCR=0x417;
TIM=8;
PRD=0x157;
TCR=0x427;
IFR=0x100;
flage=0;
channel=1;
length1=length2=0;
www=0;
for(i=0;i<256;i++)
{
fOut[i]=0;
}
port3006=1;
*(int*)0x58=0x1007;
initMcBSP2();
asm("rsbxINTM");
nIn=0;nOut=0;
f2PI=2*PI;
fSignal1=;
fSignal2=PI*;
fStepSignal1=2*PI/30;
fStepSignal2=2*PI*;
while
(1)
{
if(flage==1)
{
mage")
intmix[256];
intkk=0;
intkkk=0;
#defineFIRNUMBER64
#defineSIGNAL1F1000
#defineSIGNAL2F4500
#defineSAMPLEF10000
#definePI
floatInputWave();
floatFIR();
voidinitMcBSP2(void);
/*滤波器的参数*/
floatfHn[FIRNUMBER]={
};
floatfXn[FIRNUMBER]={};//
floatfInput,fOutput;
floatfSignal1,fSignal2;
floatfStepSignal1,fStepSignal2;
floatf2PI;
inti;
floatfIn[256],fOut[256];
intnIn,nOut;
intflage=0;
intuWork;
intinp1[256];
intinp2[256];
intlength1,length2;
intchannel;
intwww;
main()
{
inti,j;
asm("ssbxINTM");//关闭可屏蔽中断
*(int*)0x58=0x0;
j=PMST;
//设置PMSTJ存器
PMST=j&0xff;//中断向量表起始地址=80H
IMR=0x8;
TCR=0x417;//计数器分频系数=8
TIM=8;//计数器计数为8
PRD=0x157;//周期寄存器为0x157
TCR=0x427;//
IFR=0x100;//其中,时钟周期为8MHz
flage=0;
channel=1;//打开通道
length1=length2=0;
www=0;
for(i=0;i<256;i++)
{
fOut[i]=0;
}
port3006=1;
*(int*)0x58=0x1007;
initMcBSP2();
asm("rsbxINTM");//开中断进行转换nIn=0;nOut=0;
fSignal1=;
fSignal2=PI*;
fStepSignal1=2*PI/30;
fStepSignal2=2*PI*;
while
(1)
{
if(flage==1)
{
flage=0;
fInput=InputWave();
fIn[nIn]=fInput;
nIn++;nIn%=256;
fOutput=FIR();
fOut[nOut]=fOutput;
nOut++;
if(nOut>=256)
{
等待延时
nOut=0;//
}
}
}
}
floatInputWave()
{
for(i=FIRNUMBER-1;i>0;i--)
fXn[i]=fXn[i-1];
fXn[0]=mix[kkk];
kkk++;
if(kkk>=256)
{
kkk=0;
flage=0;
}
return(fXn[0]);
}
floatFIR()
{
floatfSum;
fSum=0;
for(i=0;i{
fSum+=(fXn[i]*fHn[i]);
}
return(fSum);
}
//定时器中断服务程序,完成:
保存转换结果、启动下次转换
voidinterrupttime(void)
{
inti;
if(flage==0)
{
if(channel)
{
DXR12=0xe000;
uWork=DRR12;
uWork=uWork>>4;
uWork&=0xff;
inp2[length2]=uWork;
length2++;
}
else
{
DXR12=0xc000;
uWork=DRR12;
uWork=uWork>>4;
uWork&=0xff;
inp1[length1]=uWork;
length1++;
}
channel=1-channel;
www++;
www%=512;
if(www==0)
length1=length2=0;
flage=1;
for(i=0;i<256;i++)
{
mix[i]=inp1[i]+inp2[i];
}
asm("nop");
}
}
}
voidinitMcBSP2(void)/*配制McBSP作为SPI模式*/
{
SPSA2=SPCR1;
SPSD2=0;
SPSA2=SPCR2;
SPSD2=0;
SPSA2=RCR1;
SPSD2=0x40;
SPSA2=RCR2;
SPSD2=0x01;
SPSA2=XCR1;
SPSD2=0x40;
SPSA2=XCR2;
SPSD2=0x01;
SPSA2=SRGR1;
SPSD2=0x83;//
SPSA2=SRGR2;
SPSD2=0x2000;
SPSA2=PCR;
SPSD2=0xA08;
SPSA2=SPCR1;
SPSD2=0x5801;
SPSA2=SPCR2;
SPSD2=0xc1;
}
四、实验结果