dsp技术实验讲义Word格式.docx
《dsp技术实验讲义Word格式.docx》由会员分享,可在线阅读,更多相关《dsp技术实验讲义Word格式.docx(57页珍藏版)》请在冰点文库上搜索。
![dsp技术实验讲义Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/b9a9407c-33d6-4b37-832b-b0c8670455f5/b9a9407c-33d6-4b37-832b-b0c8670455f51.gif)
实验成绩按照学校规定的比例计入该课程总成绩。
对于考核不及格的学生,必须重修。
课程简介:
“DSP原理及应用”实验课程是高等学校面向电子类专业开设的一门限选技术基础课。
通过本课程的各个教学环节的实践,通过实践,帮助学生理解DSP芯片的硬件结构和软件系统。
熟悉DSP芯片的内部结构和性能。
熟悉DSP软件开发环境及其开发工具。
在DSP实验板上进行编程及DSP芯片的加载调试过程。
熟悉TMS320C54x系列芯片的结构特点.工作原理.片内外设电路及应用场合;
掌握面向DSP芯片编程的方法和所采用的编程语言,以及CCS集成开发环境的使用,使学生初步具备面向DSP编程的能力。
为今后以DSP为核心的系统的使用和设计工作打下基础。
教学大纲要求总学时72,其中理论教学54学时.实验18学时,实验个数6个。
DSP原理及应用实验课实验项目一览表
序号
实验项目名称
实验类型及计划学时
开设学期
开出要求
演示
验证
综合
设计
1
DES综合外设试验
3
6
必修
2
C54x的基本算数运算
C54x的浮点数运算
4
用定时器实现数字振荡器
5
fir数字滤波器
快速傅立叶变换(fft)的实现
合计
18
实验一DES综合外设试验
实验目的:
1、学习外设的控制原理
2、学习在外设的控制程序中所使用的汇编和c混合编程
3、学习对C54x的中断、IO空间操作等基本DSP编程技巧
试验要求:
1、要求掌握和巩固DSP编程的基本方法
2、通过试验,能独立编写复杂的外设控制程序。
3、学习CCS开发环境
实验器材:
PC机,DSP54XX教学实验系统
实验原理:
(1).‘C54XX的IO空间读写
‘C54XX提供64K字的IO空间访问能力。
在汇编指令中分别提供了读和写命令:
portr和portw。
你也可以在C中实现该IO操作,方法如下:
首先定义IO空间变量,
如:
ioportunsignedportXXXX;
/*其中,XXXX代表具体IO口地址*/
然后,就可以象访问普通变量一样访问IO口。
如
portXXXX=0x55;
/*将0x55写到XXXX指定的IO口*/
(2).交通灯的控制
DES5402PP-U提供了16个LED,其控制地址为IO空间的0x0c000h。
该地址的D0-15
比特位分别对应这16个LED。
将1写入可以点亮LED,0则关闭。
请参考下面代码:
/*说明IO空间0x0c000h变量,以便用C实现IO空间操作*/
ioportunsignedportc000;
/*forLEDsshow*/
/*下面是LED控制代码*/
portc000=0;
/*关闭所有16个LED*/
/*该C语句等效于汇编指令portw#0,0c000h*/
mydelay();
/*使用空循环延时*/
portc000=0xffff;
/*点亮所有16个LED*/
/*下面依次逐个点亮LED(DS1-DS16)*/
led=1;
for(i=0;
i<
16;
i++)
{
portc000=led;
/*点亮一个LED*/
/*延时*/
/*关闭LED*/
led=led<
<
1;
}
(3).直流电机控制
DES5402PP-U实验系统配有一个小型直流电机,可以DSP编程完成直流电机的调速控
制。
其控制方法为:
当向0x0e000h(‘VC5402的IO空间)的D0比特位写入1时,电机
正向转动;
当写入0时,电机反向转动。
用户可以通过DO位1或0的持续时间(即D0
输出方波的占空比)控制电机的转速。
注意,使用直流电机时,应该先接通电机的电
源,方法如下:
向IO空间的0x8000地址的D0比特位写入1。
若要关闭电源,请写入
0。
当写入1或0时,你可以听到继电器动作的声音。
/*说明IO空间0x8000和0x0e000变量,以便用C实现IO空间操作*/
ioportunsignedport8000;
/*forCTRLword*/
ioportunsignedporte000;
/*forDCMOTORrun*/
/*下面是直流电机的控制代码*/
CtrlWord|=0x1;
/*设置D0=1*/
port8000=CtrlWord;
/*接通DCMOTOR的电源*/
/*下面代码使直流电机正向全速转动*/
porte000=1;
/*正向电压*/
/*下面代码使直流电机反向全速转动*/
porte000=0;
/*反向电压*/
/*下面代码使直流电机左右摆动*/
20;
i++)/*左右摆动20次*/
/*下面代码使直流电机慢转(通过DO输出方波的占空比控制)*/
for(k=0;
k<
4;
k++)/*控制转动持续时间*/
1000;
{porte000=1;
for(j=0;
j<
10000;
j++);
/*延时(长)*/
1300;
/*延时(短)*/
/*下面代码关闭电机电源*/
CtrlWord&
=0xfffe;
/*设置D0=0;
*/
(4).步进电机的控制
DES5402PP-U实验系统还配有一个步进电机。
IO空间的0x0f000h的D0,D1,D2,D3
四个比特位分别对应步进电机的四相驱动端。
依次向这四个比特位写入1,便可以控制步
进的转动。
请参考下面的代码:
/*下面代码控制步进电机反向转动5步*/
motor=1;
6;
j++)
portf000=motor;
/*senddriveplusetomotor*/
motor=motor<
1;
k++)/*delay*/
if(motor==0x10)/*只有低4位有效*/
/*下面代码控制步进电机正向转动5步(转动速度较快)*/
motor=0x8;
motor=motor>
>
2;
k++)/*延时,决定转动速度*/
if(motor==0x0)
/*只有低4位有效*/
(5).异步串口控制
‘VC5402本身并未提供异步串口,所以DES5402PP-U使用TLC16C550串口控制芯片
增加异步串口,以便与PC机RS232串口(DB9)直接通讯。
实验板上UART功能使用DSP
中断INT0,收与发都是同一中断,所以进入中断服务程序后应该判断是什么中断,然后
再做相应操作。
实验板上异步串口接口寄存器地址分配情况:
(IO空间)
0B000h:
发送与接受缓冲寄存器(线路控制寄存器D7=0);
波特率因子寄存器低字节(线路
控制寄存器D7=1)
0B001h:
中断允许寄存器(线路控制寄存器D7=0);
波特率因子寄存器高字节(线路控制寄
存器D7=1)
0B002h:
中断识别寄存器
0B003h:
线路控制寄存器
0B004h:
MODEM控制寄存器
0B005h:
线路状态寄存器
0B006h:
MODEM状态寄存器
0B007h:
Scratch寄存器
下面是初始化16C550的一段代码,串口通讯速率为9600波特率,8个数据位,1个停止
位,没有校验位:
;
/*PCUARTUSE15C550,itBASEADDRESSIS0B000h*/
uart_data.set0b000h;
uartRBR,THR(DLAB=0);
DLL(DLAB=1)registeraddress
uart_ier.set0b001h;
uartIER(DLAB=0);
DLM(DLAB=1)registeraddress
uart_iir.set0b002h;
uartIIR,FCRregisteraddress
uart_lcr.set0b003h;
uartLCRregisteraddress
uart_mcr.set0b004h;
uartMCRregisteraddress
uart_lsr.set0b005h;
uartLSRregisteraddress
uart_msr.set0b006h;
uartMSRregisteraddress
uart_scr.set0b007h;
uartSCRregisteraddress
(中间省略)
stm#08bh,temp
portwtemp,uart_lcr;
setLCR_D7=1tosetbaudrateregister
nop
stm#24,temp
portwtemp,uart_data;
setDLL=24(baudrate=9600,primaryF=3.6864M)
stm#0,temp
portwtemp,uart_iir;
setDLM=0(baudrate=9600,primaryF=3.6864M)
stm#03h,temp
setLCR_D7=0andlinecontrol
portruart_iir,temp;
tocleariir
portruart_lsr,temp;
toclearlsr
portwtemp,uart_ier;
enablereceive,sendints
有关异步串口与PC机的RS232通讯的操作请参阅TLC16C550的DATASHEET和系统配
套CD-ROM中的UART5402例程。
(6).数码管的控制
DES5402PP-U提供8个七段数码管,他们直接由系统的MCU(89C52)管理。
DSP部分
与MCU部分之间通过异步串口连接。
所以本实验系统提供另一片16C550串口管理芯片
(U17)。
MCU与DSP的异步串口通讯速率设置为9600波特率,8个数据位,1个停止
位,没有校验位。
该串口控制芯片(U17)占用DSP一个外部中断资源,即INT1。
串口通
讯格式总共14个Byte,如下所示:
0x550x77xxxxxxxxxxxxxxxxxxxx0x880x99
固定(2Byte)保留(2Byte)8Byte对应8个数码管,结束标志(2
Byte)
0x0-0x9显示数字0-9
例如,要在数码管上显示“85450520”8个数字,则需要将下面14Byte通过16C550发
往MCU,以便MCU正确显示。
这14Byte的内容为:
0x550x770xff0xff0x00x20x50x00x50x40x50x80x880x99
(7).液晶屏的控制
DES5402PP-U提供一个64X128的图形点阵液晶显示屏。
该液晶显示模块自带汉字字
库,每屏可以显示4行8列共32个汉字。
液晶屏也由MCU部分(89C52)管理。
与数码
管控制一样,DSP将需要显示的信息通过异步串口(串口管理芯片为U17)发送到MCU,
由MCU负责完成对液晶屏的具体操作。
液晶屏与数码管使用的是同一串口资源。
讯格式总共23个Byte组成,具体分配如下所示:
0x550x66xxxxxxxxxx…………………xxxx0x880x99
固定(2Byte)行列显示字固定16个Byte,每个汉字结束标志
号号符个数(ASIIC内码)占用2个Byte(2Byte)
若少于8个汉字,后面保留
注意,行号为1-4,列号为0-7。
液晶屏每行最多显示8个汉字,若超过,系统将丢弃多
余汉字。
另外,由于汉字内码为2个Byte,所以要显示ASIIC码的英文字母、数字、符
号(1个Byte)时,每次显示的字符个数必须是2的整倍数。
例如,在1行,0列显示两
个汉字“我们”,这数据格式为:
0x550x660x10x00x40xce0xd20c30xc7………0x000x000x880x99
固定开头行、列,共“我们”两个汉字内码,4Byte,然后结束标志
显示4个字符是12个Byte的0x0
再如,需要在第2行,第0列显示ASCII码的‘3’,格式为:
0x550x660x20x00x20x330x200x000x0………0x000x000x880x99
固定开头行、列,共‘3’的ASCII码和空格的ASCII码,然后结束标志
显示2个字符是14个Byte的0x0
(8).键盘的管理
DES5402PP-U系统提供了一个4X8共32个键的小键盘。
该键盘仍然由MCU
(89C52)部分管理。
DSP通过扩展的异步串口(U17)从MCU接收按键信息。
也就是
说,DSP通过该串口发送显示信息到数码管和液晶屏,并从该串口读取键盘按键。
键盘
通讯的格式如下:
‘E’‘K’‘Y’+键盘正码+键盘反码+0x0d
(EKY字母开头)结束标志
例如,当按下数字1键时,DSP接收到的数据为:
0x450x4b0x590x330xcc0x0d
实验内容:
在CCS环境中打开工程文件如图1所示,在该工程文件中,包括
存储器连接定位文件onchip.cmd,C的标准库文件以及用C和汇编编写的源程序。
整个
程序采用C做主程序,关键操作如中断服务程序,外设控制使用汇编的混合模式完成。
查看完整地代码段,设置断点,查看各个程序段的代码。
思考题:
1利用键盘控制直流电机的转速
2利用键盘控制步进电机的转动步数
3编写计算器程序
4编写募集交通灯控制程序
实验二C54x的基本算数运算
学习使用定点DSP实现16位定点加法、减法、乘法、除法运算的基本方法和编程技巧。
1、要求学生熟悉dsp中提供的大量指令。
2、通过试验,学生能独立编写实现定点加法、减法、乘法、除法运算的程序。
3、练习并掌TMS320C54X的汇编语言的汇编指令系统的使用方法。
4、练习并掌握用CCS调试程序的一些基本操作。
PC机,DSP54XX教学实验系统
实验原理
(1)定点DSP中数据表示方法
C54X是16位的定点DSP。
一个16位的二进制数既可以表示一个整数,也可以表
示一个小数。
当它表示一个整数时,其最低位(D0)表示20,D1位表示21,次高位
(D14)表示214。
如果表示一个有符号数时,最高位(D15)为符号位,0表示正数,1
表示负数。
例如,07FFFH表示最大的正数32767(十进制),而0FFFFH表示最大的负
数-1(负数用2的补码方式显示)。
当需要表示小数时,小数点的位置始终在最高位后,
而最高位(D15)表示符号位。
这样次高位(D14)表示2−1,然后是2−2,最低位
(D0)表示2−15。
所以04000H表示小数0.5,01000H表示小数2−3=0.125,而0001H
表示16位定点DSP能表示的最小的小数(有符号)2−15=0.000030517578125。
在后面的
实验中,除非有特别说明,我们指的都是有符号数。
在C54X中,将一个小数用16位定
点格式来表示的方法是用215乘以该小数,然后取整。
从上面的分析可以看出,在DSP中一个16进制的数可以表示不同的十进制数,或者
是整数,或者是小数(如果表示小数,必定小于1),但仅仅是在做整数乘除或小数乘除
时,系统对它们的处理才是有所区别的,而在加减运算时,系统都当成整数来处理。
(2)实现16定点加法
加法运算:
ldtemp1,a;
将变量temp1装入寄存器A
addtemp2,a;
将变量temp2与寄存器A相加,结果放入A中
stla,add_result;
将结果(低16位)存入变量add_result中。
62
注意,这里完成计算temp3=temp1+temp2,我们没有特意考虑temp1和temp2是整数还是
小数,在加法和下面的减法中整数运算和定点的小数运算都是一样的。
(3)实现16位定点减法
减法运算:
stm#temp1,ar3;
将变量temp1的地址装入ar3寄存器
stm#temp3,ar2;
将变量temp3的地址装入ar3寄存器
sub*ar2+,*ar3,b;
将变量temp3左移16位同时变量temp1也左移16位,然后;
相减,结果放入寄存器B(高16位)中,同时ar2加1。
sthb,sub_result;
将相减的结果(高16位)存入变量sub_result。
(4)实现16定点整数乘法
数乘法运算:
rsbxFRCT;
清FRCT标志,准备整数乘
ldtemp1,T;
将变量temp1装入T寄存器
mpytemp2,a;
完成temp2*temp1,结果放入A寄存器(32位)
stha,mpy_I_h;
将结果(高16位)存入变量mpy_I_h
stla,mpy_I_l;
将结果(低16位)存入变量mpy_I_l
(5)实现16定点小数乘法
ssbxFRCT;
FRCT=1,准备小数乘法
ldtemp1,16,a;
将变量temp1装入寄存器A的高16位
mpyatemp2;
完成temp2乘寄存器A的高16位,结果在B中,同时;
将temp2装入T寄存器
sthb,mpy_f;
将乘积结果的高16位存入变量mpy_f
(6)实现16定点整数除法
将被除数装入T寄存器
mpytemp2,A;
除数与被除数相乘,结果放入A寄存器
ldtemp2,B;
将除数temp2装入B寄存器的低16位
absB;
求绝对值
stlB,temp2;
将B寄存器的低16位存回temp2
ldtemp1,B;
将被除数temp1装入B寄存器的低16位
rpt#15;
重复SUBC指令16次
subctemp2,b;
使用SUBC指令完成除法运算
bcddiv_end,agt;
延时跳转,先执行下面两条指令,然后判断A,若A>
0,
则;
跳转到标号div_end,结束除法运算
stlB,quot_i;
将商(B寄存器的低16位)存入变量quot_i
sthB,remain_i;
将余数(B寄存器的高16位)存入变量remain_i
xorB;
若两数相乘的结果为负,则商也应为负。
先将B寄存器清0
subquot_i,B;
将商反号
存回变量quot_i中
div_end:
(7)实现16定点小数除法
ldtemp1,16,B;
将被除数temp1装入B寄存器的高16位
and#0ffffh,B;
将B寄存器的高16位清为0。
这时余数被丢弃,仅保留商
延时跳转,先执行下面