DSP实验报告.docx

上传人:b****6 文档编号:7314662 上传时间:2023-01-22 格式:DOCX 页数:31 大小:2.58MB
下载 相关 举报
DSP实验报告.docx_第1页
第1页 / 共31页
DSP实验报告.docx_第2页
第2页 / 共31页
DSP实验报告.docx_第3页
第3页 / 共31页
DSP实验报告.docx_第4页
第4页 / 共31页
DSP实验报告.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

DSP实验报告.docx

《DSP实验报告.docx》由会员分享,可在线阅读,更多相关《DSP实验报告.docx(31页珍藏版)》请在冰豆网上搜索。

DSP实验报告.docx

DSP实验报告

实验一:

CPU定时器实验

一:

实验目的

1、熟悉F2812的CPU定时器;

2、掌握F2812的CPU定时器的控制方法;

3、学会使用CPU定时器中断方式控制程序流程。

二:

实验设备

计算机,CCS3.1版软件,DSP硬件仿真器,E300实验箱,2812CPU板。

三:

实验原理

样例实验是采用CPU定时器来定时使LED亮灭的。

F2812的CPU定时器不同于事件管理器模块(EVA、EVB)中的通用定时器(GP)。

F2812的CPU共有三个定时器,其中,CPU定时器1和2被保留用作实时操作系统OS(例如DSPBIOS),CPU定时器0可以供用户使用。

定时器的一般操作如下:

将周期寄存器PRDH:

PRD中的值装入32为计数器寄存器TIMH:

TIM。

然后计数器寄存器以F281x的SYSCLKOUT速率递减。

当计数器减到0时,就会产生一个定时器中断输出信号(一个中断脉冲)。

下图为CPU定时器的内部结构:

四:

实验步骤

1、F2812CPU板的JUMP1的1和2脚短接,拨码开关SW1的第二位置ON;其余置OFF。

2、E300底板的开关SW4的第2位置ON,其余位置OFF。

其余开关设置为OFF。

3、运行CCS软件,调入样例程序,装载并运行;(进入CCS界面后需要点“Debug--Connect”)

4、加载“..\e300_03_cpu_timer\Debug\Example_281x_cpu_timer.out”;

5、单击“Debug\Animate”运行,

可观察到灯LED1~LED8的变化规律:

6、单击“Debug\Halt”,暂停程序运行,LED灯停止闪烁;单击“Debug\Run”,运行程序,LED灯又开始按上述规律变化;

五:

实验程序及结果

修改后程序如下:

/*

;**************************************************************

;*北京达盛科技有限公司

;*研发部

;*

;*

;*************************************************************/

/*-----------------------文件信息----------------------------

;*

;*文件名称:

Example_DSP281x_e300_switch.c

;*适用平台:

DSPE300实验箱;

;*CPU类型:

DSPTMS320F2812

;*软件环境:

CCS3.1

;*试验接线:

1、F2812CPU板上:

JUMP1的1和2脚短接,

拨码开关SW1的第二位置ON;

;*2、E300底板的开关SW4的第2位置ON,其余置OFF。

;*试验现象:

设置好CCS的环境,打开本工程,编译、下载、运行。

;观察LED1~LED8灯亮灭的变化。

;*地址译码说明:

基地址:

0x2000,当底板片选CS1为低时,分配有效。

;*CPU的数据空间:

基地址+0x2200拨码开关input8位

;*CPU的数据空间:

基地址+0x2200LED灯output8位

*/

/*************************头文件*********************************/

#include"DSP281x_Device.h"//DSP281xHeaderfileIncludeFile

#include"DSP281x_Examples.h"//DSP281xExamplesIncludeFile

/*************************定义函数说明***************************/

//Prototypestatementsforfunctionsfoundwithinthisfile.

interruptvoidcpu_timer0_isr(void);

voidConfigCpuTimer(structCPUTIMER_VARS*Timer,floatFreq,floatPeriod);

/*************************主程序*********************************/

voidmain(void)

