DSP实验基于CCS报告

合集下载

DSP实训报告

DSP实训报告

实验一 CCS环境下DSP程序调试实例一实验目的熟悉CCS开发DSP应用程序的基本过程—创建、生成、调试和测试掌握Build参数的设置、Watch窗口、断点(Breakpoint)的设置二实验内容1.工程的创建首先运行CCS编程环境,按一下步骤依次进行,Project→New…,自定义存放路径2.创建源程序,链接命令,复位向量文件并添加到新建工程,接着编译3.程序运行的时候有一个错误,修改Build并更正语法错误在“scanStr[1]=0”后加入“;”4. 运行程序,在File→Load program…打开hello.out,单击Debug→Run可以看到输出结果5. 设置断点,并使用Watch窗口查看结果移动光标,将其放在fprintf(fptr,“%s”,scanStr);行上按F9设置断点。

View→Watch Window,将出现Watch窗口在Watch窗口中“Name”所对应的位置写入“scanStr”,Watch窗口中将出现“scanStr”的值按F5运行程序,并在提示输入时写入“goodbye”,如图所示,将在Watch窗口中看到“scanStr”的值为“goodbye”。

运行结果(也可按F10单步运行):三实验总结与体会第一次接触这个软件很陌生,再老师带着我们做了一个例子后,基本上大概了解了这个程序是怎么使用的,然后我们自己就做了上面这个例子当做练习使用这个软件。

当实际操作的时候还是发现有很多问题,比如,我在编译后就没有加载.out的文件,以致于最后出不来结果。

但是当弄完这个例子后,差不多就熟练了这个流程,会用ccs这个软件了,所以说我们应该多增加动手操作能力,光有理论知识还是远远不够的。

实验二 CCS环境下建立计算求累加和工程项目一实验目的1. 编写计算求累加和的.ASM源程序2. 编写计算求累加和的复位向量.ASM文件3. 编写计算求累加和的链接命令.CMD文件4. 运用CCS经调试得到正确的结果二实验内容计算 10Y=∑a i*x ii=1x i=1,2,3,4,5,6,7,8,9,10a i=10,9,8,7,6,5,4,3,2,1ai 、xi均存放在程序存储器空间1.在CCS环境下建立计算求累加和的工程项目2.编写计算求累加和的 .ASM源程序在file下new一个项目,然后编写程序,编写完成后保存成shiyansan.asm的格式,保存的路径在D盘shiyansan文件夹下。

dsp2812实验报告

dsp2812实验报告

实验一CCS 环境认识实验一、实验目的1、了解CCS软件操作环境和基本功能。

2、掌握CCS 软件仿真的配置步骤。

二、实验设备PC 机一台,安装有Code Composer Studio3.3 软件。

三、实验步骤1、软件仿真(Smulator)方式软件仿真是利用CCS软件在PC机中构造DSP的仿真环境,用于调试应用程序。

由于无法构造DSP中的外设,所以软件仿真仅能调试软件的算法和进行效率分析等。

软件仿真方式工作时,无需连接板卡和仿真器等硬件。

设置步骤:(1)单击桌面图标:进入CCS软件设置窗口(2)在出现的窗口中按标号顺序进行如下设置:图1-1-1 ccs设置驱动界面此时CCS已经被设置成Simulator方式(软件仿真TMS320F2812器件的方式)。

2、创建工程⑴选择菜单栏“Project”的“New…”项,在弹出对话框“Project”中输入新建工程名volume;并设置工程所在目录。

⑵选择菜单“Project”的“Add Files to Project…”项将volume.c源程序文件、volume.cmd 命令文件。

注:头文件可以在编译时根据程序中的“include”语句自动加入。

3、查看源程序双击左侧工程管理窗中的“volume.c”文件,可以查看程序内容。

这个程序是一个音频信号采集、处理输出的程序。

其功能是将输入的音频数据扩大volume倍后输出。

4、修改工程设置将程序中的用户堆栈的尺寸设置成 1024 (字):点击菜单栏Project→Build Options,在弹出的Bulid Options for volume.pjt对话框中点击Linker标签,在Category栏中选中Basic项,并在其右侧的Basic设置里将Stack size (-stack)的值改为1024,点确定后保存。

