dsp实验注释
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
dsp实验注释
实验一:简单指令程序运行实验
代码(含注释):
.mmregs
.global _main
_main:
stm #3000h,sp ;sp为堆栈指针寄存器,stm为存储器映射寄存器寻址
ssbx xf ;xf赋值为1,灯亮
call delay ;调用delay函数,延迟0.5秒
rsbx xf ;xf赋值为0,灯灭
call delay ;调用delay函数
b _main ;无条件调用_main函数
nop
nop
;delay .5 second ;延时5秒
delay:
stm 270fh,ar3 ;ar3赋值207fh,十进制为9999d
loop1:
stm 0f9h,ar4 ;ar4赋值0f9h,十进制为249d
loop2:
banz loop2,*ar4- ;若不为0,ar4减1
banz loop1,*ar3- ;若不为0,ar3减1,共进行10000*250次跳转
ret
nop
nop
.end
实验操作:
可见XF灯以一定频率闪烁;单击“Halt”暂停程序运行,则XF 灯停止闪烁,如再单击“Run”,则“XF”灯又开始闪烁。
实验二:资料存储实验
本实验程序将对0x1000开始的8个地址空间,填写入0xAAAA 的数值,然后读出,并存储到0X1008开始的8个地址空间。
在CCS 中可以观察DATA内存空间地址
0X1000~0X100F值的变化。
代码(含注释):
.mmregs
.global _main
_main:
;store data ;存储数据
stm 1000h,ar1 ;将立即数1000h送入辅助寄存器ar1 (内存地址) rpt #07h ;循环执行下一条指令,8次
st 0aaaah,*ar1+ ;将立即数0xaaaah赋给辅助寄存器ar1的1000h地址内,;之后ar1的地址加1,8次;ar1的地址变1008,内存0x1000-- ox1007中的数据均为0xaaaah
;read data then re-store ;读入数据重新存储
stm 7h,ar3 ;令辅助寄存器ar3的初值为07h
stm 1000h,ar1 ;重新将立即数1000h送入辅助寄存器ar1
stm 1008h,ar2 ;将立即数1008h送入辅助寄存器ar2
loop: ;进入循环
ld *ar1+,t ;将辅助寄存器ar1的值0xaaaah存入T寄存器中,且ar1的地址加1 st t,*ar2+ ;将T寄存器内容0xaaaah存入辅助寄存器ar2 ,并且ar2的地址加1 banz l oop,*ar3- ;寄存器ar3的值不为0时,执行循环loop,ar3的地址值减1直至为0时退出循环here:
b here
.end ;结束(地址0x1000-- 0x100F,程序完成对16个内存单元赋值)
实验操作:
1.用“View”下拉菜单中的“Memory”查看内存单元;
2.输入要查看的内存单元地址,本实验要查看0x1000H~0x100FH单元的数值变化,输入地址0x1000H;
3.查看0x1000H~0x100FH单元的初始值,单击“Run”运行程序,也可以“单步”运行程序;
4.单击“Halt”暂停程序运行;
5.查看0x1000H~0x100FH单元内数值的变化;
6.关闭各窗口,本实验完毕。
实验三:I/O实验
代码(含注释):
.mmregs
.global _main
.text
_main:
stm 3100h,sp
stm 1000h,ar1 ;指定地址
portr 00h,*ar1 ;读入开关状态,并存入辅助寄存器ar1中
nop
nop
portw *ar1,01h ;将辅助寄存器ar1的内容即开关的状态写入到LED灯上
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秒钟。
代码(含注释):
【初始化程序】
.mmregs
.global _initial
_initial:
stm 300h,ar1 ;初始化300h 数据地址
st #00h,*ar1 ;辅助寄存器ar1指向#00h
stm 302h,ar1 ;初始化302h 数据地址
st #00h,*ar1
stm 200h,ar1
st #5555h,*ar1
stm 201h,ar1
st #0aaaah,*ar1
stm 202h,ar1
st #400h,*ar1
ssbx 1,11 ;将ST1.INTM置为1,停止所有中断
stm 0ffffh,ifr ;清除所有中断标识ifr:中断标志寄存器
stm 00h,imr ;将立即数寄存器置为0,停止所有中断
stm 410h,tcr ;停止计时器tcr:发送控制寄存器
stm 4e1fh,prd ;将初始时间设为4e1fh
stm 420h,tcr ;开始计时器
stm 08h,imr ;允许计时器中断
rsbx 1,11 ;将ST1.INTM置为0,开始所有中断
ret
【端口程序】
.mmregs
.global _porta
.global _portb
_porta:
stm 304h,ar1
st 5555h,*ar1 ;辅助寄存器ar1指向5555h
portw *ar1,01h
ret
_portb:
stm 304h,ar1
st 0aaaah,*ar1 ;辅助寄存器ar1指向0aaaah
portw *ar1,01h
ret
【向量程序】
.sect ".vectors"
.ref _c_int00 ;C程序入口
.ref _timer ;时间中断点
.align 0x80 ; 必须被连结到页边界
RESET: ; 重设向量
BD _c_int00 ;到C入口点的分支
STM #200,SP ;堆栈大小为200 SP:堆栈寄存器nmi: RETE ;启动中断并从一个返回
NOP
NOP
NOP
; 软件中断
sint17 .space 4*16 sint18 .space 4*16 sint19 .space 4*16 sint20 .space 4*16 sint21 .space 4*16 sint22 .space 4*16 sint23 .space 4*16 sint24 .space 4*16 sint25 .space 4*16 sint26 .space 4*16 sint27 .space 4*16 sint28 .space 4*16 sint29 .space 4*16 sint30 .space 4*16 int0: RETE
NOP
NOP
NOP int1: RETE NOP
NOP
NOP int2: RETE NOP
NOP
NOP tint: b _timer 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
实验操作:
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~LP7 LED灯的输出变化;可观察到每拨动开关K0一次LP1~LP7灯亮灭变化一次;
代码(含注释):
【初始化程序】
.mmregs
.global _initial
.text
_initial:
stm 300h,ar3 ;初始化数据300h ar3:辅助寄存器
st #00h,*ar3
stm 302h,ar4 ;初始化数据300h ar4:辅助寄存器
st #00h,*ar4
ssbx 1,11 ;将st1.intm置为1,停止所有中断
stm 00h,imr ;停止所有中断imr:立即数寄存器
stm 0ffffh,ifr ;清除所有中断标志ifr:中断标志寄存器
stm 04h,imr ;允许int2 中断
rsbx 1,11 ;允许所有中断
ret
.end
【端口程序】跟【向量程序】与实验四的相同,在此不再重复。
实验操作:
1.单击“Run”运行程序,反复拨动开关K0,观察LP1~LP7 LED 灯亮灭变化;
2.单击“Halt”暂停程序运行,反复拨动开关K0,LP1~LP7 LED 灯亮灭不变化;
3.关闭所有窗口,本实验完毕。
实验六:A/D采样实验
一、实验目的
1.掌握利用TLV320AD50实现A/D转换的技术基本原理和常用方法。
2.学会DSP的多信道缓冲串口的应用方法。
3.掌握并熟练使用DSP和AD50的接口及其操作。
4.通过实验加深对DSP系统频谱混叠认识。
二、实验设备
计算机,CCS 2.0软件,DSP仿真器,实验箱,示波器,连接导
线。
三、实验步骤和内容
1.实验连线
用短接块短接SS1的1,2脚,设置输出低频信号;短接S2 的Sin脚,设置输出
正弦波信号,这时模拟信号产生单元SP1输出为低频正弦波。
JD跳线断开,设置语音处理单元输入信号为交流;并用导线连接SP1脚和JAD3的1
脚,将模拟低频正弦波信号接入语音处理单元。
用导线连接JAD1的INP和INPF,以及JAD2的INM和INMF,将语音处理单元输出的
差动模拟信号接入AD50输入端。
2.运行CCS 2.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. Ha lt”暂停程序运行,
6. “View”的下拉菜单中“Memory”打开内存资料观察窗口,设置该内存资料观察窗
口的参数,运行“Animate”程序,通过内存观察窗口,观察数
据存储器中的采样数值变化。
用“View”的下拉菜单中“Memory”打开内存资料观察窗口。
设置该内存资料观察窗口的参数,选择地址为0x1000H,资料格式C格式16进制数;
单击“Animate”运行程序,调整内存资料观察窗口,并在该窗口中观察资料变化,A/D转换后的资料存储在地址为0x1000~0x10FFH单元内,变化资料将变为红色;
单击“Halt”停止程序运行;
C程序:
extern void InitC5402(void); /*创建初始化C5402的函数,返回值为空*/
extern void OpenMcBSP(void); /*创建打开McBSP端口的函数,返回值为空;*/
extern void CloseMcBSP(void); /*创建关闭McBSP端口函数*/ extern void READAD50(void); /*创建从AD50的数据流中读取数据的函数;AD50:硬件端口*/
void main(void) /*主函数开始*/
{
InitC5402(); /* 初始化C5402 DSP */
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写入数据流)
.include MMRegs.h ;引入头文件MMRegs.h
_InitC5402:
NOPa
LD #0, DP ; 重置数据存储器页指针
STM #0, CLKMD ; 对DSP时钟进行软件设置
STM #0, CLKMD ; (在设置之前转到分线规模式)
STM #0x4007, CLKMD ; 将C5402 DSP时钟设置到40Hz
******* Configure C5402 System Registers ;(配置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
******* Set up Timer Control Registers ;(设置时钟控制寄存器)******* STM #0x0010, TCR ; 停止on–chip计时T C R定时器控制寄存器
; 计时器0用作主循环的计时器
******* Initialize McBSP2 Registers ;(初始化McBSP2 (用来创建设备配置)寄存器)******* STM SPCR1, McBSP2_SPSA ; 设置SPCR1的寄存器地址
STM #0000h, McBSP2_SPSD ; McBSP2 recv = left–justify
; 通过框架同步产生接受中断
STM SPCR2, McBSP2_SPSA ; 设置SPCR2的寄存器地址
; 通过框架同步产生传输中断
STM #0000h, McBSP2_SPSD ; McBSP2 Tx(异步传输)
; 在SW断点之后运行
STM RCR1, McBSP2_SPSA ; 设置RCR1的寄存器地址
;RCR1:接收控制寄存器
STM #0040h, McBSP2_SPSD ; 接收框架1长度=16 bits
STM RCR2, McBSP2_SPSA ; 设置RCR2的寄存器地址
STM #0040h, McBSP2_SPSD ; 接收相位=1
; 设置框架2长度为16bits
STM XCR1, McBSP2_SPSA ; 设置XCR1的寄存器地址
STM #0040h, McBSP2_SPSD ; 设置与接收(recv)相同
STM XCR2, McBSP2_SPSA ; 设置XCR2的寄存器地址
STM #0040h, McBSP2_SPSD ; 设置与接收(recv)相同
STM PCR, McBSP2_SPSA ; 设置PCR的寄存器地址
STM #000eh, McBSP2_SPSD ; 时钟和框架从外部产生(slave)
******* Finish DSP Initialization ;(结束DSP初始化)******* STM #0x0000, IMR ; 关闭外围中断
STM #0xFFFF, IFR ; 清除中断的标志
RET ; 返回主程序
NOP
NOP
******* Waiting for McBSP0 RX Finished ;(等待McBSP0异步接收结束)******* IfRxRDY1:
NOP
STM SPCR1, McBSP2_SPSA ; 启动McBSP2 Rx
LDM McBSP2_SPSD, A
AND #0002h, A ; 隐藏已经接受到的bit(可以用来代替系列端口
中断)BC IfRxRDY1, AEQ ; 继续寄存(checking)
NOP
NOP
RET ; 返回
NOP
NOP
******* Waiting for McBSP0 TX Finished ;(等待McBSP0异步传输结束)******* IfTxRDY1:
NOP
STM SPCR2, McBSP2_SPSA ; 启动McBSP2 Tx
LDM McBSP2_SPSD, A
AND #0002h, A ; 隐藏已经传输的bit
BC IfTxRDY1, AEQ ; 继续寄存
NOP
NOP
RET ; 返回
NOP
NOP
******************************************
******************************************
_OpenMcBSP:
rsbx xf ;寄存器xf复位为0
call wait ;非条件调用等待状态
NOP
STM SPCR1, McBSP2_SPSA ; 启动McBSP0 RX 以读入AD 数据LDM McBSP2_SPSD,A
OR #0x0001, A
STLM A, McBSP2_SPSD ;隐藏已经接受到的bit
STM SPCR2, McBSP2_SPSA ; 启动McBSP0 TX 以DTMF 输出LDM McBSP2_SPSD,A
OR #0x0001, A
STLM A, McBSP2_SPSD ;隐藏已经输出的bit
LD #0h, DP ; 装载数据页0
rpt #23 ;循环执行
NOP
ssbx xf ;寄存器xf置位为1
NOP
NOP
CALL IfTxRDY1 ;非条件调用IfTxRDY1
STM #0x0001, McBSP2_DXR1 ;请求二级传送
NOP
CALL IfTxRDY1 ; 非条件调用IfTxRDY1
STM #0100h, McBSP2_DXR1 ;将00h写入到寄存器1 CALL IfTxRDY1 ;非条件调用IfTxRDY1
STM #0000h, McBSP2_DXR1;
NOP
NOP
rpt #20h
nop
CALL IfTxRDY1 ;非条件调用IfTxRDY1
STM #0x0001, McBSP2_DXR1 ;请求二级传送
CALL IfTxRDY1 ;非条件调用IfTxRDY1
STM #0200h, McBSP2_DXR1 ;将00h写入到寄存器2 CALL IfTxRDY1
STM #0000h, McBSP2_DXR1
CALL IfTxRDY1
STM #0x0001, McBSP2_DXR1 ;请求二级传送
CALL IfTxRDY1
STM #0300h, McBSP2_DXR1 ;将00h写入到寄存器3 CALL IfTxRDY1
STM #0000h, McBSP2_DXR1
CALL IfTxRDY1
STM #0x0001, McBSP2_DXR1 ;请求二级传送
CALL IfTxRDY1
STM #0490h, McBSP2_DXR1 ;将00h写入到寄存器4 ;通过内部DPLL bypass internal DPLL
;并且选择抽样频率and select the Sample Frequency CALL IfTxRDY1
STM #0000h, McBSP2_DXR1
RET
NOP
NOP
*********************
_CloseMcBSP:
STM SPCR1, McBSP2_SPSA ; 关闭McBSP0 RX LDM McBSP2_SPSD,A
AND #0xFFFE, A
STLM A, McBSP2_SPSD
STM SPCR2, McBSP2_SPSA ; 关闭McBSP0 TX LDM McBSP2_SPSD,A
AND #0xFFFE, A
STLM A, McBSP2_SPSD
RPT #5
NOP
NOP
_READAD50:
stm 0x00ff,ar3
stm 0x1000,ar2
loopa:
CALL IfRxRDY1
ldm McBSP2_DRR1,b
stl b,*ar2+
banz loopa,*ar3-
nop
nop
ret
nop
nop
_WRITEAD50:
stm 0x037b,ar3
stm 0x38a3,ar2
loopb:
CALL IfTxRDY1
ldu *ar2+,B
and #0fffeh,b ;mask the LSB stlm B, McBSP2_DXR1 banz l oopb,*ar3-
nop
nop
ret
nop
nop
wait:
stm 20h,ar3
loop1:
stm 020h,ar4
loop2:
banz loop2,*ar4-
banz loop1,*ar3-
ret
nop
nop
nop
.end
*************************************************************** *********
** End of File –– InitC5402.asm
*************************************************************** *******
实验七:D/A转换实验
一、实验目的
3.掌握利用TLV320AD50实现D/A转换的技术基本原理和常用方法。
4.进一步学习DSP的多信道缓冲串口的应用方法。
5.掌握并熟练使用DSP和AD50的输出接口及其操作。
二、实验设备
计算机,CCS 2.0版软件,DSP仿真器,实验箱,示波器。
三、实验步骤与内容
1.不需联机,通过示波器观测输出波形情况;
2.运行CCS软件,加载示范源程序,了解实验程序;
3.加载示范程序“exp07.out”,并通过File/Data/Load装载波形数据sin.dat。
加载“exp07.out”窗口
由File/Data/Load装载sin.dat窗口
4.按F5运行程序,用示波器检测JAD4的3脚AD50_DAout输出一个正弦波;
5.在程序中,改变相应资料来实现改变波形和周期;
选择地址为0x3000H;
打开一个图形观察窗口,以观察加载实验波形数据波形;
设置观察窗口参数,起始地址为0x3000H,长度为40,16位整
型;
单击“Run”运行程序;用示波器检测JAD4的3脚AD50_DAout 可以看到输出一个正弦波;
关闭所有窗口,本实验完毕。
C程序:
extern void InitC5402(void); /*创建初始化C5402的函数,返回值为空*/
extern void OpenMcBSP(void); /*创建打开McBSP端口的函数,返回值为空;
McBSP:Multichannel Buffered Serial Port 多通道缓冲连续端口基本处理模块,调用open函数来处理一个操作*/
extern void CloseMcBSP(void); /*创建关闭McBSP端口函数*/ extern void WRITEAD50(void);/*创建将数据写入AD50的数据流的函数;AD50:硬件端口*/
void main(void) /*主函数开始*/
{
InitC5402(); /* 初始化C5402 DSP */
OpenMcBSP(); /*调用函数,打开McBSP端口*/
while (1)
{
WRITEAD50(); /*将数据写入AD50的数据流,完成AD转换*/
}
}
汇编程序与实验六的相同,在此不再重复。
【实验心得】
通过此次DSP硬件实验,自己第一次近距离接触汇编程序。
实验的主要任务就是读懂一些相对简单的汇编程序,而没有要求自己编程序。
但是对于我们这些从没接触过汇编程序的人来说,仅仅是看懂程序也不是一件特别简单的任务。
虽然在实验过程中遇到了许多困难,但最终这些问题在老师与同学
的帮助下,自己研究得到了解决。
通过这几节课的学习,锻炼了自己的实验能力,也大大地加强了自己对DSP以及微机原理等课程的认识,初步了解了汇编程序的运行过程以及一些必要的元件。
这是我们以后学习和工作过程中最需要的。