DSP硬件实验报告Word文档格式.docx
《DSP硬件实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《DSP硬件实验报告Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
storedata;
存储数据
stm1000h,ar1;
将立即数1000h送入辅助寄存器ar1(内存地址)
rpt#07h;
循环执行下一条指令,8次
st0aaaah,*ar1+;
将立即数0xaaaah赋给辅助寄存器ar1的1000h地址内,
之后ar1的地址加1,8次;
ar1的地址变1008,内存0x1000--ox1007中的数据均为0xaaaah
readdatathenre-store;
读入数据重新存储
stm7h,ar3;
令辅助寄存器ar3的初值为07h
stm1000h,ar1;
重新将立即数1000h送入辅助寄存器ar1
stm1008h,ar2;
将立即数1008h送入辅助寄存器ar2
loop:
;
进入循环
ld*ar1+,t;
将辅助寄存器ar1的值0xaaaah存入T寄存器中,且ar1的地址加1
stt,*ar2+;
将T寄存器内容0xaaaah存入辅助寄存器ar2,并且ar2的地址加1
banzloop,*ar3-;
寄存器ar3的值不为0时,执行循环loop,ar3的地址值减1直至为0时退出循环
here:
bhere
.end;
结束(地址0x1000--0x100F,程序完成对16个内存单元赋值)
1.用“View”下拉菜单中的“Memory”查看内存单元;
2.输入要查看的内存单元地址,本实验要查看0x1000H~0x100FH单元的数值变化,输入地址0x1000H;
3.查看0x1000H~0x100FH单元的初始值,单击“Run”运行程序,也可以“单步”运行程序;
4.单击“Halt”暂停程序运行;
5.查看0x1000H~0x100FH单元内数值的变化;
6.关闭各窗口,本实验完毕。
实验三:
I/O实验
.text
stm3100h,sp
stm1000h,ar1;
指定地址
portr00h,*ar1;
读入开关状态,并存入辅助寄存器ar1中
portw*ar1,01h;
将辅助寄存器ar1的内容即开关的状态写入到LED灯上
b_main;
循环执行
.end
任意调整K0~K7开关,可以观察到对应LP0~LP7灯“亮”或“灭”;
单击“Halt”,暂停持续运行,开关将对灯失去控制。
关闭所有窗口,本实验完毕。
实验四:
定时器实验
定时器实验时要用到C54芯片的定时器控制寄存器,定时器时间常数寄存器,定时器中断响应,寄存器定义详见C54芯片资料。
C54的定时器是一个20位的减法计数器,可以被特定的状态位实现停止、重新启动、重设置或禁止,可以使用该定时器产生周期性的CPU中断,控制定时器中断频率的两个寄存器是定时周期寄存器PRD和定时减法寄存器TDDR
定时器实验通过LED(LP1~LP7)来显示。
在本系统中,时钟频率为20MHZ,令PRD=0x4e1f,这样得到每1/1000秒中断一次,通过累计1000次,就能定时1秒钟。
【初始化程序】
.mmregs
.global_initial
_initial:
stm300h,ar1;
初始化300h数据地址
st#00h,*ar1;
辅助寄存器ar1指向#00h
stm302h,ar1;
初始化302h数据地址
st#00h,*ar1
stm200h,ar1
st#5555h,*ar1
stm201h,ar1
st#0aaaah,*ar1
stm202h,ar1
st#400h,*ar1
ssbx1,11;
将ST1.INTM置为1,停止所有中断
stm0ffffh,ifr;
清除所有中断标识ifr:
中断标志寄存器
stm00h,imr;
将立即数寄存器置为0,停止所有中断
stm410h,tcr;
停止计时器tcr:
发送控制寄存器
stm4e1fh,prd;
将初始时间设为4e1fh
stm420h,tcr;
开始计时器
stm08h,imr;
允许计时器中断
rsbx1,11;
将ST1.INTM置为0,开始所有中断
【端口程序】
.global_porta
.global_portb
_porta:
stm304h,ar1
st5555h,*ar1;
辅助寄存器ar1指向5555h
portw*ar1,01h
_portb:
stm304h,ar1
st0aaaah,*ar1;
辅助寄存器ar1指向0aaaah
【向量程序】
.sect"
.vectors"
.ref_c_int00;
C程序入口
.ref_timer;
时间中断点
.align0x80;
必须被连结到页边界
RESET:
;
重设向量
BD_c_int00;
到C入口点的分支
STM#200,SP;
堆栈大小为200SP:
堆栈寄存器
nmi:
RETE;
启动中断并从一个返回
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
int1:
NOP
int2:
tint:
b_timer
rint0:
xint0:
rint1:
xint1:
int3:
1.单击“Run”运行,可观察到LED灯(LP0~LP7)以一定的间隔时间不停摆动;
2.单击“Halt”,暂停程序运行,LED灯停止闪烁;
3.单击“Run”,运行程序,LED灯又开始闪烁;
4.关闭所有窗口,本实验完毕。
实验五:
INT2中断实验
本实验是进行C54芯片的INT2中断练习,C54芯片中断INT2是低电平单脉冲触发;
实验采用导线一端连接D_Exp—数字量输入扩展接口I0,经PX4的IN3,到PX5的OUT0电平转换,再与另一端连接INT2插孔;
拨动开关K0一次,就产生一个低电平单脉冲;
运行示范程序,观察LP1~LP7LED灯的输出变化;
可观察到每拨动开关K0一次LP1~LP7灯亮灭变化一次;
.global_initial
.text
stm300h,ar3;
初始化数据300har3:
辅助寄存器
st#00h,*ar3
stm302h,ar4;
初始化数据300har4:
st#00h,*ar4
将st1.intm置为1,停止所有中断
stm00h,imr;
停止所有中断imr:
立即数寄存器
清除所有中断标志ifr:
stm04h,imr;
允许int2中断
rsbx1,11;
允许所有中断
ret
【端口程序】跟【向量程序】与实验四的相同,在此不再重复。
1.单击“Run”运行程序,反复拨动开关K0,观察LP1~LP7LED灯亮灭变化;
2.单击“Halt”暂停程序运行,反复拨动开关K0,LP1~LP7LED灯亮灭不变化;
3.关闭所有窗口,本实验完毕。
实验六:
A/D采样实验
一、实验目的
1.掌握利用TLV320AD50实现A/D转换的技术基本原理和常用方法。
2.学会DSP的多信道缓冲串口的应用方法。
3.掌握并熟练使用DSP和AD50的接口及其操作。
4.通过实验加深对DSP系统频谱混叠认识。
二、实验设备
计算机,CCS2.0软件,DSP仿真器,实验箱,示波器,连接导线。
三、实验步骤和内容
1.实验连线
✧用短接块短接SS1的1,2脚,设置输出低频信号;
短接S2的Sin脚,设置输出正弦波信号,这时模拟信号产生单元SP1输出为低频正弦波。
✧JD跳线断开,设置语音处理单元输入信号为交流;
并用导线连接SP1脚和JAD3的1脚,将模拟低频正弦波信号接入语音处理单元。
✧用导线连接JAD1的INP和INPF,以及JAD2的INM和INMF,将语音处理单元输出的差动模拟信号接入AD50输入端。
2.运行CCS2.0软件,装入“exp06.pjt”工程文件,双击“exp06.pjt”及“Source”,打开各源程序;
并阅读程序,明确多通道串口和AD50初始化程序,DSP串口采样程序使用。
3.加载“exp06.out”示范程序,在“exp06.c”中“READAD50()”处,设置断点,运行程序,通过用下拉菜单中的View/Graph的“Time/Frequency”打开一个图形观察窗口;
调节输入信号的频率或幅值,观察图形情况(幅值和频率);
单击“Animate”运行程序,在图形观察窗口观察A/D转换后的采样波形;
调节输入信号的频率或幅值,做同样的采样实验,观察采样结果。
4.调节输入信号的频率或幅值,观察输入频率大于采样频率1/2时波形图形时,认识频谱混叠现象。
5.Halt”暂停程序运行,
6.“View”的下拉菜单中“Memory”打开内存资料观察窗口,设置该内存资料观察窗口的参数,运行“Animate”程序,通过内存观察窗口,观察数据存储器中的采样数值变化。
用“View”的下拉菜单中“Memory”打开内存资料观察窗口。
设置该内存资料观察窗口的参数,选择地址为0x1000H,资料格式C格式16进制数;
单击“Animate”运行程序,调整内存资料观察窗口,并在该窗口中观察资料变化,A/D转换后的资料存储在地址为0x1000~0x10FFH单元内,变化资料将变为红色;
单击“Halt”停止程序运行;
C程序:
externvoidInitC5402(void);
/*创建初始化C5402的函数,返回值为空*/
externvoidOpenMcBSP(void);
/*创建打开McBSP端口的函数,返回值为空;
*/
externvoidCloseMcBSP(void);
/*创建关闭McBSP端口函数*/
externvoidREADAD50(void);
/*创建从AD50的数据流中读取数据的函数;
AD50:
硬件端口*/
voidmain(void)/*主函数开始*/
{
InitC5402();
/*初始化C5402DSP*/
OpenMcBSP();
/*调用函数,打开McBSP端口*/
while
(1)
READAD50();
/*从AD50的数据流中读取数据,完成AD转换*/
}
}
汇编程序代码(含注释):
.global_InitC5402;
全局符号定义_InitC5402(初始化C5402)
.global_OpenMcBSP;
全局符号定义_OpenMcBSP(打开McBSP)
.global_CloseMcBSP;
全局符号定义_CLoseMcBSP(关闭McBSP)
.global_READAD50;
全局符号定义_READAD50(读取AD50数据流)
.global_WRITEAD50;
全局符号定义_WRITEAD50(向AD50写入数据流)
.includeMMRegs.h;
引入头文件MMRegs.h
_InitC5402:
NOPa
LD#0,DP;
重置数据存储器页指针
STM#0,CLKMD;
对DSP时钟进行软件设置
(在设置之前转到分线规模式)
STM#0x4007,CLKMD;
将C5402DSP时钟设置到40Hz
*******ConfigureC5402SystemRegisters;
(配置C5402系统寄存器)*******
STM#0x2000,SWWSR;
为IO空间设置两个等待周期
SWWSR:
外部总线S/W等待状态寄存器
为数据和监督空间设置0个等待周期
STM#0x0000,BSCR;
为堆栈转换寄存器设置等待状态
BSCR:
外部总线块转换控制寄存器
堆栈空间为64k,之间没有多余的循环
连续的监督/数据读取
STM#0x1800,ST0;
为状态寄存器0进行预设值
STM#0x2900,ST1;
为状态寄存器1进行预设值(note:
INTX=1)
STM#0x00A0,PMST;
PMST:
处理器方式状态寄存器
;
OVLY=1,向量指向0080h
*******SetupTimerControlRegisters;
(设置时钟控制寄存器)*******
STM#0x0010,TCR;
停止on–chip计时TCR定时器控制寄存器
计时器0用作主循环的计时器
*******InitializeMcBSP2Registers;
(初始化McBSP2(用来创建设备配置)寄存器)*******
STMSPCR1,McBSP2_SPSA;
设置SPCR1的寄存器地址
STM#0000h,McBSP2_SPSD;
McBSP2recv=left–justify
通过框架同步产生接受中断
STMSPCR2,McBSP2_SPSA;
设置SPCR2的寄存器地址
通过框架同步产生传输中断
STM#0000h,McBSP2_SPSD;
McBSP2Tx(异步传输)
在SW断点之后运行
STMRCR1,McBSP2_SPSA;
设置RCR1的寄存器地址
RCR1:
接收控制寄存器
STM#0040h,McBSP2_SPSD;
接收框架1长度=16bits
STMRCR2,McBSP2_SPSA;
设置RCR2的寄存器地址
接收相位=1
设置框架2长度为16bits
STMXCR1,McBSP2_SPSA;
设置XCR1的寄存器地址
设置与接收(recv)相同
STMXCR2,McBSP2_SPSA;
设置XCR2的寄存器地址
STMPCR,McBSP2_SPSA;
设置PCR的寄存器地址
STM#000eh,McBSP2_SPSD;
时钟和框架从外部产生(slave)
*******FinishDSPInitialization;
(结束DSP初始化)*******
STM#0x0000,IMR;
关闭外围中断
STM#0xFFFF,IFR;
清除中断的标志
RET;
返回主程序
*******WaitingforMcBSP0RXFinished;
(等待McBSP0异步接收结束)*******
IfRxRDY1:
启动McBSP2Rx
LDMMcBSP2_SPSD,A
AND#0002h,A;
隐藏已经接受到的bit(可以用来代替系列端口中断)
BCIfRxRDY1,AEQ;
继续寄存(checking)
返回
*******WaitingforMcBSP0TXFinished;
(等待McBSP0异步传输结束)*******
IfTxRDY1:
STMSPCR2,McBSP2_SPSA;
启动McBSP2Tx
隐藏已经传输的bit
BCIfTxRDY1,AEQ;
继续寄存
******************************************
_OpenMcBSP:
rsbxxf;
寄存器xf复位为0
callwait;
非条件调用等待状态
启动McBSP0RX以读入AD数据
LDMMcBSP2_SPSD,A
OR#0x0001,A
STLMA,McBSP2_SPSD;
隐藏已经接受到的bit
启动McBSP0TX以DTMF输出
OR#0x0001,A
隐藏已经输出的bit
LD#0h,DP;
装载数据页0
rpt#23;
ssbxxf;
寄存器xf置位为1
CALLIfTxRDY1;
非条件调用IfTxRDY1
STM#0x0001,McBSP2_DXR1;
请求二级传送
非条件调用IfTxRDY1
STM#0100h,McBSP2_DXR1;
将00h写入到寄存器1
CALLIfTxRDY1;
非条件调用IfTxRDY1
STM#0000h,McBSP2_DXR1;
rpt#20h
STM#0200h,McBSP2_DXR1;
将00h写入到寄存器2
CALLIfTxRDY1
STM#0000h,McBSP2_DXR1
CALLIfTxRDY1
CALLIfTxRDY1
STM#0300h,McBSP2_DXR1;
将00h写入到寄存器3
STM#0000h,McBSP2_DXR1
STM#0490h,McBSP2_DXR1;
将00h写入到寄存器4
;
通过内部DPLLbypassinternalDPLL
并且选择抽样频率andselecttheSampleFrequency
RET
*********************
_CloseMcBSP:
关闭McBSP0RX
AND#0xFFFE,A
STLMA,McBSP2_SPSD
关闭McBSP0TX
RPT#5
_READAD50:
stm0x00ff,ar3
stm0x1000,ar2