5、编译选择菜单“Project”的“Rebuild All”项,对当前工程中所有文件进行编译链接,形成输出文件,注意编译过程中CCS主窗口下部的“Build”提示窗中显示编译信息,如给出的错误和警告的信息。

DSP实验基于CCS报告

DSP实验基于CCS报告

《DSP与嵌入式系统》实验报告目录实验一 IO端口实验一、实验目的了解 ICETEK-VC5416-A板在TMS320VC5416DSP在IO空间上的扩展。

了解 ICETEK-VC5416-A板上指示灯扩展原理。

学习在C 语言中使用扩展的控制寄存器的方法。

二、实验原理I/O 空间的扩展及使用:C54x DSP 的 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 的指令为 portr 8,x,而向端口 000Ch 输出x变量的值的指令为 portw #0Ch,x;在 C 语言中访问 I/O 端口则必须首先声明 I/O 端口的类型,然后才能访问,以下语句仍完成上面汇编语言所完成的功能:ioport unsigned int port0008;ioport unsigned int port000C;x = port0008;指示灯扩展原理详见上图,其中 7 个指示灯是 D3-D9;D10 在硬件上没做控制扩展。

DSP技术及其应用实验报告 CCS软件基本运算

DSP技术及其应用实验报告  CCS软件基本运算

DSP技术及其应用实验实验题目:CCS软件基本运算实验人:学号:班级:实验地点:一. 实验目的1.学习DSP算术指令的使用;2.学习并掌握DSP的基本寻址方式。

二. 实验器材1.CVT-DSP实验箱、DSP仿真器。

三. 实验内容1.编写程序,实现数据的算术运算;四. 基础知识1.DSP寻址方式简介在上一个实验中我们仅仅使用了一些寄存器,或者说是使用了寄存器寻址,DSP的寻址方式很多,可以分为以下几类:立即数寻址、绝对寻址、累加器寻址、直接寻址、间接寻址、存储器映射寄存器寻址、堆栈寻址,以及一些特殊的寻址比如:位倒序寻址、循环寻址。

下面简单的说明一下立即数寻址和直接寻址。

1)立即数寻址这种寻址方式最简单,指令里包括了立即操作数。

在一条指令中可对两种立即数编码。

一种是短立即数(3、5、8或9bits),另一种是16bits的长立即数。

立即数可包含在单字或双字指令中。

3-,5-,8-或9-bit值在单字指令中,16-bit值在双字指令中。

比如LD 指令允许使用3、5、8、9、16比特的立即数,FRAME指令只允许使用8比特的立即数,RPT允许使用8、16比特的立即数,而象ADD、ADDM、OR、ORM等只能使用16比特的立即数。

以下是一些立即数寻址的指令例子:2)直接寻址在直接寻址中,指令代码包含了数据存储器地址的低七位。

这7-bit作为偏移地址与数据页指针(DP)或堆栈指针(SP)相结合共同形成16-bit的数据存储器实际地址。

如下图所示。

其中CPL=0时:与9-bit的DP相结合形成数据存储器地址。

而9-bit的DP指向的是数据存储空间的512个数据页中的一页。

比如下面的程序:当CPL=1:加上SP基地址形成数据存储器地址。

示例略。

注:处理器复位后CPL默认值为0。

提示:实验算术指令由于不需要外部资源,可以不需要仿真器和实验箱。

我们可以平时自己用软件仿真,多多实验。

但是复杂的算法最好还是在线仿真,因为程序是流水线执行,软件仿真有时与实际硬件执行结果有所不同。

dsp实验报告CCS 设置和常用指令

dsp实验报告CCS 设置和常用指令

北京联合大学智慧城市学院实验报告课程名称:DSP 技术与应用实验名称: CCS设置和常用指令班级:通信14姓名学号:2017 年 10 月 21 日实验一 CCS 设置和常用指令一、实验目的熟悉CSS设置方法;会建立汇编语言源文件;会建立工程项目;会将文件加入到工程;会使用汇编、链接命令;会加载、运行程序。

二、实验内容1、编写汇编语言常用的装入和存储指令、算术指令、逻辑指令、程序控制指令50句。

