; 0x8,0x9,0xa,0xb,0xc,0xd all = 0x0 stm #0eh,MCBSP1_SPSA ; choose PCR0 stm #0a0eh,MCBSP1_SPSD
rpt #0ffh nop
stm #0h,MCBSP1_SPSA
stm #2001h,MCBSP1_SPSD ; enable recive ! stm #1,MCBSP1_SPSA
stm #1c1h,MCBSP1_SPSD ; enable transmit ! stm #0,DXR11
串口收发中断的设置包括中断屏蔽寄存器IMR的设置,即允许串口1的发送和接收中断,同时设置PMST,指定中断向量表的位置,以便正确响应中断。 (13)串口的中断服务程序
本实验程序使用了两个缓冲BUFFER:发送缓冲和接收缓冲。在初始化程序中首先将‘VC5402 ROM中的正弦数据(在0x0fe00-0x0feff)输送到发送缓冲中。然后,利用串口发送中断,在发送中断服务程序中将这些正弦数据从串口1发送。同时,接收中断服务程序将接收的数据存放到接收缓冲。为了区别,我们将接收到的正弦数据除了个2。所以,利用CCS提供的图形工具可以看到发送和接收BUFFER的波形。 (14)实验硬件结构图
在DES5402PP实验板上提供了McBSP1的接口(J6),其引脚的具体定义为:
① ③ ⑤ ⑦ ⑨ BCLK1 GND FSR1 GND TDR1 GND TDX1 GND 3.3V GND ② ④ ⑥ ⑧ ⑩
其中,‘VC5402虽然提供了独立的收发时钟BCLKR和BLCKX,独立的帧同步FSR和FSX信号,而在DES5402PP板上,我们将两个时钟和两个帧同步分别接到一起,即J6的1脚BCLK1和J6的3脚FSR1。
若使用两块DES5402PP板完成收发,连接示意图如下图3-11。按下图连接后,收发两端在初始化串口时应注意区别。其中,串口的时钟BCLK和帧同步FSR只能由一端提供,例如,在初始化时发端串口的BCLK和FSR为输出信号,也就是说由发端提供串口通讯用的时钟和帧同步,而收端的BCLK和FSR配置为输入信号,即由外部提供时钟和帧同步。
22
在本实验中,为了方便,我们使用短路子将J6的5脚和6脚短路,将数据发送端与数据接收端相连,所以我们在实验中先从串口发送一个正弦信号(该正弦数据由‘VC5402的ROM提供),然后在从串口接收该正弦信号,并使用CCS的图形工具观察结果。
DES5402PP(J6)发端 DES5402PP(J6)收端
BCLK(1) BCLK(1)
FSR(3) FSR(3)
TDR(5) DX(7)
TDX(7) DR(5)
GND GND(2,4,6,8,1
(2,4,6,8,10) 0)
图3-11 DES的串口连接示意图
四、实验条件
PC机, DES5402PP-U实验系统 五、实验步骤及结果测试
(1)启动CCS,新建工程文件,如文件名为mcbps.prj。选择Project菜单中的Add File to Project选项,将编写好的汇编源程序exer3.asm、vectors.asm和连接定位des5402pp.cmd文件依次添加到工程文件中。其中,exer3.asm包括初始化代码和中断服务程序,而vectors.asm包含中断向量表。
(2)选择Project菜单中的Options选项,或使用鼠标右键单击工程文件名(如sinewave.mak)并选择Options项来修改或添加编译、连接中使用的参数。例如,选择Assembler窗口,选择“Enable Symbolic Debug Infomation”以便使用汇编源代码级调试(你可以在汇编源程序设置断点等等)。选择Linker窗口,在“Output Filename”栏中写入输出OUT文件的名字,如mcbps.out,你还可以设置生成的MAP文件名。
(3)完成编译、连接,正确生成OUT文件。然后使用File菜单的“Load Program”选项,将生成的OUT文件(如mcbps.out)装入DSP的片内存储器。这时CCS将显示程序的启始地址_c_int00。
(4)选View→Graph→Time/Frequency…打开图形显示设置窗口。在弹出的对话框中,主要修改“Start Address”为xbuffer(xbuffer为ROM中的正弦波数据);“Acquisition Buffer Size”为255,“Display Data Size”改为255,“DSP Data Type”为“16-bit signed integer”,“Autoscale”改为OFF,“Maximum Y-value”改为32768。 (5)再次打开一个图形显示设置窗口。在弹出的对话框中,主要修改“Start Address”为rbuffer(rbuffer为接收缓冲),其它设置不变。
23
(6)在汇编源程序接收的中断服务程序(int_rev)中的“nop”语句(“bc con,ntc”下一句)处设置断点。该行被加亮为洋红色。选择Debug→Animate,运行程序,观察输出波形。比较发送缓冲和接收缓冲的波形是否一致? 六、实验报告要求
1﹑画出实验波形;
2﹑编写实验程序代码; 3﹑写出本次实验的心得体会。 七、思考题
(1)本实验没有设置串口通讯使用的帧同步时钟,而是通过发送位移寄存器自动产生。所以帧同步信号的频率为500K/16=31.25KHz。修改控制寄存器,设置帧同步信号频率为10KHz,重做本实验。
(2)利用电缆线将两块DES5402PP的J6连接起来,实现两块DES板的串口通讯。提示:两块DES中,一块提供时钟和帧同步信号(可直接使用本实验程序),另一块串口的时钟和帧同步为外部提供,可以只修改串口初始化部分)。
24
: FIR数字滤波器设计与实现
一、实验目的
1、学习数字滤波器的DSP实现原理和C54X编程技巧,
2、通过CCS的图形显示工具观察输入/输出信号波形以及频谱的变化。 注意:该实验应该在完成前面的串口和定时器实验后完成。 二、预习与参考 (1).FIR滤波器的实现
如果FIR滤波器的冲激响应为h(0),h(1), ...,h(N-1)。X(n)表示滤波器在n时刻的输入,则n时刻的输出为:
y(n) = h(0)x(n) + h(1)x(n-1) + ... + h(N-1)x[n-(N-1)] 使用MAC或FIRS指令可以方便地实现上面的计算。
图4-1说明了使用循环寻址实现FIR滤波器的方法。为了能正确使用循环寻址,必须先初始化BK,块长为N。同时,数据缓冲区和冲激响应(FIR滤波器的系数)的开始地址必须是大于N的2的最小幂的倍数。例如,N=11,大于N的最小2的幂为16,那么数据缓冲区的第一个地址应是16的倍数,因此循环缓冲区起始地址的最低4位必须是0。
图4-1 FIR滤波器存储器里的数据存储方式
在图4-1中,滤波系数指针初始化时指向h(N-1),经过一次FIR滤波计算后,
在循环寻址的作用下,仍然指向h(N-1)。而数据缓冲区指针指向的是需要更新的数据,如x(n)。在写入新数据并完成FIR运算后,该指针指向x(n-(N-1))。所以,使用循环寻址可以方便地完成滤波窗口数据的自动更新.
使用带MAC指令的循环寻址模式实现FIR滤波器,程序片段如下:(输入数据在AL中,滤波结果在AH中) STM #1,AR0
; AR0=1
25
STM #N,BK
; BK=N,循环寻址BUFFER大小为N
; 更新滤波窗口中的采样数据
;重复MAC指令N次,先将A清零
STL A,*FIR_DATA_P+% RPTZ A,#(N-1)
MAC *FIR_DATA_P+0%,*FIR_COFF_P+0%,A ; 完成滤波计算。
;注意FIR滤波系数存放在数据存储区
另一种方法是利用C54x系列芯片的提供的FIRS指令来实现FIR滤波器。图4-2为一种有限单位冲激响应呈现对中心点对称的FIR滤波器。长度为N 的线性相位FIR滤波器的输出表达式为:
N/2?1y(n)??h(k)[x(n?k)?x(n?(N?1?k))]k?0
图4-2 N阶均衡FIR滤波器框图
要利用FIRS指令,需要将输入数据缓冲分成两个,循环缓冲区大小寄存器的值设为N/2。图4-3显示了输入序列在两个循环缓冲器里的存储情况。设辅助寄存器AR2指到缓冲区1(Buffer1)的顶部,AR3指到缓冲区2(Buffer2)的底部。每次进行滤波之前,应先将缓冲区1顶部的数据移到缓冲区2的底部,新来的一个样本存储到缓冲区1中时,并对缓冲区1指针AR2加1(使用循环寻址)。处理器然后使用FIRS指令进行乘加运算,即h(0){x(0)+x(-N+1}。当然,在使用FIRS指令前,需要预先计算一次求和,以初始化A 。在RPTZ重复指令和循环寻址的配合下,完成FIR滤波.滤波完成后,需要对两个数据缓冲的指针进行修正,以便对下一个点进行处理。将Buffer1的指针减1和Buffer2的指针减2,使他们指向各自缓冲的数据队列的最后。
使用带FIRS指令的循环寻址模式实现FIR滤波器,程序片段如下:(输入数据在AL中,滤波结果在B中) STM #1,AR0
; AR0=1
; BK=N/2,循环寻址BUFFER大小为N
26
STM #(N/2),BK