《最新张永祥TMS320C54系列DSP原理与应用第六章PPT课件.ppt》由会员分享,可在线阅读,更多相关《最新张永祥TMS320C54系列DSP原理与应用第六章PPT课件.ppt(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、张永祥张永祥TMS320C54TMS320C54系列系列DSPDSP原原理与应用第六章理与应用第六章第6章 TMS320C54x DSP的C/C+程序设计6.1 C/C+6.1 C/C+程序设计基础程序设计基础6.2 6.2 程序设计示例程序设计示例6.3 C6.3 C语言和汇编语言混合编程语言和汇编语言混合编程2首都师范大学信息工程学院int i,k,p;double r;p=0;for(k=0;k=length-1;k+)Outputk=0;r=0;for(i=0;ilength-1)p=length-1;else p=p;p=length-2;for(k=length;k=length+
2、length-1;k+)6.1 C/C+程序设计基础10首都师范大学信息工程学院 Outputk=0;r=0;for(i=0;i=p;i+)r=Inputlength-1-i*Impulselength-1-p+i;Outputk=Outputk+r;p=p-1;return;6.1 C/C+程序设计基础11首都师范大学信息工程学院需要注意的是,如果函数和主程序在同一个文件中,则只需要在主程序前部加入该函数的声明即可;如果函数和主程序不在同一个文件中,则需要在主程序文件的头部用“#include 头文件名”将函数头文件名包括在内。2.2.库函数库函数CCS提供的库函数包括两类。一类安装在c:t
3、ic5400cgtoolsinclude目录中,共有文件38个,其中具有.h的文件19个,具有.hpp的文件19个(注意将没有扩展名的文件加上.hpp扩展名)。6.1 C/C+程序设计基础12首都师范大学信息工程学院示例如下:#include ;注意此处和#include“math.h”;的区别 void mail()float x,y;x=3.0;y=log10(x);6.1 C/C+程序设计基础13首都师范大学信息工程学院一类是安装在c:tic5400dsplib目录中,也称作DSPLIB通用库。是专门为TMS320C54x DSP芯片使用的C语言优化程序函数库。它包含了50多种函数数字信
4、号处理程序,全部由汇编语言编写,并可由C语言调用,方便C语言与汇编语言混合编程。DSPLIB可进行的运算有:FFT运算、滤波与卷积运算、自适应滤波运算、相关运算、数学函数运算、三角函数运算、矩阵运算等。6.1 C/C+程序设计基础14首都师范大学信息工程学院6.1 C/C+程序设计基础示例如下:/*/Filename:sine_t.c/Version:0.01/Description:test for dlms routine/*#include#include#include/在dsplib.h、tms320.h头文件中定义了许多运算中要用到的变量、函数,应用程序主函数必须用#include
5、语句包含此头文件。#include test.hshort i;short eflag=PASS;void main(void)15首都师范大学信息工程学院6.1 C/C+程序设计基础 /*clear*/for(i=0;iNX;i+)ri=0;/clear output buffer(optional)/*compute*/sine(x,r,NX);/*test*/eflag=test(r,rtest,NX,MAXERROR);/for r if(eflag!=PASS)exit(-1);return;16首都师范大学信息工程学院rts.lib是TI提供的运行时支持库,如果是C代码写的源程序,
6、必须在工程中添加该库文件。要想使程序正常运行,一些配置工作需要完成:打开工程的Bulid Options选项中两个地方进行设置。当编译时打不开或找不到dsplib.h、tms320.h文件,此时可以在compiler标签下选中preprocessor选项,在Include Search Path栏中填入dsplib.h、tms320.h所在子目录(本例为:c:tic5400dsplibinclude);当连接时找不到库函数相应的汇编程序,编译错误提示有些函数为未定义变量,此时可在linker标签下选中basic选项,在Library Search Path栏中填入54xdsp.lib、rts.
7、lib库文件所在路径(本例为:c:tic5400dsplib;c:tic5400cgtoolslib,注意用英文分号隔开);在Include Library栏填入两库文件(本例为:54xdsp.lib;rts.lib),至此程序可以正常编译。6.1 C/C+程序设计基础17首都师范大学信息工程学院五、五、C/C+C/C+的的DSPDSP访问规则访问规则1.DSP1.DSP片内寄存器的访问规则片内寄存器的访问规则在C语言中对DSP片内寄存器一般采用指针方式来访问,常常采用的方法是将DSP寄存器地址的列表定义在头文件中(如reg.h)。举例,通过指针操作对ST0和AR1进行初始化。#define
8、ST0 (volatile unsigned int*)0 x0006#define AR1 (volatile unsigned int*)0 x0011Int userfunc().*ST0=0 x1278h;*AR1=0 x6013h;.6.1 C/C+程序设计基础18首都师范大学信息工程学院2.DSP2.DSP内部和外部存储器的访问规则内部和外部存储器的访问规则举例,通过指针操作对内部存储器单元0 x4000和外部存储器单元0 x80FF进行操作。int *data1=0 x4000;/*内部存储器单元*/int *data2=0 x80FF;/*外部存储器单元*/int userfu
9、nc().*data1=7000;*data2=0;.6.1 C/C+程序设计基础19首都师范大学信息工程学院3.DSP I/O3.DSP I/O端口的访问规则端口的访问规则在C语言中访问DSP的I/O空间借助于关键字ioport来进行,注意,此关键字只为TMS320C54xx DSP的编译器所识别和使用。定义的形式为 ioport type porthex_num其中,import和port均为关键字,port表示I/O地址,hex_num是十六进制地址,type是I/O数据类型,在TMS320C54xx DSP中,I/O空间共有64K字,所以数据类型只能是char、short、int等16
10、位的类型。6.1 C/C+程序设计基础20首都师范大学信息工程学院6.1 C/C+程序设计基础下例声明了一个io变量,地址为300H,并对I/O端口做读/写操作。ioport unsigned port300;/*定义地址为300H的I/O端口变量*/int userfunc().port300=20;/写I/O端口,port300作为一个变量使用.b=port300;/读I/O端口,port300作为一个变量使用.21首都师范大学信息工程学院一、一、电路设计与功能电路设计与功能开发平台采用的是北京瑞泰创新科技有限责任公司的ICETEK-VC5416A-S60,主处理器采用的是TMS320VC
11、5416 DSP,主频可达到160MHz;内部存储空间为128K*16bit;扩展的6路12bit A/D接口 ADS7864,最大采样速率 500K;8Mbit 扩展 FLASH;设计有用户可以自定义的开关和测试指示灯,其实验箱整体外观如图6.2所示。6.2 程序设计示例22首都师范大学信息工程学院6.2 程序设计示例23首都师范大学信息工程学院该实验箱的核心是ICETEK-VC5416-A 评估板,具有4 组标准扩展连接器,为用户进行二次开发提供条件,其原理框图如图6.3所示。6.2 程序设计示例24首都师范大学信息工程学院6.2 程序设计示例该评估板的接口说明实物图如图6.4所示。25首
12、都师范大学信息工程学院6.2 程序设计示例二、二、代码分析代码分析26首都师范大学信息工程学院其主要代码分析如下:SPSA0=1;/设置McBSP0的SPCR2控制寄存器uWork=SPSD0;uWork&=0 xfffe;/标志XRST=0SPSD0=uWork;SPSA0=0 x0e;/设置McBSP0的PCR1寄存器uWork=SPSD0;uWork|=0 x2800;/设置:XIOEN=1 FSXM=1,使能通用I/O功能,FSX用于输出SPSD0=uWork;while(1)SPSA0=0 x0e;/设置McBSP0的PCR1寄存器uWork=SPSD0;uWork|=0 x2800
13、;uWork=0 x8;/FSXP=FSXP,BFSX0引脚状态取反SPSD0=uWork;Delay(4096);6.2 程序设计示例27首都师范大学信息工程学院三、程序源代码整个工程只包含有两个文件,一个为GPIO.c文件,该文件实现了整个功能要求,另一个为GPIO.cmd,该文件实现实验箱存储器内存空间分配。6.2 程序设计示例28首都师范大学信息工程学院6.2 程序设计示例GPIO.c源代码如下:#define SPSA0*(unsigned int*)0 x38#define SPSD0*(unsigned int*)0 x39#define REGISTERCLKMD(*(unsi
14、gned int*)0 x58)ioport unsigned char port8000;ioport unsigned char port8001;ioport unsigned char port8002;ioport unsigned char port8007;#define CTRGR port8000#define CTRKEY port8001#define CTRLCDCMDR port8001#define CTRLCDCR port8002#define CTRCLKEY port8002#define CTRLR port8007void Delay(unsigned
15、int nTime);29首都师范大学信息工程学院6.2 程序设计示例main()unsigned int uWork;REGISTERCLKMD=0;CTRGR=0;CTRGR=0 x80;CTRGR=2;CTRLR=0;CTRLR=0 x40;uWork=CTRCLKEY;SPSA0=1;uWork=SPSD0;uWork&=0 xfffe;SPSD0=uWork;SPSA0=0 x0e;uWork=SPSD0;uWork|=0 x2800;SPSD0=uWork;30首都师范大学信息工程学院while(1)SPSA0=0 x0e;uWork=SPSD0;uWork|=0 x2800;uW
16、ork=0 x8;SPSD0=uWork;Delay(4096);void Delay(unsigned int nDelay)int i,j,k=0;for(i=0;inDelay;i+)for(j=0;j PRAM PAGE 0.data :PRAM PAGE 0.cinit :PRAM PAGE 0.switch:PRAM PAGE 0.const :DRAM PAGE 1.bss :DRAM PAGE 1.stack :DRAM PAGE 1.vectors:VECT PAGE 0通过设置CCS在硬仿真(Emulator)方式下运行,编译、下载和运行程序后,可以观察到位于“交通灯”模块
17、的“北”侧红色发光二极管定时闪烁。33首都师范大学信息工程学院混合编程法成为开发混合编程法成为开发TMS320C54x DSPTMS320C54x DSP应用程序的常用方应用程序的常用方法。其基本形式有如下三种:法。其基本形式有如下三种:1、连接独立的C语言模块和汇编语言模块;2、在C语言中嵌入汇编语句;3、手工修改C程序编译后的汇编程序;这种方法对程序员水平要求较高,通常不建议采用。6.3 C语言和汇编语言混合编程34首都师范大学信息工程学院一、一、独立的独立的C C模块和汇编模块接口模块和汇编模块接口混合编程方法是分别独立编写汇编程序和C程序,编译或汇编得得到各自的目标代码模块,用链接器将
18、C模块和汇编模块链接起来。通过这种方法,C程序可以调用汇编程序,并且可以访问汇编程序中定义的变量。同样,汇编程序也可以调用C程序或访问C程序中定义的变量。混合编程方法要求用户必须自己维护各汇编模块的入口和出口代码,自己计算传递的参数在堆栈中的偏移量,工作量稍大,但能做到对程序的绝对控制。6.3 C语言和汇编语言混合编程35首都师范大学信息工程学院6.3 C语言和汇编语言混合编程在编写 C 程序和汇编程序时,必须遵循有关的调用规则和寄存器规则。1.1.寄存器规则寄存器规则在在C C 环境下严格约定了寄存器规则。它明确了编译器如何环境下严格约定了寄存器规则。它明确了编译器如何使用寄存器以及交叉调用
19、时如何保护寄存器。使用寄存器以及交叉调用时如何保护寄存器。调用函数时调用函数时,被调用函数负责保护某些寄存器被调用函数负责保护某些寄存器,这些寄存器这些寄存器不必由调用者来保护。不必由调用者来保护。如果调用者需要使用没有保护的寄存器如果调用者需要使用没有保护的寄存器,则调用者在调用函则调用者在调用函数前必须对其予以保护。数前必须对其予以保护。36首都师范大学信息工程学院6.3 C语言和汇编语言混合编程2.2.函数调用规则函数调用规则参数传递局部帧的产生函数返回37首都师范大学信息工程学院6.3 C语言和汇编语言混合编程二、二、从从C C程序中访问汇编程序变量程序中访问汇编程序变量根据变量和常数
20、定义的位置和方法不同,可分为三种情况:1.1.访问在访问在.bss .bss 段中定义的变量段中定义的变量 。实现方法如下:(1)采用.bss 命令定义变量;(2)用.global 将变量说明为外部变量;(3)在汇编变量名前加下划线“”;(4)在 C 程序中将变量说明为外部变量,然后就可以像访问普通变量一样访问它。38首都师范大学信息工程学院6.3 C语言和汇编语言混合编程2.2.访问访问在汇编程序中用块定义的常数表(如用于在汇编程序中用块定义的常数表(如用于FIRFIR、IIRIIR滤滤波器等的系数表)。波器等的系数表)。访问时首先在汇编程序中说明一个指向该表起始的全局符号,然后用.sect
21、定义一个块。在C程序中则定义个指向该系数表的指针。同时在 C 程序中用extern 予以声明。3.3.访问访问.set.set和和.global.global定义的全局常量。定义的全局常量。由于符号表包含的是常数值,而编译器并不能区分哪些符号表包含的是变量的地址,哪些是变量的值。因此在 C 程序中访问时需要在常数名前加地址操作符&,这样才能得到常数值。39首都师范大学信息工程学院6.3 C语言和汇编语言混合编程三、三、在在C C程序中直接嵌入汇编语句程序中直接嵌入汇编语句需注意的是不能破坏C语言的运行环境。格式如下:asm (“汇编语句”);例如:asm(“ssbx intm”);/*打开数据
22、口*/asm(“rsbx xf”);注意:括号中的汇编语句必须以标号、空格、tab、分号开头;不要破坏 C 环境,因为 C 编译器并不检查和分析嵌入的汇编语句;插入跳转语句和标号会产生不可预测的结果;汇编语句不要改变 C 程序中变量的值;不要用汇编语句中加入汇编器选项而改变汇编环境。40首都师范大学信息工程学院6.3 C语言和汇编语言混合编程举例,举例,定时器定时器0 0中断中断服务程序服务程序1.对中断进行初始化,在C语言程序中对中断进行初始化的程序片段如下:asm(“ssbx intm“);/*开放所有可屏蔽中断,此处就可以利用直接嵌入的方式*/IMR=0 x0008;/*开放定时器0中断
23、*/IFR=0 xffff;/*清除所有尚未处理完的中断*/2.编写中断服务程序。两种方式可以用来定义中断函数。41首都师范大学信息工程学院6.3 C语言和汇编语言混合编程Interrupt void userfunction(void).这种方式下C编译器自动保护各寄存器的值,中断响应后自动恢复。userfunction定时器0的中断服务函数名,可由用户任意更改,但要与第三步中名字相对应。void c_intxx(void)其中,xx代表0099之间的两位数,如c_int01就是一个有效的中断函数名。42首都师范大学信息工程学院6.3 C语言和汇编语言混合编程3.建立中断矢量表。为了能够让相应的中断信号调用不同的中断函数,还需要在中断向量文件(vector.asm)中定义中断向量表。如下例所示:.ref _c_int00 .ref _ userfunction.sect vectors RS:BD _c_int00 NOPNOP.TINT0:BD _ userfunction;定时器0中断 NOP NOP .end43首都师范大学信息工程学院