2、使用汇编命令检查所编写的汇编语言源语句格式是否正确,如果有错误则找出并改正,直到没有错误为止。

三、实验设备每组PC 机一台;CCS-DSP 集成开发环境。

四、实验步骤1)CCS 设置及源文件编写、汇编、链接、加载、运行过程1、仿真器驱动的安装2、打开CCS,双击Setup CCS 环境设置3、连接试验箱系统4、建立新工程Project New5、建立新文件,编写源文件、链接命令文件6、加新建的文件到项目7、汇编源、链接文件8、加载、运行程序2)编写常用汇编语言指令装入和存储指令、算术指令、逻辑指令、程序控制指令共计50 句。

使用汇编命令菜单Project-Compile file,检查语句,如果有错误改正之,直到汇编没有错误为止。

五、实验报告1、CCS 工作环境设置过程:要有截图和说明。

新建工程并建立工作区建立ASM文件并保存2、编写的汇编语言语句和程序,要有截图。

3、汇编、链接、运行的结果:要有截图和说明。

4、实验结论通过本次实验,我熟悉了CCS的集成开发环境和运行环境,同时熟悉了CSS设置方法,在编译器里面进行源文件的编写,将文件添加到工程,最后经行加载、运行程序。

今天的这次实验让我对DSP的汇编语言有了更深一步的了解,在编译的过程中,我们组遇到了很多问题,但是最后通过查书和其他组的帮助,将问题一一解决。

及时地完成了任务。

附录:SUBB 1,B;从累加器中减去带借位减操作数DELAY 16;储存器单元延迟ADDC 1000h,A;带进位的加法SUBC 1000h,A;有条件减法SQUR 1000h,A;1000位置的数字的平方加到累加器A中DADD 12,A;双精度12加到累加器AADD 1H,A ; 操作数1加至累加器AADD 2H,2,A ; 操作数2移位后加至累加器AABS A;取绝对值CMPL A;累加器取反EXP A;求累加器中数据的指数MAX A;求累加器A最大值MIN B;求累加器B最小值NORM A;归一化SAT A;累加器饱和运算SUB #30,A;从累加器中减去30ADD #10,B;10加到累加器BMPY #20,A;20和累加器相乘MAC #10,#40,A;10和40相乘放到累加器A中SUB 3,A ;从累加器A中减去操作数3ROR B;累加器B经过进位位循环右移OR #1,B;1和累加器B相或XOR 10,A;10和累加器相异或RETE;开中断,从中断返回RETF;开中断,从中断快速返回ROL A;累加器A经过进位位循环左移SFTC A;累加器A条件移位BITT 1;测试由T寄存器指定的位AND 14,A ;操作数14与累加器A相与AND #1,A;1与累加A相与CMPM 1,#1k;储存单元与长立即数比较BACC A;按累加器规定地址转移PSHD 1;将1压入堆栈CALA A;按累加器的地址调子程序RPT #10;重复执行下调指令11次FRAME 1;堆栈指针偏移一个立即数值LD 31,16,A ;操作数左移16位后加载至累加器。

dsp实验报告

dsp实验报告

dsp实验报告实验一:CCS入门实验实验目的:1. 熟悉CCS集成开发环境,掌握工程的生成方法;熟悉SEED-DEC643实验环境; 掌握CCS集成开发环境的调试方法。

2.学习用标准C 语言编写程序;了解TI CCS开发平台下的C 语言程序设计方法和步骤; 熟悉使用软件仿真方式调试程序。

3. 学习用汇编语言编写程序; 了解汇编语言与 C 语言程序的区别和在设置上的不同;了解TMS320C6000 汇编语言程序结果和一些简单的汇编语句用法学习在CCS 环境中调试汇编代码。

4. 在了解纯C 语言程序工程和汇编语言程序工程结构的基础上,学习在C 工程中加入汇编编程的混合编程方法; 了解混合编程的注意事项;理解混合编程的必要性和在什么情况下要采用混合编程5. 熟悉CCS集成开发环境,掌握工程的生成方法; 熟悉SEED-DEC643实验环境;掌握CCS集成开发环境的调试方法。