{

//PLL,WatchDog,enablePeripheralClocks

//ThisexamplefunctionisfoundintheDSP281x_SysCtrl.cfile.

InitSysCtrl();

//DisableCPUinterrupts

DINT;

//InitializethePIEcontrolregisterstotheirdefaultstate.

InitPieCtrl();

//DisableCPUinterruptsandclearallCPUinterruptflags:

IER=0x0000;

IFR=0x0000;

//InitializethePIEvectortablewithpointerstotheshellInterrupt

//ServiceRoutines(ISR).

InitPieVectTable();

//Interruptsthatareusedinthisexamplearere-mappedto

//ISRfunctionsfoundwithinthisfile.

EALLOW;//ThisisneededtowritetoEALLOWprotectedregisters

PieVectTable.TINT0=&cpu_timer0_isr;

EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregisters

InitCpuTimers();//Forthisexample,onlyinitializetheCpuTimers

//ConfigureCPU-Timer0tointerrupteverysecond:

//100MHzCPUFreq,1secondPeriod(inuSeconds)

ConfigCpuTimer(&CpuTimer0,100,1000000);

StartCpuTimer0();

 

//EnableCPUINT1whichisconnectedtoCPU-Timer0:

IER|=M_INT1;

//EnableTINT0inthePIE:

Group1interrupt7

PieCtrlRegs.PIEIER1.bit.INTx7=1;

//EnableglobalInterruptsandhigherpriorityreal-timedebugevents:

EINT;//EnableGlobalinterruptINTM

ERTM;//EnableGlobalrealtimeinterruptDBGM

//IDLEloop.Justsitandloopforever(optional):

for(;;)

{

if(CpuTimer0.InterruptCount<1)

{

asm("nop");

asm("nop");

*(int*)0x2200=0x00FE;

}

elseif(CpuTimer0.InterruptCount<2)

{

asm("nop");

asm("nop");

*(int*)0x2200=0x00FD;

}

elseif(CpuTimer0.InterruptCount<3)

{

asm("nop");

asm("nop");

*(int*)0x2200=0x00FB;

}

elseif(CpuTimer0.InterruptCount<4)

{

asm("nop");

asm("nop");

*(int*)0x2200=0x00F7;

}

elseif(CpuTimer0.InterruptCount<5)

{

asm("nop");

asm("nop");

*(int*)0x2200=0x00EF;

}

elseif(CpuTimer0.InterruptCount<6)

{

asm("nop");

asm("nop");

*(int*)0x2200=0x00DF;

}

elseif(CpuTimer0.InterruptCount<7)

{

asm("nop");

asm("nop");

*(int*)0x2200=0x00BF;

}

else

{

CpuTimer0.InterruptCount=0;

}

}

}

interruptvoidcpu_timer0_isr(void)

{

CpuTimer0.InterruptCount++;

//Acknowledgethisinterrupttoreceivemoreinterruptsfromgroup1

PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;

}

//===========================================================================

//Nomore.

//===========================================================================

实验图像如下图:

六:

总结

在实验过程中,我发现只需要改动其中部分程序即可实现要求,如:

其中0x2200=0x00**是按照十六进制进行控制的,0为亮灯,1为灭灯,间隔一段时间会使亮灯的状态发生改变,一个周期结束后又重新开始循环,在上面的类似几条语句中,可以根据自己的喜好进行设置,使亮灯的效果发生改变。

 

实验二:

外部中断实验

一:

实验目的

1.掌握中断技术,学会外部中断的处理方法

2.掌握中断对程序的流程控制,理解DSP对中断的响应时序

二:

实验设备

计算机,CCS3.1版本软件,DSP仿真器,E300实验箱,2812CPU板(新的)

三:

实验原理

1.中断在F2812中的应用原理介绍:

(更加详细的内容请参看F2812的数据手册)

中断在F2812中有内部中断源和外部中断源,内部中断源包括一些片上外设产生的中断和软件产生的中断。

外部中断源包括经由外部中断引脚产生的中断。

1)在F2812中,中断有两种分类方法:

第一种是按照是否可屏蔽,

第二种是按照中断产生方式。

a)按照是否可屏蔽分类,分为可屏蔽和不可屏蔽。

所谓屏蔽是指DSP可以接受这个中断,但是却不作任何反映,也就是说对应的中断服务指令被屏蔽了,从而得不到执行,这种中断就叫做可屏蔽中断,相反的,如果一个中断只要产生,那么就必须有中断服务指令相应,这种中断叫做不可屏蔽中断。

b)按照中断产生的方式可以分为软件中断和硬件中断。

软件中断是指由指令产生的中断,硬件中断是指由外部中断源产生或者片上外设产生。

c)这两种分类方法之间有一定的联系,具体如下:

第一:

凡是软件中断必定是不可以屏蔽的。

原因很简单,软件中断是由软件产生,假如你想屏蔽它,那么干脆就别写这条指令,因此完全没有必要为软件中断设置是否可屏蔽机制。

第二:

硬件中断中有一些是可以屏蔽的,有一些不能屏蔽。

