DSP硬件实验报告-北邮.doc
北京邮电大学DSP硬件实验报告 学 院: 电子工程学院 专 业: 姓 名: 学 号: 班 级:实验一 常用指令实验一、 实验目的熟悉DSP开发系统的连接了解DSP开发系统的组成和结构和应用系统构成熟悉常用C54X系列指令的用法(程序寻址,寄存器,I/O口,定时器,中断控制)。二、实验步骤与内容(一)简单指令程序运行实验源程序:;File Name:exp01.asm;the program is compiled at no autoinitialization mode -程序在非自动初始化模式下编译.mmregs -(enter memory-mapped registers into the symbol table) -进入记忆映射注册进入符号表.global _main -(identify one or more global(external)symbols) -定义一个或多个全局变量_main: stm(累加器的低端存放到存储器映射寄存器中) #3000h,sp(堆栈指针寄存器);堆栈指针的首地址设为#3000hssbx(状态寄存器位置位)xf ;状态寄存器位置位,灯亮call (非条件调用,可选择延迟)delay(存储器延时) ;调用delay函数延时rsbx(状态寄存器复位)xf;状态寄存器位复位,灯灭call delay;调用delay函数延时b (累加器)_main ;可选择延迟的无条件转移,循环执行nop(无操作)nop ;delay .5 seconddelay: ;延迟0.5秒stm 270fh,ar3 (辅助寄存器3);把地址存放到存储器映射寄存器中loop1: stm 0f9h,ar4 (辅助寄存器4);把地址存放到存储器映射寄存器中loop2:banz loop2,*ar4-;AR4不为0时转移,指针地址减一banz loop1,*ar3-; 若不为0,ar3减1,共进行10000*250次跳转ret (可选择延迟的返回 pc=sp+);return,返回nopnop;stm2 cycles;banzwhen TRUE 4 cycles; FALSE 2 cycles;0f9h=>249d;270fh=>9999d.end实验现象XF灯以一定频率闪烁;单击“Halt”暂停程序运行,则XF灯停止闪烁,如再单击“Run”,则“XF”灯又开始闪烁;(二)资料存储实验源程序:*File Name:exp02.asm;get some knowledge of the cmd file;the program is compiled at no autoinitialization mode.mmregs.global _main _main: ;store datastm 1000h,ar1 ;ar1映射到内存1000h位;stm 5000h,ar1 ;address of exterior memoryrpt(循环执行下一条指令,计数为短立即数)#07h;循环执行下一条指令8次 st(存储T寄存器的值)0aaaah,*ar1+ ;data 存储寄存器的值 ;read data then re-store stm 7h,ar3;设置ar3;stm 5000h,ar1 ;address of exterior memory;stm 5008h,ar2 ;address of exterior memorystm1000h,ar1;设置ar1为1000hstm 1008h,ar2;设置ar2为1008hloop:ld*ar1+,t;把单数据存储操作数装入T寄存器中stt,*ar2+;存储T寄存器的值banzloop,*ar3-;循环7次here: b here;可选择延迟的无条件转移,循环执行.end实验目的:;本实验程序将对0x1000开始的8个地址空间,填写入0xAAAA的数值,然后读出,并存储到0X1008开始的8个地址空间。在CCS中可以观察DATA内存空间地址0X10000X100F值的变化。实验现象: 在CCS的“View”下拉菜单中的Memory窗口中查找C5410各个区段的数据存储器地址,在可以改变的存储器内容的地方,选定地址随意改变其中内容并观察结果;本实验要查看0x1000H0x100FH单元的数值变化,输入地址0x1000H;查看0x1000H0x100FH单元的初始值,单击“Run”运行程序,也可以“单步”运行程序;单击“Halt”暂停程序运行。(三):I/O实验源程序:;File Name :exp03.asm;learn how to operate the I/O ports;get some knowledge of the rts.lib file;in the I/O space 0x0000=>8 switches; 0x0001=>8 LEDs.mmregs.global_main.text_main:stm3100h,sp ;堆栈指针的首地址设为#3100hstm1000h,ar1 ;define the address,定义ar1的地址 ;define the addressportr00h,*ar1 ;从端口00h读出开关状态,存入ar1中。*ar1=port(00h)nop nopportw*ar1,01h ;将ar1的内容(开关状态)写入到led灯上(输入到 01h),控制灯的亮灭nopnop b _main;寻循环执行 nop nop .end;实验现象;任意调整K0K7开关,可以观察到对应LP0LP7灯“亮”或“灭”(四):定时器实验源程序【初始化程序】.mmregs.global _initial_initial:stm 300h,ar1 ;初始化300h 数据地址,设置ar1的地址st #00h,*ar1;辅助寄存器ar1指向#00hstm 302h,ar1 ;初始化 302h 数据地址,设置ar2的地址st #00h,*ar1;辅助寄存器ar1指向#00hstm200h,ar1st#5555h,*ar1stm201h,ar1st#0aaaah,*ar1stm202h,ar1st#400h,*ar1ssbx1,11 ;将ST1.INTM置为1,停止所有中断stm 0ffffh,ifr;清除所有中断标识 ifr:中断标志寄存器stm 00h,imr ;将立即数寄存器(imr)置为0,停止所有中断stm 410h,tcr;停止计时器 tcr:发送控制寄存器stm 4e1fh,prd;将初始时间设为4e1fhstm 420h,tcr;开始计时器stm 08h,imr ;允许计时器中断rsbx 1,11 ;将ST1.INTM置为0,开始所有中断ret【端口程序】(定义管脚).mmregs.global_porta.global_portb_porta:stm304h,ar1 ;设置ar1地址st5555h,*ar1;辅助寄存器ar1指向5555hportw*ar1,01h;ar1的值做输出控制小灯亮灭ret_portb:stm304h,ar1;设置ar1地址st0aaaah,*ar1;辅助寄存器ar1指向0aaaahportw*ar1,01h;ar1的值控制亮灭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*16sint18 .space 4*16sint19 .space 4*16sint20 .space 4*16sint21 .space 4*16sint22 .space 4*16sint23 .space 4*16sint24 .space 4*16sint25 .space 4*16sint26 .space 4*16sint27 .space 4*16sint28 .space 4*16sint29 .space 4*16sint30 .space 4*16int0: RETE NOP NOP NOPint1: RETE NOP NOP NOPint2: RETE NOP NOP NOPtint: b _timer;设置实用time中断 NOP NOPrint0: RETE NOP NOP NOPxint0: RETE NOP NOP NOPrint1: RETE NOP NOP NOPxint1: RETE NOP NOP NOPint3: RETE NOP NOP NOP .end实验现象单击“Run”运行,可观察到LED灯(LP0LP7)以一定的间隔时间不停摆动;单击“Halt”,暂停程序运行,LED灯停止闪烁;.单击“Halt”,暂停程序运行,LED灯停止闪烁。(五):INT2中断实验源程序【初始化程序】.mmregs.global _initial .text _initial:stm 300h,ar3 ;初始化数据 300h ar3:辅助寄存器st #00h,*ar3;辅助寄存器ar3指向#00hstm 302h,ar4;初始化数据 300h ar4:辅助寄存器st #00h,*ar4ssbx1,11 ;将st1.intm置为1,停止所有中断stm 00h,imr;将立即数置0,停止所有中断 imr:立即数寄存器stm 0ffffh,ifr;清除所有中断标志 ifr:中断标志寄存器stm 04h,imr;允许int2 中断rsbx 1,11 ;允许所有中断ret .end 【端口程序】与【向量程序】参见实验四。.实验现象单击“Run”运行程序,反复拨动开关K0,观察LP1LP7 LED灯亮灭变化;单击“Halt”暂停程序运行,反复拨动开关K0,LP1LP7 LED灯亮灭不发生变化。实验二:A/D采样实验实验目的1 掌握利用TLV320AD50实现/转换的技术基本原理和常用方法。2 学会DSP的多信道缓冲串口的应用方法。3 掌握并熟练使用DSP和AD50的接口及其操作。4 通过实验加深对DSP系统频谱混叠认识.源程序:【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:NOPLD #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 ; 停止onchip计时T C R定时器控制寄存 器; 计时器0用作主循环的计时器* Initialize McBSP2 Registers *;(初始化 McBSP2 (用来创建设备配置)寄存器)STM SPCR1, McBSP2_SPSA ; 设置SPCR1的寄存器地址STM #0000h, McBSP2_SPSD ; McBSP2 recv = leftjustify; 通过框架同步产生接受中断STM SPCR2, McBSP2_SPSA ; 设置SPCR2的寄存器地址; 通过框架同步产生传输中断STM #0000h, McBSP2_SPSD ; McBSP2 Tx(异步传输); 在SW断点之后运行STM RCR1, McBSP2_SPSA ; 设置RCR1的寄存器地址 ;RCR1:接收控制寄存器STM #0040h, McBSP2_SPSD ; 接收框架1长度=16 bitsSTM RCR2, McBSP2_SPSA ; 设置RCR2的寄存器地址 STM #0040h, McBSP2_SPSD ; 接收相位=1; 设置框架2长度为16bitsSTM 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 ; 返回主程序NOPNOP * Waiting for McBSP0 RX Finished *;(等待McBSP0异步接收结束)IfRxRDY1:NOPSTM SPCR1, McBSP2_SPSA ; 启动 McBSP2 RxLDM McBSP2_SPSD, AAND #0002h, A ; 隐藏已经接受到的bit(可以用来代替系列端口中断)BC IfRxRDY1, AEQ ; 继续寄存(checking)NOPNOPRET ; 返回NOPNOP* Waiting for McBSP0 TX Finished *;(等待McBSP0异步传输结束)IfTxRDY1:NOPSTM SPCR2, McBSP2_SPSA ; 启动 McBSP2 TxLDM McBSP2_SPSD, AAND #0002h, A ; 隐藏已经传输的bitBC IfTxRDY1, AEQ ; 继续寄存 NOPNOPRET ; 返回NOPNOP*_OpenMcBSP:rsbx xf ;寄存器xf复位为0call wait ;非条件调用等待状态NOPSTM SPCR1, McBSP2_SPSA ; 启动 McBSP0 RX 以读入 AD 数据LDM McBSP2_SPSD,AOR #0x0001, A STLM A, McBSP2_SPSD ;隐藏已经接受到的bitSTM SPCR2, McBSP2_SPSA ; 启动 McBSP0 TX 以 DTMF 输出LDM McBSP2_SPSD,AOR #0x0001, ASTLM A, McBSP2_SPSD ;隐藏已经输出的bitLD #0h, DP ; 装载数据页0rpt #23 ;循环执行NOP ssbx xf ;寄存器xf置位为1NOPNOP CALL IfTxRDY1 ;非条件调用 IfTxRDY1 STM #0x0001, McBSP2_DXR1 ;请求二级传送NOPCALL IfTxRDY1 ; 非条件调用 IfTxRDY1STM #0100h, McBSP2_DXR1 ;将00h写入到寄存器1 CALL IfTxRDY1 ;非条件调用 IfTxRDY1STM #0000h, McBSP2_DXR1; NOPNOPrpt #20hnop CALL IfTxRDY1 ;非条件调用 IfTxRDY1STM #0x0001, McBSP2_DXR1 ;请求二级传送CALL IfTxRDY1 ;非条件调用 IfTxRDY1STM #0200h, McBSP2_DXR1 ;将00h写入到寄存器2CALL IfTxRDY1STM #0000h, McBSP2_DXR1 CALL IfTxRDY1STM #0x0001, McBSP2_DXR1 ;请求二级传送CALL IfTxRDY1 STM #0300h, McBSP2_DXR1 ;将00h写入到寄存器3CALL IfTxRDY1STM #0000h, McBSP2_DXR1 CALL IfTxRDY1STM #0x0001, McBSP2_DXR1 ;请求二级传送CALL IfTxRDY1 STM #0490h, McBSP2_DXR1 ;将00h写入到寄存器4;通过内部DPLL bypass internal DPLL ;并且选择抽样频率 and select the Sample Frequency CALL IfTxRDY1STM #0000h, McBSP2_DXR1 RETNOPNOP *_CloseMcBSP:STM SPCR1, McBSP2_SPSA ; 关闭 McBSP0 RXLDM McBSP2_SPSD,AAND #0xFFFE, ASTLM A, McBSP2_SPSDSTM SPCR2, McBSP2_SPSA ; 关闭 McBSP0 TXLDM McBSP2_SPSD,AAND #0xFFFE, ASTLM A, McBSP2_SPSDRPT #5RETNOPNOP_READAD50:stm0x00ff,ar3stm0x1000,ar2loopa:CALL IfRxRDY1ldm McBSP2_DRR1,bstl b,*ar2+ banz loopa,*ar3- nopnop retnopnop_WRITEAD50:stm0x037b,ar3stm0x38a3,ar2loopb:CALL IfTxRDY1 ldu*ar2+,Band #0fffeh,b ;mask the LSBstlm B, McBSP2_DXR1banzloopb,*ar3-nopnopretnopnop wait: stm 20h,ar3loop1: stm 020h,ar4loop2:banz loop2,*ar4-banz loop1,*ar3-ret nopnopnopnop.end* End of File InitC5402.asm*在图形编辑窗口观察到的A/D转化后的采样波形实验分析:频谱混叠产生的原因:根据抽样定理,当取样频率fs大于等于两倍的频谱最高频率分量fm的两倍时,就可以从离散序列中准确的回复出信号,但当取样频率fs小于于频谱最高频率分量fm的两倍时,就会发生频谱混叠现象。实验三 D/A转换实验实验目的1、掌握利用TLV320AD50实现/转换的技术基本原理和常用方法。2、进一步学习DSP的多信道缓冲串口的应用方法。3、掌握并熟练使用DSP和AD50的输出接口及其操作。源程序:【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转换 */ 【汇编程序】.global _InitC5402 .global _OpenMcBSP.global _CloseMcBSP .global _READAD50 .global _WRITEAD50.include MMRegs.h_InitC5402:NOPLD #0, DP ;重置数据存储器页指针STM #0, CLKMD ; 对DSP时钟进行软件设置STM #0, CLKMD ; (在设置之前转到分线规模式)STM #0x4007, CLKMD ; 将C5402 DSP时钟设置到40Hz* STM #0x4007, CLKMD ; set C5402 DSP clock to 100MHz; (based on DSK crystal at 20MHz)* 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 ; 停止onchip计时T C R定时器控制寄存器; 计时器0用作主循环的计时器* STM #6249, PRD ; if CPU at 100M/6250=16KHz * Initialize McBSP2 Registers *;(初始化 McBSP2 (用来创建设备配置)寄存器)STM SPCR1, McBSP2_SPSA ; 设置SPCR1的寄存器地址STM #0000h, McBSP2_SPSD; McBSP2 recv = leftjustify; 通过框架同步产生接受中断STM SPCR2, McBSP2_SPSA ; 设置SPCR2的寄存器地址; 通过框架同步产生传输中断STM #0000h, McBSP2_SPSD ; McBSP2 Tx(异步传输); 在SW断点之后运行STM RCR1, McBSP2_SPSA ; 设置RCR1的寄存器地址 ;RCR1:接收控制寄存器STM #0040h, McBSP2_SPSD ; 接收框架1长度=16 bitsSTM RCR2, McBSP2_SPSA ; 设置RCR2的寄存器地址STM #0040h, McBSP2_SPSD ; 接收相位=1; 设置框架2长度为16bitsSTM 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 ; 返回主程序NOPNOP* Waiting for McBSP0 RX Finished *;(等待McBSP0异步接收结束)IfRxRDY1:NOPSTM SPCR1, McBSP2_SPSA ; 启动 McBSP2 RxLDM McBSP2_SPSD, AAND #0002h, A ; 隐藏已经接受到的bit(可用来代替系列端口中断)BC IfRxRDY1, AEQ ; 继续寄存(checking)NOPNOPRET ; 返回NOPNOP* Waiting for McBSP0 TX Finished *;(等待McBSP0异步传输结束)IfTxRDY1:NOPSTM SPCR2, McBSP2_SPSA ; 启动 McBSP2 TxLDM McBSP2_SPSD, AAND #0002h, A ; 隐藏已经传输的bitBC IfTxRDY1, AEQ ; 继续寄存 NOPNOPRET ; 返回NOP