实验原理:CCS 提供了配置、建立、调试、跟踪和分析程序的工具,它便于实时、嵌入式信号处理程序的编制和测试,它能够加速开发进程,提高工作效率。

CCS 提供了基本的代码生成工具,它们具有一系列的调试、分析能力序。

使用此命令后,要重新装载.out 文件后,再执行程序。

使用 CCS常遇见文件简介1. program.c: C 程序源文件;2. program.asm: 汇编程序源文件;3. filename.h: C 程序的头文件,包含DSP/BIOS API模块的头文件;4. filename.lib: 库文件;5. project.cmd: 连接命令文件;6. program.obj: 由源文件编译或汇编而得的目标文件;7. program.out: 经完整的编译、汇编以及连接后生成可执行文件; 8. program.map: 经完整的编译、汇编以及连接后生成空间分配文件; 9.project.wks: 存储环境设置信息的工作区文件。

P.S(CMD文件中常用的程序段名与含义1. .cinit 存放C程序中的变量初值和常量;2. .const 存放C程序中的字符常量、浮点常量和用const声明的常量;3. .text 存放C程序的代码;4. .bss 为C 程序中的全局和静态变量保留存储空间;5. .far 为C 程序中用far声明的全局和静态变量保留空间;6. .stack 为 C 程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果;7. .sysmem 用于 C 程序中malloc、calloc 和 realloc 函数动态分配存储空间。

DSPs原理及应用 CCS实验报告

DSPs原理及应用 CCS实验报告

DSPs原理及应用——实验报告实验一第17章利用CCS开发DSP程序程序V olume.c#include <stdio.h>#include "volume.h"/* Global declarations */int inp_buffer[BUFSIZE]; /* processing data buffers */int out_buffer[BUFSIZE];int gain = MINGAIN; /* volume control variable */ unsigned int processingLoad = BASELOAD; /* processing routine load value */ struct PARMS str ={2934,9432,213,9432,&str};/* Functions */extern void load(unsigned int loadValue);static int processing(int *input, int *output);static void dataIO(void);/** ======== main ========*/void main(){int *input = &inp_buffer[0];int *output = &out_buffer[0];puts("volume example started\n");/* loop forever */while(TRUE){/** Read input data using a probe-point connected to a host file.* Write output data to a graph connected through a probe-point.*/dataIO();#ifdef FILEIOputs("begin processing") /* deliberate syntax error */#endif/* apply gain */processing(input, output);}}/** ======== processing ========** FUNCTION: apply signal processing transform to input signal.** PARAMETERS: address of input and output buffers.** RETURN V ALUE: TRUE.*/static int processing(int *input, int *output){int size = BUFSIZE;while(size--){*output++ = *input++ * gain;}/* additional processing load */load(processingLoad);return(TRUE);}/** ======== dataIO ========** FUNCTION: read input signal and write processed output signal.** PARAMETERS: none.** RETURN V ALUE: none.*/static void dataIO(){/* do data I/O */return;}输入波形输出波形此时Gain值为1.输入波形输出波形Gain值为5Gain值为10时,输入输出波形如下:实验二第18章6701核心系统的定浮点运算程序的设计与分析1.定点小数乘法product.asm 代码如下:.def start.data.def _c_int00_c_int00multiplicand .word 5*32768/10multiplier .word 5*32768/10.bss result,4,1,1.textstart: MVKL multiplicand,A11MVKH multiplicand,A11MVKL multiplier,B11MVKh multiplier,B11LDW *A11,A12LDW *B11,B12NOP 5MPYU A12,B12,A11MPYHLU A12,B12,B11MPYH A12,B12,B12MPYLHU A12,B12,A12NOPADD B11,A12,B11SHR B11,16,A12SHL B11,16,B11ADD A11,B11,A11ADD A12,B12,A12MVKL result,B11MVKH result,B11STW A11,*B11++STW A12,*B11NOP 5LOOP: B LOOPNOP 5.endproduct.cmd 代码如下:MEMORY{ IPRAM:origin=0x00008000,len=0x01000 IDRAM: origin=0x80000000,len=0x10000 } SECTIONS{ .text : > IPRAM.data : > IDRAM.bss : > IDRAM }反汇编窗口打开memory windows根据.cmd文件的内容做设置此时存储器窗口显示的图如下Q值改为15 Q值改为30 2.64位整数加减法程序加法程序:.global_add64;.text_add64:ADDU.L1 A4,A6,A1:A0;||ADD.L2 B4,B6,B7;|| ADD.S2X A8,4,B0;ADD.L2X A1,B7.B7;STW.D1 A0,*A8;|| STW.D2 B7,*B0;||B.S2 B3NOP 5.endPC改为0x00008020,加数和被加数A4、A6改为0x12345678,0xf2345678减法程序:.global _sub64.text_sub64:SUBU.L1 A4,A6, A1:A0 || SUB.L2 B4,B6,B7|| SUB.S2X A8,4,B0SUB.L2X A1,B7,B7STW .D1 A0,* A8|| STW .D2 B7,* B0|| B.S2 B3NOP 5.endPC改为0x000080003. 浮点乘除法运算程序浮点运算程序如下:#include "math.h"#pragma DATA_SECTION(data1,"data_buf1") float data1;#pragma DATA_SECTION(data2,"data_buf2") float data2;#pragma DATA_SECTION(data3,"data_buf3") float data3;#pragma DATA_SECTION(data4,"data_buf4") float data4;#pragma DATA_SECTION(data5,"data_buf5") float data5;void main(void){data1=1.1;data2=2.84;data3=data1 * data2;data4=data1/data2;data5=sqrt(1.1);}.cmd文件如下:MEMORY{IPRAM : origin=0x0,len=0x10000IDRAM : origin=0x10000000,len=0xF0000 }SECTIONS{.text >IPRAMdata_buf1>IDRAMdata_buf2>IDRAMdata_buf3>IDRAMdata_buf4>IDRAMdata_buf5>IDRAM.stack >IDRAMcinit >IDRAM.far >IDRAM}Memory window 设置如下图实验三6701核心系统的FFT运算程序FFT主程序#define PI 3.14159265358979#define M 10#define N 1024#include<math.h>void radix2(int * xr,int * xi,short * wr,short * wi);void ChangeOrder(int * xr,int * xi);int xr[N],xi[N];int x[2* N];int xm[N];int xlr[N],xli[N];short w1[N],w2[N];int y[2* N];int ym[N];int radix;int nx1;int i;main(){double delta;radix=2;nx1=N;delta=2* PI/nx1;for(i=0;i<nx1/2;i++){w1[i]=32767* (cos(i* delta));w2[i]=32767* (sin(i* delta));}for(i=0;i<nx1;i++){xr[i]=xlr[i]=(int)((cos(PI* i/5.0))* 0x80);xi[i]=xli[i]=1;x[2* i]=xlr[i];x[2* i+1]=xli[i];}for(i=0;i<nx1;i++){xm[i]=(int)sqrt((xr[i]* xr[i])+(xi[i]* xi[i]));}ChangeOrder(xlr,xli);radix2(xlr,xli,w1,w2);for(i=0;i<nx1;i++){int sum=0;sum=(int)sqrt((xlr[i]* xlr[i])+(xli[i]* xli[i]));ym[i]=sum;y[2* i]=(int)sqrt((xlr[i])* (xlr[i]));y[2* i+1]=(int)sqrt((xli[i])* (xli[i]));}}/*基2FFT算法程序*/void radix2(int xr[],int xi[],short wr[],short wi[]){short L,B,J,P,k;int rPartKB,iPartKB;for(L=1;L<=M;L++){B=(int)(pow(2,(L-1))+0.5);for(J=0;J<=B-1;J++){P=J* ((int)(pow(2,(M-L))+0.5));for(k=J;k<=N-1;k+=(int)(pow(2,L)+0.5)){rPartKB=xr[k+B]* wr[P]+xi[k+B]* wi[P];iPartKB=xi[k+B]* wr[P]-xr[k+B]* wi[P];rPartKB>>=15;iPartKB>>=15;xr[k+B]=xr[k]-rPartKB;xi[k+B]=xi[k]-iPartKB;xr[k]=xr[k]+rPartKB;xi[k]=xi[k]+iPartKB;}}}}/*倒序子程序*/void ChangeOrder(int xr[],int xi[]){int LH,N1,I,J,K;short T;LH=N/2;J=LH;N1=N-2;for(I=1;I<=N1;I++){if(I<J){T=xr[I];xr[I]=xr[J];xr[J]=T;T=xi[I];xi[I]=xi[J];xi[J]=T;}K=LH;while(J>=K){J=J-K;K=(int)(K/2+0.5);}J=J+K;}}fft.cmd:MEMORY{VECTORS:origin=0x0,len=0x400IPRAM:origin=0x400,len=0xf000IDRAM:origin=0x80000000,len=0x10000 }SECTIONS{.vec>VECTORS.text>IPRAM.data>IDRAM.bss>IDRAM.cinit>IDRAM.comst>IDRAM.far>IDRAMxlr变量,发现无法找到x1r变量。

DSP基于CCS数据寻址方式实验

DSP基于CCS数据寻址方式实验

实验一 CCS的用法一、实验目的1、了解TMS320C54X汇编语言程序的基本格式,以及汇编、链接的基本过程。

2、初步熟悉CCS的用法。

二、实验要求1、了解CCS菜单命令及产生各个显示窗口的操作2、操作各种仿真命令·进入、退出CCS·选择当前窗口、改变窗口大小·加载程序·运行程序(包括单步执行)·检查修改CPU寄存器·检查修改存储器单元内容·用观察窗口检查变量、CPU寄存器或存储单元的内容三、实验条件1、硬件DSK板及软件开发平台工具CCS。

2、源程序清单lab1.asm,详见教材3。

2节。

3、链接命令文件lab1。

cmd,详见教材3。

2节.四、实验内容1、双击桌面上的CCS2(‘5000)图标,启动CCS集成开发环境。

2、创建一个新的工程:在Project菜单中选择New项,并输入工程名如lab1,然后单击完成按钮创建新工程.3、将文件添加入工程中:①从Project菜单中选取Add Files to Project命令,在弹出的对话框中选择lab1。

asm文件并单击打开按钮;或者在工程lab1.pjt 处单击右键,选择菜单命令Add Files to Project。

②采用类似方法将lab1.cmd文件添加入工程。

4、对工程进行汇编、编译、链接:执行菜单命令Project→Rebuild All,或者在工具栏上单击Rebuild All图标.5、加载程序:执行菜单命令File→Load Program,在弹出的对话框中选择lab1。

out并单击打开按钮。

6、运行程序:选择Debug中的Run运行程序或单击工具栏的Run图标、Single Step图标运行程序。

五、试验程序lab 1:************************************************* lab1.asm y= a1*x1+a2*x2+a3*x3+a4*x4 *************************************************。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《DSP与嵌入式系统》实验报告目录实验一 IO端口实验一、实验目的了解 ICETEK-VC5416-A板在TMS320VC5416DSP在IO空间上的扩展。

了解 ICETEK-VC5416-A板上指示灯扩展原理。

学习在C 语言中使用扩展的控制寄存器的方法。

二、实验原理I/O 空间的扩展及使用:C54x DSP 的 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 的指令为 portr 8,x,而向端口 000Ch 输出x变量的值的指令为 portw #0Ch,x;在 C 语言中访问 I/O 端口则必须首先声明 I/O 端口的类型,然后才能访问,以下语句仍完成上面汇编语言所完成的功能:ioport unsigned int port0008;ioport unsigned int port000C;x = port0008;指示灯扩展原理详见上图,其中 7 个指示灯是 D3-D9;D10 在硬件上没做控制扩展。

实验程序流程图三、实验代码.依次类推。

实验二定时器实验一、实验目的.通过实验熟悉 VC5416A 的定时器;.掌握 VC5416A 定时器的控制方法;.掌握 VC5416A 的中断结构和对中断的处理流程;.学会 C 语言中断程序设计,以及运用中断程序控制程序流程。

二、实验原理.通用定时器介绍及其控制方法片内定时器是一个软件可编程定时器,可以用来产生周期的中断信号。

定时器主要由 3 个寄存器所组成:定时器寄存器(TIM)、定时器周期寄存器(PRD)和定时器控制寄存器(TCR)。

这 3 个寄存器都有映象寄存器,它们在数据存储器中的地址分别为 24H、25H 和 26H。

TIM 是一个递减计数器;PRD 中存放计数值;TCR 中有定时器的控制位和状态位:15—12 保留11--10 soft free9—6 PSC 定时器预定标计数器5 TRB 定时器重新加载位,用来复位片内定时器4 TSS 定时器停止状态位,用于停止或启动定时器3—0 TDDR 定时器分频系数在正常工作情况下,当TIM减到0后,PRD中的时间常数自动地加载到TIM。

复位后,定时器控制寄存器(TCR)的停止状态位 TSS=0,定时器启动工作,时钟信号CLKOUT加到预定标计数器 PSC。

PSC也是一个递减计数器,每当复位或其减到0后,自动地将定时器分频系数TDDR加载到PSC。

PSC在CLKOUT作用下,作减1计数。

当PSC减到0,产生一个借位信号,令TIM作减1计数。

TIM减到0后,产生定时器中断信号TINT,传送到CPU和定时器输出引TOUT。

定时器中断的周期为:CLKOUT×(TDDR+1)×(PRD+1)其中,CLKOUT位时钟周期,TDDR和PRD分别为定时器的分频系数和时间常数。

对定时器初始化的步骤如下:⑴先将TCR中的TSS位置1,关闭定时器。

⑵加载PRD。

⑶重新加载TCR(使TDDR初始化;令TSS位=0,以接通CLKOUT;TRB位值1,以使TIM减到0后重新加载定时器时间常数),启动定时器。

- 对中断的处理:⑴设置 INTM=1⑵将 IFR中的TINT位置 1,清除尚未处理完的定时器中断。

⑶将 IMR中的TINT位置 1,开放定时器中断。

⑷将 ST1中的INTM位请 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")int mix[256];int kk=0;int kkk=0;#define FIRNUMBER 64#define SIGNAL1F 1000#define SIGNAL2F 4500#define SAMPLEF 10000#define PIfloat InputWave();float FIR();void initMcBSP2( void );float fHn[FIRNUMBER]={ ,,,,,,,,,,,,,,,,,,,,,,,, , , , , , , , , , , , , , , , , , , , , , ,,,,};float fXn[FIRNUMBER]={ };float fInput,fOutput;float fSignal1,fSignal2;float fStepSignal1,fStepSignal2; float f2PI;int i;float fIn[256],fOut[256];int nIn,nOut;int flage=0;int uWork;int inp1[256];int inp2[256];int length1,length2;int channel;int www;main(){int i,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")int mix[256];int kk=0;int kkk=0;#define FIRNUMBER 64#define SIGNAL1F 1000#define SIGNAL2F 4500#define SAMPLEF 10000#define PIfloat InputWave();float FIR();void initMcBSP2( void ); /*滤波器的参数*/float fHn[FIRNUMBER]={,,, , , , , , , , , , , , , , , , , , , , , , ,, , , , , , , , , , , , , , , , , , , , , , ,};float fXn[FIRNUMBER]={ }; //float fInput,fOutput;float fSignal1,fSignal2;float fStepSignal1,fStepSignal2;float f2PI;int i;float fIn[256],fOut[256];int nIn,nOut;int flage=0;int uWork;int inp1[256];int inp2[256];int length1,length2;int channel;int www;main(){int i,j;asm("ssbxINTM"); // 关闭可屏蔽中断*(int *)0x58=0x0;j= PMST; //设置PMST寄存器PMST = j&0xff; //中断向量表起始地址=80HIMR = 0x8;TCR = 0x417; // 计数器分频系数=8TIM = 8; //计数器计数为8PRD = 0x157; //周期寄存器为0x157TCR = 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;f2PI=2*PI; //设定正弦波的数字角频率范围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; //等待延时 }}}}float InputWave(){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]);}float FIR(){float fSum;fSum=0;for ( i=0;i<FIRNUMBER;i++ ){fSum+=(fXn[i]*fHn[i]);}return(fSum);}// 定时器中断服务程序,完成:保存转换结果、启动下次转换void interrupt time(void){int i;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");}}}void initMcBSP2( void )/*配制McBSP1作为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;}四、实验结果。

相关文档
最新文档