DSP硬件报告.docx
- 文档编号:24900324
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:40
- 大小:184.91KB
DSP硬件报告.docx
《DSP硬件报告.docx》由会员分享,可在线阅读,更多相关《DSP硬件报告.docx(40页珍藏版)》请在冰豆网上搜索。
DSP硬件报告
北京邮电大学
DSP硬件实验报告
实验一常用指令实验
实验
(一):
简单指令程序运行实验
代码
exp01.asm:
;FileName:
exp01.asm
;theprogramiscompiledatnoautoinitializationmode
.mmregs
.global_main
_main:
stm#3000h,sp;堆栈指针的首地址设为#3000h
ssbxxf;状态寄存器位置位,灯亮
calldelay;调用delay函数延时
rsbxxf;状态寄存器位复位,灯灭
calldelay;调用delay函数延时
b_main;可选择延迟的无条件转移,循环执行
nop;无任何操作
nop
;delay.5second
delay:
;演示0.5秒
stm270fh,ar3;把地址存放到存储器映射寄存器中
loop1:
stm0f9h,ar4;把地址存放到存储器映射寄存器中
loop2:
banzloop2,*ar4-;AR4不为0时转移,指针地址减一
banzloop1,*ar3-;若不为0,ar3减1,共进行10000*250次跳转ret;return,返回
nop;nooperation
nop
;stm2cycles
;banzwhenTRUE4cycles
;FALSE2cycles
;0f9h=>249d
;270fh=>9999d
.end
实验现象
可以看到实验箱上的XF灯以一定的频率闪烁,当单击“Halt”时程序暂定,XF灯停止闪烁,当再次单击RUN时,XF灯又开始闪烁。
实验
(二):
资料存储实验
代码
Exp02.asm:
*FileName:
exp02.asm
;getsomeknowledgeofthecmdfile
;theprogramiscompiledatnoautoinitializationmode
.mmregs
.global_main
_main:
;主函数
;storedat;存储数据
stm1000h,ar1;ar1映射到内存1000h位
;stm5000h,ar1;addressofexteriormemory
rpt#07h;循环执行下一条指令7次
st0aaaah,*ar1+;data存储寄存器的值
;readdatathenre-store
stm7h,ar3;设置ar3
;stm5000h,ar1;addressofexteriormemory
;stm5008h,ar2;addressofexteriormemory
stm1000h,ar1;设置ar1为1000h
stm1008h,ar2;设置ar2为1008h
loop:
ld*ar1+,t;把单数据存储操作数装入T寄存器中
stt,*ar2+;存储T寄存器的值
banzloop,*ar3-;循环7次
here:
bhere;可选择延迟的无条件转移,循环执行
.end
实验现象
在CCS的“View”下拉菜单中的Memory窗口中查找C5410各个区段的数据存储器地址,在可以改变的存储器内容的地方,选定地址随意改变其中内容并观察结果;本实验要查看0x1000H~0x100FH单元的数值变化,输入地址0x1000H;查看0x1000H~0x100FH单元的初始值,单击“Run”运行程序,也可以“单步”运行程序;单击“Halt”暂停程序运行。
实验(三):
I/O实验
代码
Exp03.asm:
;FileName:
exp03.asm
;learnhowtooperatetheI/Oports
;getsomeknowledgeoftherts.libfile
;intheI/Ospace0x0000=>8switches
;0x0001=>8LEDs
.mmregs
.global_main
.text
_main:
;主函数
stm3100h,sp;堆栈指针的首地址设为#3100h
stm1000h,ar1;definetheaddress,定义ar1的地址
portr00h,*ar1;从端口把数据读到数据存储单元中
nop;nooperation
nop
portw*ar1,01h;ar1里的数据输入到01h,控制等的亮灭
nop
nop
b_main;寻循环执行
nop
nop
.end
实验现象
任意调整K0—K7开关,可以观察到对应LP0—LP7灯“亮”或“灭”;单击“Halt”,暂停持续运行,开关将对灯失去控制。
实验(四):
定时器实验
定时器实验时要用到C54芯片的定时器控制寄存器,定时器时间常数寄存器,定时器中断响应,寄存器定义详见C54芯片资料。
C54的定时器是一个20位的减法计数器,可以被特定的状态位实现停止、重新启动、重设置或禁止,可以使用该定时器产生周期性的CPU中断,控制定时器中断频率的两个寄存器是定时周期寄存器PRD和定时减法寄存器TDDR。
定时器实验通过LED(LP1~LP7)来显示。
在本系统中,时钟频率为20MHZ,令PRD=0x4e1f,这样得到每1/1000秒中断一次,通过累计1000次,就能定时1秒钟。
代码
Exp04.c:
#include
interruptvoidtimer();
/*externvoidtime();*/
externvoidinitial();
externvoidporta();
externvoidportb();
intflag=0;
interruptvoidtimer()
{
*(int*)0x300=*(int*)0x300+1;
if(*(int*)0x300==0x3e8)
{
*(int*)0x300=0;
*(int*)0x302=*(int*)0x302+1;
if(flag==0)
{flag=1;
porta();
}
else
{flag=0;
portb();
}
}
return;
}
main()
{
initial();
while
(1){;}
}
Initial.asm:
.mmregs
.global_initial
_initial:
stm300h,ar1;初始化300h数据地址,设置ar1的地址
st#00h,*ar1;辅助寄存器ar1指向#00h
stm302h,ar1;初始化302h数据地址,设置ar2的地址
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,开始所有中断
ret
port.asm:
.mmregs
.global_porta
.global_portb
_porta:
stm304h,ar1;设置ar1地址
st5555h,*ar1;辅助寄存器ar1指向5555h
portw*ar1,01h;ar1的值做输出控制小灯亮灭
ret
_portb:
stm304h,ar1;设置ar1地址
st0aaaah,*ar1;辅助寄存器ar1指向0aaaah
portw*ar1,01h;ar1的值控制亮灭
ret
vectors.asm:
.sect".vectors"
.ref_c_int00;C程序入口
.ref_timer;时间中断点
.align0x80;必须被连结到页边界
RESET:
;重设向量
BD_c_int00;到C入口点的分支
STM#200,SP;堆栈大小为200SP:
堆栈寄存器
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;设置实用time中断
NOP
NOP
rint0:
RETE
NOP
NOP
NOP
xint0:
RETE
NOP
NOP
NOP
rint1:
RETE
NOP
NOP
NOP
xint1:
RETE
NOP
NOP
NOP
int3:
RETE
NOP
NOP
NOP
.end
实验现象
单击“Run”运行,可观察到LED灯(LP0—LP7)以一定的间隔时间不停摆动;单击“Halt”,暂停程序运行,LED灯停止闪烁;.单击“Halt”,暂停程序运行,LED灯停止闪烁。
实验(五):
INT2中断实验
本实验是进行C54芯片的INT2中断练习,C54芯片中断INT2是低电平单脉冲触发;实验采用导线一端连接D_Exp—数字量输入扩展接口I0,经PX4的IN3,到PX5的OUT0电平转换,再与另一端连接INT2插孔;拨动开关K0一次,就产生一个低电平单脉冲;运行示范程序,观察LP1~LP7LED灯的输出变化;可观察到每拨动开关K0一次LP1~LP7灯亮灭变化一次。
代码
Int2.c:
interruptvoidint2c();
externvoidinitial();
externvoidporta();
externvoidportb();
intflag=0;
main()
{
initial();
while
(1){;}
}
interruptvoidint2c()
{
asm("nop");
*(int*)0x300=*(int*)0x300+2;/*breakheretoshowifinterrupthappened*/
if(flag==0)
{
flag=1;
porta();
}
else
{
flag=0;
portb();
}
}
Initial.asm:
.mmregs
.global_initial
.text
_initial:
stm300h,ar3;初始化数据300har3:
辅助寄存器
st#00h,*ar3
stm302h,ar4;初始化数据300har4:
辅助寄存器
st#00h,*ar4
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:
stm304h,ar1
st5555h,*ar1
portw*ar1,01h
ret
_portb:
stm304h,ar1
st0aaaah,*ar1
portw*ar1,01h
ret
vectors.asm:
.sect".vectors"
.ref_c_int00;Centrypoint
.ref_int2c
.align0x80;mustbealignedonpageboundary
RESET:
;resetvector
BD_c_int00;branchtoCentrypoint
STM#200,SP;stacksizeof200
nmi:
RETE;enableinterruptsandreturnfromone
NOP
NOP
NOP;NMI~
;softwareinterrupts
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:
b_int2c
NOP
NOP
tint:
RETE
NOP
NOP
NOP
rint0:
RETE
NOP
NOP
NOP
xint0:
RETE
NOP
NOP
NOP
rint1:
RETE
NOP
NOP
NOP
xint1:
RETE
NOP
NOP
NOP
int3:
RETE
NOP
NOP
NOP
实验现象
单击“Run”运行程序,反复拨动开关K0,观察LP1—LP7LED灯亮灭变化;单击“Halt”暂停程序运行,反复拨动开关K0,LP1—LP7LED灯亮灭不发生变化。
实验二:
A/D采样实验
代码
Exp06.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转换*/
}}
InitC5402.asm:
.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:
NOP
LD#0,DP;重置数据存储器页指针
STM#0,CLKMD;对DSP时钟进行软件设置
STM#0,CLKMD;(在设置之前转到分线规模式)
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的寄存器地址
STM#0040h,McBSP2_SPSD;接收相位=1;设置框架2长度为16bits
STMXCR1,McBSP2_SPSA;设置XCR1的寄存器地址
STM#0040h,McBSP2_SPSD;设置与接收(recv)相同
STMXCR2,McBSP2_SPSA;设置XCR2的寄存器地址
STM#0040h,McBSP2_SPSD;设置与接收(recv)相同
STMPCR,McBSP2_SPSA;设置PCR的寄存器地址
STM#000eh,McBSP2_SPSD;时钟和框架从外部产生(slave)
*******FinishDSPInitialization*******;(结束DSP初始化)
STM#0x0000,IMR;关闭外围中断
STM#0xFFFF,IFR;清除中断的标志
RET;返回主程序
NOP
NOP
*******WaitingforMcBSP0RXFinished*******;(等待McBSP0异步接收结束)
IfRxRDY1:
NOP
STMSPCR1,McBSP2_SPSA;启动McBSP2Rx
LDMMcBSP2_SPSD,A
AND#0002h,A;隐藏已经接受到的bit(可以用来代替系列端口中断)
BCIfRxRDY1,AEQ;继续寄存(checking)
NOP
NOP
RET;返回
NOP
NOP
*******WaitingforMcBSP0TXFinished*******;(等待McBSP0异步传输结束)
IfTxRDY1:
NOP
STMSPCR2,McBSP2_SPSA;启动McBSP2Tx
LDMMcBSP2_SPSD,A
AND#0002h,A;隐藏已经传输的bit
BCIfTxRDY1,AEQ;继续寄存
NOP
NOP
RET;返回
NOP
NOP
******************************************
_OpenMcBSP:
rsbxxf;寄存器xf复位为0
callwait;非条件调用等待状态
NOP
STMSPCR1,McBSP2_SPSA;启动McBSP0RX以读入AD数据
LDMMcBSP2_SPSD,A
OR#0x0001,A
STLMA,McBSP2_SPSD;隐藏已经接受到的bit
STMSPCR2,McBSP2_SPSA;启动McBSP0TX以DTMF输出
LDMMcBSP2_SPSD,A
OR#0x0001,A
STLMA,McBSP2_SPSD;隐藏已经输出的bit
LD#0h,DP;装载数据页0
rpt#23;循环执行
NOP
ssbxxf;寄存器xf置位为1
NOP
NOP
CALLIfTxRDY1;非条件调用IfTxRDY1
STM#0x0001,McBSP2_DXR1;请求二级传送
NOP
CALLIfTxRDY1;非条件调用IfTxRDY1
STM#0100h,McBSP2_DXR1;将00h写入到寄存器1
CALLIfTxRDY1;非条件调用IfTxRDY1
STM#0000
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP 硬件 报告