北邮dsp硬件实验报告.docx
《北邮dsp硬件实验报告.docx》由会员分享,可在线阅读,更多相关《北邮dsp硬件实验报告.docx(40页珍藏版)》请在冰豆网上搜索。
北邮dsp硬件实验报告
DSP硬件实验报告
学院:
电子工程学院
班级:
姓名:
学号:
班内序号:
一常用指令实验
一、实验目的
1.熟悉DSP开发系统的连接
2.了解DSP开发系统的组成,结构和应用系统构成
3.熟悉常用C54X系列指令的用法(程序寻址,寄存器,I/O口,定时器,中断控制)。
二、实验设备
计算机,CCS2.0版软件,DSP仿真器,EXPIII+试验箱。
三、实验步骤与内容
1、系统连接:
进行DSP实验之前,先必须连接好仿真器、实验箱及计算机,连接方法如下所示:
(1)、上电复位:
在硬件安装完成后,确认安装正确、各实验部件及电源连接正确后,接通仿真器电源或启动计算机,此时,仿真盒上的“红色小灯”应点亮,否则DSP开发系统与计算机连接有问题。
(2)、运行CCS程序:
先给实验箱上电,然后启动CCS,此时仿真器上的“绿色小灯”应点亮,并且CCS正常启动,表明系统连接正常;否则仿真器的连接、JTAG接口或CCS相关设置存在问题,掉电,检查仿真器的连接、JTAG接口连接,或检查CCS相关设置是否正确。
2、实验操作:
(1)、拨码开关设置
实验箱的拨码开关SW2.4置OFF(54x的译码有效);54xCPU板的跳线J2的1、2短接(HPI8位模式);SW1的2、6置ON,其余置OFF(HPI使能;DSP工作微处理器方式;CPU_CS=0);SW2全部置ON(FLASH工作在数据空间,LED灯D5的工作状态处于灭状态);
(2)、运行实验程序
启动CCS2.0,点击FileLoadProgram...并加载“exp01.out”;加载完毕后,单击“Run”运行程序;
(3)、观察实验现象
实验结果:
可见XF灯以一定频率闪烁;单击“Halt”暂停程序运行,则XF灯停止闪烁,如再单击“Run”,则“XF”灯又开始闪烁;
四、流程图
五、实验代码
源程序:
注释:
;FileName:
exp01.asm
.mmregs
.global_main
_main:
stm#3000h,sp
ssbxxf
calldelay
rsbxxf
Calldelay
b_main
nop
nop
;
delay:
stm270fh,ar3
loop1:
stm0f9h,ar4
loop2:
banzloop2,*ar4-
banzloop1,*ar3-
ret
nop
nop
;
.end
//定义存储器映像寄存器
//全局符号,可在外部定义
//设置堆栈指针寄存器的值为3000h
//sp:
堆栈指针寄存器
//置位状态寄存器xf=1,灯亮
//调用delay函数
//复位状态寄存器xf=0,灯灭
//调用delay函数
//无条件转移至_main,
//空指令
//空指令
//设置辅助寄存器ar3值为9999
//设置辅助寄存器ar4值为249
//Loop:
对代码块开始重复汇编
//寄存器ar4值减一,当其值不为0时跳转到loop2
//寄存器ar3值减一,当其值不为0时跳转到loop1
//可选择延迟的返回
//空指令
//空指令
二、资料存储实验
一、实验目的:
1、掌握TMS320C54的程序空间的分配,
2、掌握TMS320C54的数据空间的分配,
3、操作其数据空间的指令
二、实验设备
计算机,CCS3.3,DSP仿真器,EXPIII+试验箱
三、实验步骤与内容
1、实验使用资源介绍
本实验指导书是以TMS32OVC5410为例,介绍相关的内部和外部内存资源。
对于其它类型的CPU请参考查阅相关的资料手册。
下面给出TMS32OVC5410的内存分配表:
对于存储空间而言,映像表相对固定。
值得注意的是内部寄存器与存储空间的映像关系。
因此在编程应用时这些特定的空间不能作其它用途。
对于程序存储空间而言,其映像表和CPU的工作模式有关。
当MP/MC引脚为高电平时,CPU工作在微处理器模式;当MP/MC引脚低电平时,CPU工作在为计算机模式。
具体的内存映像关系如上图所示。
2、实验操作
(1).拨码开关设置
实验箱的拨码开关SW2.4置OFF(54x的译码有效);54xCPU板的跳线J2的1、2短接(HPI8位模式);SW1的2、6置ON,其余置OFF(HPI使能;DSP工作微处理器方式CPU_CS=0);SW2全部置ON(FLASH工作在数据空间,LED灯D5的工作状态处于灭状态);
(2).运行实验程序
启动CCS2.0,点击FileLoadProgram...并加载“exp02.out”;加载完毕后,单击“Run”运行程序,;
a)在CCS的Memory窗口中查找C5410各个区段的数据存储器地址,在可以改变的存储器内容的地方,选定地址随意改变其中内容并观察结果;
b)在CCS中装载实验示范程序,单步执行程序,程序中写入和读出的数据存储地址的变化;
c)改变其它寻址方式,观察数据存储器地址与写入和读出数据的的变化。
(3)实验现象:
本实验程序将对0x1000开始的8个地址空间,填写入0xAAAA的数值,然后读出,并存储到0X1008开始的8个地址空间.
4、流程图
本实验说明:
本实验程序将对0x1000开始的8个地址空间,填写入0xAAAA的数后读并存储到0X1008开始的8个地址空间。
在CCS中可以观察DATA内存空间地址0X1000~0X100F值的变化。
五、实验程序
源程序:
注释:
*FileName:
exp02.asm
;getsomeknowledgeofthecmdfile
;theprogramiscompiledatnoautoinitializationmode
.mmregs
.global_main
_main:
;storedata
stm1000h,ar1
rpt#07h
st0aaaah,*ar1+
;readdatathenre-store
stm7h,ar3
stm1000h,ar1
stm1008h,ar2
loop:
ld*ar1+,t
stt,*ar2+
banzloop,*ar3-
here:
bhere
.end
//该程序在没有初始化的模式下编译
//定义存储器映像寄存器
//全局符号,可在外部定义
//执行主程序
//将外部内存地址1000h赋给辅助寄存器ar1
//循环执行下一条指令8次
rpt:
循环执行下一条指令,计数为短立即数
//将数据AAAAH存放到以地址1000H~1007H的八个存储单元中.
且ar1值加1,st存储
//将立即数7赋给辅助寄存器ar3
//将地址1000h赋给辅助寄存器ar1
//将地址1008h赋给辅助寄存器ar2
Ld:
把操作数装入累加器,赋值
//将辅助寄存器ar1的值赋给t,ar1值加1
//将t的值赋给辅助寄存器ar2,ar2值加1
//寄存器ar3值减1,当其值不为0时跳转到loop
//无条件转移至here
三I/O实验
一、实验目的
1.了解I/O口的拓展,掌握I/O口的操作方法
2.熟悉PORTR,PORTW指令的用途
3.了解字量与模拟量的同异
二、实验设备
计算机,CCS3.3,DSP仿真器,EXPIII+试验箱
三、实验步骤与内容
1、实验说明:
实验中采用简单的一一映像关系来对I/O口进行验证,目的是使实验者能够对I/O有一目了然的认识。
在本实验系统中,提供的IO空间分配如下:
CPU1:
0x0000switchinput(X)8
0x0001LEDoutput(X)8
CPU2:
0x0001DAC
0x0004Read_Key
0x0006Write_Key
0x000FWrite_LCD
2、实验过程
(1)拨码开关设置
1、实验箱的拨码开关SW2.4置OFF(54x的译码有效);54xCPU板的跳线J2的1、2短接(HPI8位模式);SW1的2、6置ON,其余置OFF(HPI使能;DSP工作微处理器方式;CPU_CS=0);SW2全部置ON(FLASH工作在数据空间,LED灯D5的工作状态处于灭状态);
(2)实验执行程序
运行CCS程序,装载示范程序,调整K0~K7的开关,观察LP1~LP7LED亮灭的变化,以及输入和输出状态是否一致。
注意:
电平转换接口主要考虑应用3.3V的中央处理器时,系统的电平兼容问题,用来保护CPU不受损坏。
系统采用74LVC245电平兼容转换器件。
(3)实验现象
调整K0~K7的开关,观察LP1~LP7LED不同条件下灯的亮灭变化。
4、流程图
五、实验程序
源程序:
注释:
;FileName:
exp03.asm
;learnhowtooperatetheI/Oports
;intheI/Ospace0x0000=>8switches
;0x0001=>8LEDs
.mmregs
.global_main
.text
_main:
stm3100h,sp
stm1000h,ar1
portr8000h,*ar1
nop
nop
portw*ar1,8001h
nop
nop
b_main
nop
nop
.end
//输入端口赋给8个按键
//输入端口赋给8个指示灯
//定义映像寄存器
//声明全局符号,
//代码区
//执行主程序
//设置堆栈指针寄存器的值为3100h
//设置辅助寄存器ar1值为1000h
//从8000h端口读入IO数据,将其传入ar1所指向的内存空间1000h
//空指令.起延时作用.
//空指令
//将ar1所指向的内存空间的值赋给8001h端口,控制led灯
访问I/O空间需要使用特殊的指令:
portr和portw。
portr:
读按键;portw:
写按键
;空指令
;空指令
;无条件转移至_main,实现按键控制
;空指令
;空指令
四定时器实验
一、实验目的
熟悉C54的定时器,掌握C54定时器的控制方法,学会使用定时器中断方式控制流程。
二、实验设备
计算机,CCS3.3,DSP仿真器,EXPIII+试验箱
3、实验步骤及内容
1、实验说明
C54的定时器是一个20位的减法计数器,可以被特定的状态位实现停止、重新启动、重新设置或禁止,可以使用该定时器产生周期性的CPU中断,控制定时器中断频率的两个寄存器是定时周期寄存器PRD和定时减法寄存器TDDR。
在本系统中,如果设置时钟频率为20MHZ,令PRD=0x4e1f,这样得到每1/1000秒中断一次,通过累计1000次,就能定时1秒钟。
2、实验过程
(1)拨码开关设置
实验箱的拨码开关SW2.4置OFF(54x的译码有效);54xCPU板的跳线J2的1、2短接(HPI8位模式);SW1的2、6置ON,其余置OFF(HPI使能;DSP工作微处理器方式;CPU_CS=0);SW2全部置ON(FLASH工作在数据空间,LED灯D5的工作状态处于灭状态);
(2)实验程序运行
启动CCS2.0,并加载“exp04.out”,单击“Run”运行,可观察到LED灯(LP0~LP7)以一定的间隔时间不停摆动,单击“Halt”,暂停程序运行,LED灯停止闪烁,单击“Run”,运行程序,LED灯又开始闪烁。
(3)实验现象
LED灯(LED1~LED8)以一定的间隔时间不停闪亮变化;
4、流程图
5、实验程序
源程序:
exp04.c
#include"tms320uc5402.h"
ioportunsignedport8001;
unsignedintshow=0x00aa;
unsignedintnum=0x0000;
voidsys_ini()
{
asm("ssbxINTM");
PMST&=0x00FF;
SWWSR=0x7000;
CLKMD=0x17FA;
}
voidtimer0_ini()
{
TCR|=0x0010;PRD=0x2710;
TCR|=0x000A;
IMR=0x0008;
IFR=0xFFFF;
asm("rsbxINTM");TCR&=0xFFEF;TCR|=0x0020;}
interruptvoidtimer0()
{
if(num==200){
show=~show;
num=0;
}
else
num++;
return;
}
voidmain(void)
{
sys_ini();
timer0_ini();
for(;;)
{
port8001=show;
}
}
注释
//调用头文件
//I/O地址输出端口8001
//存储在地址10101010
//初始化数据
//系统初始化子程序
//置位INTM=1,禁止所有的可屏蔽中断
//(映射到程序空间和数据空间)向量表映射到0x0080空间--0000000011111111
//对应于io空间7个等待周期,程序与数据空间0个等待周期--0111000000000000
//CLKOUT=2*CLKIN=2*10M=20M,自动延时最长时间设置时钟--0001011111111010
//定时器0初始化子程序,产生5ms时钟
定时器产生中断的计算公式如下:
TINT的周期=1/tc×TDDR+1×PRD+1(其中tc为CLKOUT的周期)
//0000000000010000,TSS=1,停止定时器
//PRD=10000(十进制)
//TDDR=10(十进制)
所以定时器时钟T=1/(20M/10/10000)=5ms
//0000000000001000,HINT=0,中断屏蔽寄存,使能定时器中断
//HINT=1,中断标志寄存,清除所有中断标志
//复位INTM=0,全局使能可屏蔽中断
//--0000000011101111,TSS=0,定时器启动
//0000000000100000,TRB=1,定时器再装载
当TRB=1置位时,TIM用PRD中的值装载,PSC用TDDR中的值装载。
//定时器0中断子程序
//记200次定时器中断,时间=200*5ms=1s
//取反
//每200次,即1s取反一次,灯变化一次
//主程序
//调用初始化函数
//调用定时器初始化函数
//将输出端口8001赋给led灯显示变量
中断向量空间表:
源程序:
vectors.asm
.global_c_int00,_timer0
.sect".vecs"
reset:
b_c_int00
nop
nop
nmi:
RETE
NOP
NOP
NOP
sint17.space4*16
sint18.space4*16
sint19.space4*16
sint20.space4*16
sint21.space4*16
sint22.space4*16
sint23.space4*16
sint24.space4*16
sint25.space4*16
sint26.space4*16
sint27.space4*16
sint28.space4*16
sint29.space4*16
sint30.space4*16
int0:
RETE
NOP
NOP
NOP
int1:
RETE
NOP
NOP
NOP
int2:
RETE
NOP
NOP
NOP
tint:
b_timer
NOP
NOP
brint0:
RETE
NOP
NOP
NOP
bxint0:
RETE
NOP
NOP
NOP
brint1:
RETE
NOP
NOP
NOP
bxint1:
RETE
NOP
NOP
NOP
int3:
RETE
NOP
NOP
NOP
.end
注释:
//引用函数c_int00,引用了c中的函数
//自定义一个已初始化段.vecs
//复位中断向量,跳转到主程序
//用nop填充表中其余空字
//B指令占两个字节,所以用两个nop
//非屏蔽外部中断的输入引脚
//允许响应中断,可屏蔽中断置为0,返回
//软件中断,内部中断,保留出中断向量的地址空间,将4*16的地址存储在sin17~sin30
NT0~INT2外部用户中断输入,具有优先权,能通过中断屏蔽寄存器和中断方式位屏蔽,能通过中断标志寄存器复位。
//此处int0中断响应为0,设置rete响应中断并返回。
//此处int1中断响应为0,设置rete响应中断并返回。
//此处int2中断响应为0,设置rete响应中断并返回。
//定时器产生的时钟中断,跳转到主程序c中定义的timer程序
//同步串口0(McBSP0)接受中断,直接返回
//同步串口0(McBSP0)发送中断,直接返回
//同步串口1(McBSP1)接受中断,直接返回
//同步串口1(McBSP1)发送中断,直接返回
//外部中断int3,允许中断并返回
六、实验总结:
中断,指的是当某个事件发生时,暂停当前的操作,转向中断服务程序,执行完后再返回继续原来的操作。
这使得DSP能够处理多个任务。
DSP有许多中断源,可以设置中断控制寄存器来确定响应哪些中断而不理会哪些中断,本实验介绍最常用的定时器中断。
当有中断发生并且处于允许状态时,程序指针跳转到中断向量表中对应的中断地址。
由于中断服务程序一般较长,通常中断向量表存放的是一个跳转指令,指向实际的中断服务程序。
使用向量一般用一条跳转指令转到相应中断服务子程序,其余空位用NOP填充;*未使用的向量直接用RETE返回,是为了防止意外进入未用中断。
使用定时器首先要对它初始化,基本步骤如下:
1.关掉中断2.停止定时器运行。
3.设定时器的定时长度
4.允许定时器中断5.运行定时器6.打开中断
定时器是一个片内减计数器,它可以被特定的状态位实现停止、重启动、重设置或禁止。
定时器在复位后就处于运行状态,用于周期地产生CPU中断或脉冲输出。
定时器被预定标计数器所触发,后者每个CPU时钟周期减1,当计数器减至0时,会产生一个定时器中断,同时在下一周期计数器被定时周期值重新装载。
五、INT2中断实验
一、实验目的
1.掌握中断技术,学会外部中断的处理方法
2.掌握中断对程序流程的控制,理解DSP对中断响应时序
二、实验设备
计算机,CCS3.3,DSP仿真器,EXPIII+试验箱
三、实验步骤和内容
(1)拨码开关设置
1、实验箱的拨码开关SW2.4置OFF(54x的译码有效);54xCPU板的跳线J2的1、2短接(HPI8位模式);SW1的2、6置ON,其余置OFF(HPI使能;DSP工作微处理器方式;CPU_CS=0);SW2全部置ON(FLASH工作在数据空间,LED灯D5的工作状态处于灭状态);
2、用导线连接"CPLD单元"的2号孔"单脉冲输出"和"电机控制单元"2号孔"INT2"。
(2)实验程序运行
启动CCS2.0,并加载“exp05.out”,单击“Run”运行。
反复按开关"单脉冲输出",观察LED1~LED8灯亮灭变化;单击Halt暂停程序运行反复按单脉冲单元的S5键,LED1-LED8灯亮灭不变化
(3)实验现象:
先按开关"单脉冲输出",发现LED灯1,3,5,7亮,再按一次,LED灯2,4,6,8亮。
4、流程图
五、实验程序
源程序:
initial.asm
注释:
.mmregs
.global_initial
.text
_initial:
NOP
LD#0,DP
STM#0,CLKMD
STM#0,CLKMD
TstStatu1:
LDMCLKMD,A
AND#01b,A
BCTstStatu1,ANEQ
STM#0xF7FF,CLKMD
STM0x3FA0,PMST
ssbx1,11
stm#00h,imr
stm#0ffffh,ifr
stm#04h,imr
rsbx1,11
ret
.end
//定义存储器映像寄存器
//定义全局变量
//已初始化可执行代码段
//系统初始化
//重置数据指针,为DP寄存器赋值0
DP是状态寄存器ST0的低9位,和7位(数据存储器地址)构成16位数据存储区地址
//设置时钟模式寄存器的值为0
可通过调整CLKMD寄存器改变CPU时钟。
STM累加器的低端存放到存储器映射寄存器
//LDM把存储器映射寄存器值装入到累加器
//和pollSTATUS(二进制)做与运算;
//BC为可选择延迟的条件转移;
//1111011111111111,设置时钟10MHz;
//PMST是处理器模式状态寄存器,指向中断
指针向量0011111110100000,MP/MC=0,可对片内ROM寻址;
//置位ST1.INTM=1,停止所有的中断
//将立即数置位0,存在中断屏蔽寄存器,此时HINT=0停止所有中断;
//将立即数全1存入中断标志寄存器,此时HINT=1中断开放,清除所有中断标志位;
//立即数0100,使能int2的外部中断
//复位ST1.INTM=0,允许所有中断
//ret可选择延迟的返回
外部中断程序:
int2.c
注释:
interruptvoidint2c();
externvoidinitial();
externvoidporta();
externvoidportb();
intflag=0,i=0;
main()
{
initial();
while
(1){;
}
}
interruptvoidint2c(){
i=i+1;
if(i==1)
{
if(flag==0)
{
flag=1;
porta();
i=0;
}
else
{
flag=0;
portb();