软件设计人员一般比较喜欢从可屏蔽性去考虑中断,而硬件设计人员喜欢从产生方式去考虑中断。

在以下的讨论中,我们以2812为例,介绍中断的相关细节内容。

我们首先从应用的角度提出一个简单的问题如下:

当用户按下一个按键,产生一个中断,

那么DSP是如何跳转到相应的中断服务指令,执行完中断服务指令以后,它又是如何返回

正常的程序执行呢?

2)简单的讲,DSP的中断控制器发现一个中断以后,它就会把下一个将要执行的指令地址保存起来,然后跳到中断服务指令处执行,执行完以后,再把刚才保存的地址重新装入执行寄存器,然后正常执行。

那么,DSP是如何知道服务指令在哪里放着呢?

这就要从DSP的中断实现机制来讲。

F2812使用了一个叫做中断向量表的结构,里面保存着不同中断的服务指令入口地址。

下表是F2812的中断向量表组织结构。

在该表中,编号越低,优先级越高。

硬件中断中,用户可以自定义仅有PDPINTA/B,INT[1:

2],其它的硬件中断都已经指定给了DSP的片上外设,比如编号为INT5.1的中断,T4PINT,它是片上定时器中断或者软件中断,当片上定时器4到计数点后,就会产生一个中断,相应就会执行这个地址里面的东西。

仅有中断向量表,DSP似乎还是不能够找到中断服务指令的地址。

事实上,DSP内部有一个中断控制器,它能够识别每一个编号的中断,所以一旦中断发生后,中断控制器就可以根据编号在相应的中断向量表里面找中断服务指令的地址。

3)现在大家比较清楚了上面我们提出问题的答案了。

更进一步讲,系统对中断的处理不是这么简单,因为,系统里面有套中断处理机制,必须判别中断是否已经被屏蔽,如果屏蔽,那么就不会得到响应。

在处理中断时,系统使用了两个主要的寄存器,中断标志寄存器(IFR),中断屏蔽寄存器(IMR)。

对于非可屏蔽中断和复位信号,系统直接相应,没有什么判断处理,也就不设计这两个寄存器。

IFR的位描述如下图所示。

这个寄存器的每一位对应一个中断,相应的中断发生后,这个位就会被置位。

显然,这里面没有NMI和RESET对应的标志位。

I

ER的位描述如下图所示:

和IFR是一一对应的。

IER的值完全由程序员控制,假如你想屏蔽掉某个中断,那么你就需要对IMR的相应中断位置位。

对于可屏蔽中断的处理过程如下图所示:

中断源产生一个中断请求,在这个过程中,如果是可屏蔽中断,那么它必定在IFR里占一席之地,此时对IFR相应的位置位。

如果是不可屏蔽中断,直接进入中断服务程序。

中断服务程序要做的事情后面会讲到。

如果是可屏蔽的,那么接下来下来系统要确认是否可以执行。

如下图。

在这个阶段,系统会检查如下条件:

第一:

检查所有同时发生的中断的优先级,高优先级首先得到相应。

第二:

检查ST1中的中断模式位(INTM),如果该位为1,所有中断全部被屏蔽。

INTM是一种快速屏蔽所有可屏蔽中断的方法。

第三:

检查IER中相应中断的屏蔽位,如果置位,则不能得到执行。

如果以上三条检查都通过,那么系统进入中断服务程序。

具体内容如下。

第一:

把程序计数器(PC)压栈。

第二:

把相应中断向量的地址装入程序计数器(PC)。

第三:

从中断向量地址中取到跳转指令,同时对相应中断的IFR位清零,执行跳转指令。

第四:

执行中断服务指令直到一个返回语句。

第五:

正常返回,把栈里的内容弹出重新装入PC。

第六:

继续执行正常指令。

需要注意一点,对于不可屏蔽中断在中断服务程序执行过程中,系统要检查是不是RESET,NMI或者INTR软件中断,如果是这几个中的任何一个,系统都要立即屏蔽所有可屏蔽中断,然后再继续执行。

在系统设计中要注意,有几种情况可以让程序跑飞。

在程序设计中要用编程策略保证正确的程序执行顺序。

第一种:

如果中断服务指令的执行时间大于同一中断的最小发生周期,而在中断服务指令执行的过程中,所有中断都没有屏蔽。

在这种情况下,一个中断服务指令还没有执行完而又新到达了一个中断,而新的中断又得到执行的允许,这种情况会使程序执行错误。

第二种:

