dsp硬件实验报告.docx
《dsp硬件实验报告.docx》由会员分享,可在线阅读,更多相关《dsp硬件实验报告.docx(70页珍藏版)》请在冰点文库上搜索。
dsp硬件实验报告
北京邮电大学
数字信号处理硬件实验
实验名称:
DSP硬件操作实验
姓名:
刘梦颉
班级:
2011211203
学号:
2011210960
班内序号:
11
日期:
2012年12月20日
实验一常用指令实验
」、实验目的
了解DSP开发系统的组成和结构,熟悉DSF开发系统的连接,熟悉DSP的开发界面,熟悉C54X系列的寻址系统,熟悉常用C54X系列指令的用法。
:
、实验设备
计算机,CCS2.0版软件,DSP仿真器,实验箱。
三、实验操作方法
1、系统连接
进行DSP实验之前,先必须连接好仿真器、实验箱及计算机,连接方法如下所示:
1)上电复位
在硬件安装完成后,接通仿真器电源或启动计算机,此时,仿真盒上的“红
色小灯”应点亮,否则DSP开发系统与计算机连接有问题。
2)运行CCS程序
先实验箱上电,然后启动CCS此时仿真器上的“绿色小灯”应点亮,并且CCS正常启动,表明系统连接正常;否则仿真器的连接、JTAG接口或CCS相关设置存在问题,掉电,检查仿真器的连接、JTAG接口连接,或检查CCS相关设置
是否正确。
四、实验步骤与内容
1、实验使用资源
实验通过实验箱上的XF指示灯观察程序运行结果
2、实验过程
启动CCS2.0,并加载“expOl.out”;加载完毕后,单击“Run”运行程序;
五、实验结果
可见XF灯以一定频率闪烁;单击“Halt”暂停程序运行,则XF灯停止闪烁,如再单击“Run”,则“XF”灯又开始闪烁;
关闭所有窗口,本实验完毕。
六、源程序代码及注释
流程图:
源程序
注释
;FileName:
expO1.asm
;theprogramiscompiledatno
autoinitializationmode
.mmregs--
定义存储器映射寄存器
.global_main
_main:
设置堆栈指针寄存器的值为3000h
stm#3000h,sp
stm是累加器的低端放到存储器的映射寄存器中。
存储器映射寄存器寻址用来修改存储器映射寄存
器而不影响当前数据页指针(DP)或堆栈指针(SP)
ssbxxf
的值
状态寄存器位置位,令XF=1,此时灯XF亮,XF用
calldelay
于发信号给外部设备,通过软件进行控制。
调用子程序DELA丫使XF灯亮0.25秒
rsbxxf
rsbx状态寄存器复位,灯火
calldelay
调用子程序DELA丫使XF灯灭0.25秒
b_main
nop
无任何操作
nop
;delay.5second
delay:
stm270fh(9999),ar3
loopl:
stm0f9h(249),ar4
loop2:
banzloop2,*ar4-
banzIoop1,*ar3-
ret
nop
nop
;stm2cycles
;banzwhenTRUE4cycles
;FALSE2cycles
;0f9h=>249d
;270fh=>9999d
.end
将9999放到AR3中
将249放到AR4中
(loop对代码进行重复汇编)
--由指令的Xar和Yar域选择的辅助寄存器。
ar4、
ar3是辅助寄存器
寄存器ar4值减一,当其值不为0时跳转到Ioop2寄存器ar3值减一,当其值不为0时跳转到Ioop1返回
空指令空指令
总结:
在main主函数中先疋义一个输出xf,先置位头现灯亮,再与delay函数控制灭灯的时间,最后复位实现灯的闪烁。
在delay函数中,实现两个循环嵌套,Ioop1是计数250,Ioop2计数10000次,总共计数2500000次,实现0.5秒的时延,所以闪烁间隔为0.5秒。
实验箱时钟频率为5MHz。
实验二资料存储实验
一、实验目的
掌握TMS320C54勺程序空间的分配;掌握TMS320C54勺数据空间的分配;熟悉操作TMS320C5数据空间的指令。
二、实验设备
计算机,CCS3.3版软件,DSP仿真器,实验箱。
三、实验系统相关资源介绍
本实验指导书是以TMS32OVC5410为例,介绍相关的内部和外部内存资源。
对于其它类型的CPU请参考查阅相关的资料手册。
下面给出TMS32OVC5410的内存分配表:
对于存储空间而言,映像表相对固定。
值得注意的是内部寄存器与存储空间的映像关系。
因此在编程应用时这些特定的空间不能作其它用途。
对于程序存储空间而言,其映像表和CPU的工作模式有关。
当MP/MC引脚为高电平时,CPU工作在微处理器模式;当MP/MC引脚低电平时,CPU工作在为计算机模式。
具体的内存映像关系如上如所示。
内存实验主要了解内存的操作和DSP的内部双总线结构。
并熟悉相关的指令代码和执行过程等。
四、实验步骤与内容
连接好DSP开发系统,运行CCS软件;
a)在CCS的Memory窗口中查找C5410各个区段的数据存储器地址,在可以改变的存储器内容的地方,选定地址随意改变其中内容并观察结果;
b)在CCS中装载实验示范程序,单步执行程序,程序中写入和读出的数据存储地址的变化;
c)改变其它寻址方式,进行观察数据存储器地址与写入和读出数据的的变化。
样例程序实验操作说明:
启动CCS2.0,并加载“exp02.out”,用“View”下拉菜单中的“Memory”查看内存单元,输入要查看的内存单元地址,本实验要查看0x1000H~0x100FH单元的数值变化,输入地址0X1000H,查看0x1000H~0x100FH单元的初始值,
单击“Run”运行程序,也可以“单步”运行程序,单击“Halt”暂停程序运
行,查看0x1000H~0x100FH单元内数值的变化
关闭各窗口,本实验完毕。
五、实验结果:
本实验程序将对0x1000开始的8个地址空间,填写入OxAAAA的数值,然后读出,并存储到0X1008开始的8个地址空间。
在CCS中可以观察DATA内存空间地址0X1000~0X100F值的变化。
六、源程序代码及注释
流程图:
源程序
注释
*FileName:
exp02.asm
;getsomeknowledgeofthecmdfile
;theprogramiscompiledatno
autoinitializationmode
.mmregs
.global_main
_main:
;storedata
stm1OOOh,ar1
内存地址
rpt#07h
rpt循环指令。
循环执行下一个指令,计数为
短立即数。
st0aaaah,*ar1+
st状态寄存器。
将数据"0AAAAH"存放到以
地址1000H~1007H的八个存储单元中,该8
;readdatathenre-store
个存储单元数据都是”0aaaah”
stm7h,ar3
将7h赋给辅助寄存器ar3
stm1000h,ar1
将地址1000h赋给辅助寄存器ar1
stm1008h,ar2
将地址1008h赋给辅助寄存器ar2
loop:
ld*ar1+,t
ld把单数据存储器操作数装入T寄存器。
;
将辅助寄存器ar1的值赋给t,且ar1地址加
1
存储T寄存器的值.将t的值存储在ar2所对
stt,*ar2+
应内存中,且ar2地址加1
banzloop,*ar3-
寄存器ar3地址减1,当其值不为0时跳转到
loop
here:
bhere
无条件转移至here
.end
总结:
对0x1000开始的8个地址空间,填写入OxAAAA勺数值,然后读出,并存
储到0x1008开始的8个地址空间。
实验实现先读入数据存到ar1中,然后将ar1
的值赋给辅助寄存器t,在将t的值赋值给ar2,存储到ar2的地址空间中。
实验三I/O实验
一、实验目的
1、了解I/O口的扩展;掌握I/O口的操作方法。
2、熟悉PORTR,PORTW指令的用途。
3、了解数字量与模拟量的区别和联系。
二、实验设备
计算机,CCS3.3版软件,DSP仿真器,实验箱
三、实验步骤及内容
、实验说明:
实验中采用简单的一一映像关系来对I/O口进行验证,目的是使实验者能够对I/O有一目了然的认识。
在本实验系统中,提供的IO空间分配如下:
CPU1:
0x8000按键input(X)8
0x8001LED灯output(X)8
2、实验过程
运行CCS程序,装载示范程序,调整K0〜K7的开关,观察LP1~LP7LED亮灭的变化,以及输入和输出状态是否一致。
例程序实验操作说明
启动CCS2.0,并加载“exp03.out”,单击“Run”运行程序,任意调整K0~K7开关,可以观察到对应LP0~LP7灯“亮”或“灭”;单击“Halt”,暂停持续运行,开关将对灯失去控制。
关闭所有窗口,本实验完毕。
四、源程序代码及注释
流程图:
源程序
注释
.mmregs
.global_main
.text
_main:
stm3100h,sp
stm1000h,ar1
portr8000h,*ar1
nop
nop
portw*ar1,8001h
nop
nop
b_main
nop
nop
.end
全局符号,可在外部疋义
设置堆栈指针寄存器的值为3100h,sp堆栈
指针寄存器
设置辅助寄存器ar1值为1000h
portr从端口8000h把数据读到数据存储器单元ar1中
空扌曰令,起疋的延时作用.
将数据空间的1000H单元的数据,写出到I/O
8001H中,控制LED灯的亮灭
程序跳转到"_MAIN"执行.
总结:
先设置堆栈寄存器内存空间,初始化辅助寄存器ar1的值,用来传输数据。
开关控制,从端口00h读入数据,,存储至ar1中,再ar1中的值传输给01h输出,控制led灯的变化。
实验四定时器实验
一、实验目的
熟悉C54的定时器;掌握C54定时器的控制方法;学会使用定时器中断方式控制程序流程。
二、实验设备
计算机,CCS3.3版软件,DSP硬件仿真器,实验箱。
三、实验步骤和内容
1、实验说明
C54的定时器是一个20位的减法计数器,可以被特定的状态位实现停
止、重新启动、重新设置或禁止,可以使用该定时器产生周期性的CPU中断,控制定时器中断频率的两个寄存器是定时周期寄存器PRD和定时减法寄存器
TDDR
在本系统中,如果设置时钟频率为20MHZ令PRD=0x4e1,这样得到每1/1000秒中断一次,通过累计1000次,就能定时1秒钟。
2、实验过程
1、运行CCS软件,调入样例程序,装载并运行;
2、定时器实验通过数字量输入输出单元的LED1-LED睐显示例程序实验操作说明:
启动CCS2.0,并加载“exp04.out”,单击“Run”运行,可观察到LED灯(LP0~LP7)以一定的间隔时间不停摆动,单击“Halt”,暂停程序运行,LED灯停止闪烁,单击“Run”,运行程序,LED灯又开始闪烁。
关闭所有窗口,本实验完毕。
四、源程序代码及注释
流程图:
开始
源程序:
expO4.c
#include"tms320uc5402.h"ioportunsignedport8001;
unsignedintshow=0x00aa;
unsignedintnum=0x0000;
voidsys_ini()
{
asm("ssbxINTM")
PMST&=0x00FF;
注释
声明c文件的头文件(引用包)
SWWSR=0x7000;
定义输出地址为8001H,其中数据控制LED灯
10101010,初始状态为1357灯亮
定义全局变量num,计数计时中应用,初始值为0
系统初始化子程序
(INTM中断模式位,ssbx:
状态寄存器位置位)全局禁止所有可屏蔽中断
DRAM映射到程序空间和数据空间)
向量表映射;0x0080空间
0x00FF=0000000011111111,与运算后复位处
理器方式状态寄存器后8位,初始地址为
FF80H,将前八位强制置为0,即为0080H,将0080H作为所使用中断的地址,即定时器中断
io空间7个等待周期,程序与数据空间0
个等待周期,0x7000=0111000000000000,
12~14表示io空间,(11仁7(d)),11~0表示
程序与数据空间,软件等待状态寄存器
CLKMD=0x17FA;
CLK0UT=2*CLKIN=2*10M=20M,倍频,自动
}
增大系统频率
voidtimerO」ni()
{
TCR|=0x0010;
定时器0初始化子程序
TSS,停止定时器0(TCR:
定时器控制寄存器)
PRD=0x2710;
PRD=10000(D),PRD定时周期寄存器
TCR|=0x000A;
TDDR=10(D),相当于进行了两次分频,
器时钟=1/20M*10*10000=5ms
定时
IMR=0x0008;
使能定时器0中断,数据溢出时产生中断,断屏敝
中
IFR=OxFFFF;
清除所有中断标志位
asm(”rsbxINTM");
全局使能可屏蔽中断
TCR&=0xFFEF;
开始定时器0
TCR|=0x0020;
}
复位定时器0
中断服务子程序声明与定义
注释
interruptvoidtimer0()
{
//疋时器0中断了程序
if(num==200)
//记200次定时器中断,
时间
{
=200*5ms=1s
show=~show;
//取反,通过show的值控制灯的亮火
num=0;}
//重新计时
else
num++;
//计数
return;
}
主程序
注释
voidmain(void){
sys_ini();
〃系统初始化
timer0_ini();
//定时器0初始化
for(;;)
{
port800仁show;}
//循环
〃将show的值赋给8001H,控制灯的亮
}
灭
源程序:
vectors.asm(定义中断
注释
向量表)
.global_c_int00,_timer0
.sect".vecs"
自定义向量表
RESET:
b_c_intOO
复位中断时跳转到c程序主函数(branchto
nop
Centrypoint延迟分支到c程序,默认入口
nop
地址c_int00)
nmi:
开辟堆栈空间
RETE
NMI非屏敝外部中断输入引脚,不可屏敝中
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
生的,即经过一定的时间跳转到C程序。
所
sint29.space4*16
有只有tint0,定时器0产生定时中断时跳转
sint30.space4*16
到C程序中的子函数,其他的中断均为返回
int0:
RETE
并允许(RETE)。
NOP
NOP
NOP
int1:
RETE
NOP
中断寄存器设置为rete返回,允许中断外部
NOP
产生中断,并且直接返回
NOP
int2:
RETE
NOP
NOP
NOP
tint:
b_timer
检测到定时器产生中断时,返回到c程序中
NOP
的timer()
NOP
rint0:
RETE
串口0接受中断,直接返回
NOP
NOP
NOP
xint0:
RETE
串口0发送中断,直接返回
NOP
NOP
NOP
rint1:
RETE
串口1接受中断,直接返回
NOP
NOP
NOP
xint1:
RETE
串口1发送中断,直接返回
NOP
NOP
NOP
int3:
RETE
NOP
NOP
NOP
.end
总结:
使用定时器产生周期性的CPU中断
,定时器结果通过led灯显示,定时1
秒钟。
实验五INT2中断实验
一、实验目的
1、掌握中断技术,学会对外部中断的处理方法。
2、掌握中断对程序流程的控制,理解DSP对中断的响应时序
二、实验设备
计算机,CCS3.3版软件,DSP仿真器,实验箱
三、实验步骤和内容
1、实验说明
DSP的INT2中断为低电平沿触发。
2、实验过程
本实验是进行C54芯片的INT2中断练习,C54芯片中断INT2是低电平单脉冲触发;实验采用导线一端连接D_Exp—数字量输入扩展接口10,经PX4的IN3,到PX5的OUT0电平转换,再与另一端连接INT2插孔;拨动开关K0一次,就产生一个低电平单脉冲;运行示范程序,观察LP1~LP7LED灯的输
出变化;可观察到每拨动开关K0一次LP1~LP7灯亮灭变化一次;样例程序实验操作说明:
启动CCS2.0,并加载“exp05.out”,单击“Run”运行程序,反复拨动开关K0,观察LP1~LP7LED灯亮灭变化,单击“Halt”暂停程序运行,反复拨动开关K0,LP1~LP7LED灯亮灭不变化;
关闭所有窗口,本实验完毕。
四、源程序代码及注释
流程图:
开始
系统初始化
中断子程序
八个LED灯亮灭变化
结束
源程序:
int2.c
注释
interruptvoidint2c();externvoidinitial();externvoidporta();
externvoidportb();intflag=O,i=O;
main()
{
initial();
主函数
系统初始化
while
(1)
{;}
}
interruptvoidint2c()
{
i=i+1;
if(i==1)
{if(flag==O)
{
flag=1;porta();
i=0;
}
else
{
flag=0;
portb();i=0;
}
}
else
{
i=0;
}
return;
}
死循环
中断子程序
当i为一时,让灯点亮,否则让i为零
当flag为零时,执行porta(),让ar1的值为
5555h,即第一二五七个灯亮
当flag为一时,执行portb(),让ar1的值为
aaaah,即第二四六八个灯亮
源程序:
initial.asm
注释
.mmregs
.global_initial
.text
_initial:
NOP
LD#0,DP
STM#0,CLKMD
STM#0,CLKMDTstStatu1:
LDMCLKMD,A
AND#01b,A
已初始化可执行代码段
初始化函数开始
;空操作
;resetdatapointer将0装入数据页指针(DP)中
;softwaresettingofDSPclock
;(todividermodebeforesetting)设置pll为
div分频模式
;将CLKMD的值装入到累加器A中
;pollSTATUSbit将A中数据和01b求与之
后存入A中
BCTstStatul,ANEQ
;ANEQ,A不等于0时程序跳转到TstStatu1
STM#0xF7FF,CLKMD
;setC5402DSPclockto10MHz
STM0x3FA0,PMST
;vectorsat3F80h,ARAM映射到数据和程序存储空间
ssbx1,11
设置ST1.INTM=1,停止所有的中断
stm00h,imr
停止所有的中断,中断屏蔽寄存器(IMR)
在需要的时候独立地屏蔽特定的中断
stm0ffffh,ifr
清除所有中断的标志位,中断标志奇存器(IFR)用来指明各个中断的目前状态。
stm04h,imr
开启int2的外部中断
rsbx1,11
ret
.end
打开所有中断
源程序:
port.asm
注释
.mmregs
.global
_porta
.global
_portb
_porta:
stm
304h,ar1
将304h赋值给辅助寄存器ar1
st
5555h,*ar1
将内存
304h
的内容赋值给5555h,2468灯亮
portw
*ar1,8001h
ret
将内存
304h
的值写入8001h端口,灯
_portb:
stm
304h,ar1
st
0aaaah,*ar1
将内存
304h
的内容赋值给0aaaah,1257灯
亮
portw
*ar1,8001h
将内存
304h
的值写入8001h端口,灯
ret
源程序:
vectors.asm
注释
.sect".vectors".ref_c_int00.ref_int2c.align0x80
RESET:
BD_c_int00
STM#200,SP
弓1用函数c_int00
页边界排列复位中断响应
延迟分支到C程序默认入口地址,c_int