如果同时发生的中断数超过一个固定的值,那么,就会有中断丢失。

第三种:

如果发生了中断,而被屏蔽掉了,那么IFR种的相应中断位将不会清零,这对于后来的中断

处理有影响吗?

整个中断执行的流图如下。

4)明确了这些问题,那么就可以自由使用中断。

F2812支持3个外部可屏蔽中断,即XINT1、XINT2、XINT13。

XINT13和一个非屏蔽中断XNMI复用。

这些外部中断中的每一个可以选择下降沿或上升沿触发,还可以使能或不使能(包括XNMI)。

可屏蔽中断还包括一个16位自由运行的增计数器,当一个有效的中断边沿被检测到时,复位成0。

本计数器用于给中断提供一个精确的时间标记。

下面给出的是外部中断2控制寄存器各位的定义:

F2812DSP的中断为低电平边沿触发。

按键盘时,键盘产生的低电平脉冲,通过CPLD分配给F2812的XINT2引脚,每按一次,产生一个低电平脉冲,用来控制实验箱上LED灯的亮灭。

2.实验流程框图如下:

四:

实验步骤

1.2812CPU板JUMP1的1和2脚短接,拨码开关SW1的第二位置ON;

2.E300板上的开关SW4的第二位置ON,其余OFF;SW5开关全部置ON;其余开关全部置OFF。

3.运行CodeComposerStudio(CCS)(ccs3.1需要“DEBUG→Connect”)

4.打开系统项目文件\e300.test\normal\DSP281x_examples\e300_05_int\e300_int.pjt;

5.编译全部文件并装载\Debug\Example_281x_int.out;

6.单击“Debug\GoMain”跳到主程序的开始;

7.单击“Debug\RUN”运行程序。

8.点击E300底板上的任意键盘,观察LED灯的变化情:

每按一次“键盘”按键,LED1-LED8奇偶数灯亮灭就变化一次.

9.单击“Debug\Halt”暂停程序运行,反复按“键盘”按键,LED1-LED8灯亮灭不变化.

10.关闭所有窗口,本实验完毕.

五:

实验程序及结果

修改后实验程序如下:

/*

;**************************************************************

;*北京达盛科技有限公司

;*研发部

;*

;*

;*************************************************************/

/*-----------------------文件信息----------------------------

;*

;*文件名称:

Example_DSP281x_int.c

;*适用平台:

DSPE300实验箱;

;*CPU类型:

DSPTMS320F2812

;*软件环境:

CCS3.1

;*试验接线:

1、F2812CPU板的JUMP1的1和2脚短接,拨码开关SW1的第二位置ON;

;*2、E300底板的开关SW4的第2位置ON,其余置OFF。

;*3.将LED1-LED8全部拨到靠近键盘的位置,以便于LED灯能够正确指示到中断信息

;*试验现象:

设置好CCS的环境,打开本工程,编译、下载、运行。

;*观察LED1~LED8灯亮灭的变化。

;*地址译码说明:

基地址:

0x2000,当底板片选CS1为低时,分配有效。

;*CPU的数据空间:

基地址+0x0200拨码开关input8位

;*CPU的数据空间:

基地址+0x0200LED灯output8位

;*外部中断用XINT2,由CPLD分配,中断信号由键盘按键产生。

;*中断下降沿触发。

*/

/*************************头文件*********************************/

#include"DSP281x_Device.h"//DSP281xHeaderfileIncludeFile

#include"DSP281x_Examples.h"//DSP281xExamplesIncludeFile

Uint16show=0x00aa;//定义欲显示值

Uint32Xint1InterruptCount;

/**************************主程序*****************************/

voidinit_xint2(void);

interruptvoidxint2_isr();

voidmain(void)

{

//PLL,WatchDog,enablePeripheralClocks

//ThisexamplefunctionisfoundintheDSP281x_SysCtrl.cfile.

InitSysCtrl();

//DisableCPUinterrupts

DINT;

//InitializePIEcontrolregisterstotheirdefaultstate.

//ThedefaultstateisallPIEinterruptsdisabledandflags

//arecleared.

InitPieCtrl();

//DisableCPUinterruptsandclearallCPUinterruptflags:

IER=0x0000;

IFR=0x0000;

//InitializethePIEvectortablewithpointerstotheshellInterrupt

//ServiceRoutines(ISR).

InitPieVectTable();

EALLOW;//ThisisneededtowritetoEALLOWprotectedregisters

PieVectTable.XINT2=&xint2_isr;

EDIS;

init_xint2();

/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1