DSP2812应用实验例程.docx

上传人:b****5 文档编号:28957750 上传时间:2023-07-20 格式:DOCX 页数:18 大小:57.21KB
下载 相关 举报
DSP2812应用实验例程.docx_第1页
第1页 / 共18页
DSP2812应用实验例程.docx_第2页
第2页 / 共18页
DSP2812应用实验例程.docx_第3页
第3页 / 共18页
DSP2812应用实验例程.docx_第4页
第4页 / 共18页
DSP2812应用实验例程.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

DSP2812应用实验例程.docx

《DSP2812应用实验例程.docx》由会员分享,可在线阅读,更多相关《DSP2812应用实验例程.docx(18页珍藏版)》请在冰豆网上搜索。

DSP2812应用实验例程.docx

DSP2812应用实验例程

§7.2应用实验例程

在这一节里,咱们将以TMS320F2812片内外设的应用为主,介绍一部份以F2812eZdspTM最小系统为基础的实验例程(部份实验需要进行硬件扩展)。

这些例程源代码的要紧部份都是采纳C语言编写的。

若是读者需要利用汇编或C++语言来开发F2812的软件程序,请参考相关的应用手册。

7.2.1实验例程中的文件

安装完CCS,在利用实验例程前,必需先安装好(TI网站上提供免费下载)紧缩包中的程序,那个软件程序会把包括C281x寄放器声明和概念的C/C++头文件、源文件和一些外设例程安装到硬盘上。

这些头文件(主若是片内各外设寄放器对应的结构体及共用体类型的声明)、(寄放器变量的概念)和(连接器命令文件)都是下面例程中不可缺少的部份(它们位于….\tidcs\c28\dsp281x\v100\DSP281x_headers\目录下,要紧用于片内系统及外设寄放器变量的声明、概念和定位),同时一些通用的系统或外设初始化源代码文件(比如、、等)也将在一些例程顶用到。

一样来讲,下面例程的工程中除主程序源文件外,还包括如下文件:

前面提到的用于声明寄放器变量结构的头文件(每部份外设或系统功能寄放器组都对应一个头文件),利历时只要在程序中包括就能够包括其它所有的系统及外设寄放器头文件。

那个地址需要注意的是,所有的头文件都不是手工添加的工程中的,只要在源代码文件中加入头文件包括命令,编译连接时会自动添加这些头文件到工程中。

由于同一片内外设模块中的寄放器地址大体上都是持续的,如此这些寄放器变量就能之外设模块为单位配置到一系列输出段,该文件的作用就是依照各寄放器的实际地址将这些段映射到实际的存储器空间中。

将所有存储器映射的系统及外设寄放器概念成全局变量(这些变量的数据结构已经在对应的系统及外设头文件中声明过),并将这些变量分派到.cmd文件中对应的输出段中。

针对在RAM中运行的程序而编写的链接器命令文件,在的安装目录下能够找到,也能够自己从头编写一个。

C语言实时运行库文件。

7.2.1.1CMD文件简介

下面咱们以为例,简单介绍一下CMD文件的组成、大体伪指令的含义和用法:

CMD文件的内容要紧分为以下两部份:

MEMORY

以伪指令MEMORY开始的部份是用来概念目标板上存储器资源的散布,即有哪些存储器能够用,该文件中的这部份内容如下所示:

MEMORY

{

PAGE0:

/*此处,片内的H0被分成了PAGE0和PAGE1两部份*/

/*BEGIN区域在“从H0引导”模式下利用*/

/*只有在从XINTF区域7中开始引导时,才将复位向量加载到RESET区域中,*/

/*不然,复位向量会从BootROM中取得*/

RAMM0:

origin=0x000000,length=0x000400

BEGIN:

origin=0x3F8000,length=0x000002

PRAMH0:

origin=0x3F8002,length=0x000FFE

RESET:

origin=0x3FFFC0,length=0x000002

PAGE1:

RAMM1:

origin=0x000400,length=0x000400

DRAMH0:

origin=0x3f9000,length=0x001000

}

其中,PAGE0代表的是程序存储区,PAGE1指数据存储区,RAMM0和BEGIN等都是程序存储器中各个自概念子区域的名称,数据存储区同理。

每一个子区域内的空间是持续的,后面的参数别离指示其起始地址和长度。

区域间能够是离散或持续(有时为了编程思路的清楚化,对实现不同功能的持续存储区域别离独立取名)。

若是某一段物理存储器没有在MEMORY伪指令后进行配置,那么链接器可不能将任何程序或变量定位到那里。

SECTIONS

而以伪指令SECTIONS开始的部份则用来操纵程序文件中代码和数据输出段在存储器区域(必需是在MEMORY部份概念好的子区域)中的定位,该部份内容如下:

SECTIONS

{

/*以下是用于“从H0引导”模式的设置:

*/

/*将codestart代码的输出段)定位到H0的起始处*/

codestart:

>BEGIN,PAGE=0

ramfuncs:

>PRAMH0PAGE=0

.text:

>PRAMH0,PAGE=0

.cinit:

>PRAMH0,PAGE=0

.pinit:

>PRAMH0,PAGE=0

.switch:

>RAMM0,PAGE=0

.reset:

>RESET,PAGE=0,TYPE=DSECT/*没有利用*/

.stack:

>RAMM1,PAGE=1

.ebss:

>DRAMH0,PAGE=1

.econst:

>DRAMH0,PAGE=1

.esysmem:

>DRAMH0,PAGE=1

}

那个地址.text代表程序中的可执行代码段,后面的指令参数表示此段代码程序将被装载到程序存储器的PRAMH0区域中,而.cinit段的存储器区域定位将紧接着.text段后面。

同理,以.stack和.ebbs为首的指令参数表示的是堆栈和未初始化变量在数据存储器DRAMH0区域中的定位。

MEMORY部份描述的是用户如何给目标存储器进行分类、分区,其描述和概念的对象必需是实际存在的物理存储器;而SECTIONS部份确实是规定目标程序代码、变量将被装载或是定位到存储器的哪个区域,其操纵的对象是源代码程序的各个输出段,其定位的范围只能是MEMORY部份中概念好的存储器区域。

需要注意:

从CCS开始才许诺向一个工程里添加多个CMD文件。

那个地址仅仅给出了一个CMD文件最简单的应用,并介绍了其中最大体和最经常使用伪指令的用法,若是读者需要进一步了解CMD文件中的其它伪指令及应用,请参考28x的汇编语言工具利用手册中链接器一章。

7.2.1.2寄放器变量的声明和概念文件

下面咱们以通用I/O口数据寄放器变量为例,通过其寄放器变量的声明(.h)和概念文件(.c)简单介绍一下寄放器变量型数据结构的声明、寄放器变量对象的概念、输出段的映射和寄放器变量成员的访问方式:

在中有如下声明:

structGPADAT_BITS{

Uint16GPIOA0:

1;./省略

}

SECTIONS

{

…...

=....

前者表示的是单独访问GPADAT寄放器的第4位GPOIB4,同理也能够单独访问16位数据中的任何一名;后者表示将GPADAT整体当做一个16位无符号整型数据来访问。

一样来讲,在声明寄放器变量结构时,都会依照功能将各个位域描述成整体的结构成员(一些寄放器中可能需要几个位组合起来利用,若是是如此的话就将这几个位作为一个局部整体声明成寄放器的一个成员),因此咱们就能够以结构体成员的形式来访问寄放器的某一名或某几位:

其中寄放器组是外设寄放器组结构体类型(包括多个寄放器,可能还有保留区域)的变量名,寄放器是寄放器组数据结构声明中的成员名(结构体),bit是寄放器以位域结构体形式进行访问时利用的成员名(共用体),功能位是该位域结构体中的具体成员名(结构体);同理用寄放器组.寄放器.all就能够以16位无符号数整体的形式访问寄放器,那个地址的all是寄放器以16位无符号数整体形式被引历时所利用的成员名(共用体)。

相较以前利用的宏概念方式,这种方式通过结构体、共用体和全局变量实现了对寄放器位域的独立访问,为寄放器提供了加倍灵活和高效的访问手腕,也大大提高了代码的可读性、靠得住性和可保护性。

7.2.2实验程序的要紧代码

7.2.2.1实验一.数字I/O

此实验工程的要紧功能是通过通用I/O口的输入输出功能来操纵LED灯的显示,通过此例程能够加倍深切地明白得通用I/O口的配置和利用。

具体的实现进程参见程序中的注释。

如前所述,工程中需要包括以下几个大体文件:

、、和(头文件会依照源程序中的文件包括命令自动添加到工程中。

可是,若是头文件不在当前目录下,那么必需在BuildOptions里Compiler属性页Preprocessor项中的IncludeSearchPath框中设置好文件目录,如…\tidcs\c28\dsp281x\v100\DSP281x_headers\include)等。

其主程序源代码文件的内容如下:

7.2.2.2#include""F2812的中断系统

此实验的要紧目的是利用按时器中断代替软件延时程序操纵LED灯的显示频率。

通过CPU按时器能实现的最简单任务是产生一个周期性中断请求,通过其中断效劳程序,咱们就能够完成各类周期性的任务,并能够改变全局变量的值。

若是在中断效劳程序中对某个全局计数器变量进行递增操作,那么,在不溢出的前提下,那个变量就能够用来表示程序自初始化完成后所经历的按时周期数(执行时刻)。

通过此例程能够进一步把握CPU按时器的利用及中断系统的配置操作。

具体实现进程如下。

在上一个实验工程所包括文件的基础上,加入以下文件:

、、和(上述文件都在紧缩包中的安装好后的….\tidcs\c28\dsp281x\v100\DSP281x_common\source目录下),同时还需要从头编写或修改主程序源文件。

下面先介绍这些新加文件的内容和作用。

因为程序中包括的并非在当前目录或设置好的头文件目录下,因此还要在BuildOptions里Compiler属性页Preprocessor项中的IncludeSearchPath框中为其设置目录,该文件位于…\tidcs\c28\dsp281x\v100\DSP281x_common\include。

设置时多个途径间要用分号隔开。

中包括如下源代码:

7.2.2.3#include""0”0”事件治理器

此工程的要紧功能是利用F2812的事件治理器模块来产生必然频率的PWM信号,通过此例程能够初步了解事件治理器模块的配置和应用流程。

下面通进程序介绍其具体实现进程。

在实验二工程所含文件的基础上,只需要从头编写主程序源文件或将其内容修改如下:

#include""

voidConfigureGpio(void);

voidInitSystem(void);

interruptvoidcpu_timer0_isr(void);

voidmain(void)

{

unsignedinti;

unsignedlongtime_stamp;

intfrequency[8]={2219,1973,1776,1665,1480,1332,1184,1110};

InitSystem();

ConfigureGpio();

InitPieCtrl();

InitPieVectTable();

EALLOW;

=&cpu_timer0_isr;

EDIS;

InitCpuTimers();

ConfigCpuTimer(&CpuTimer0,150,50000);

=1;

IER=1;

EINT;

ERTM;

7.2.2.4ADC

此工程的要紧目的是利用F2812的ADC模块来按时搜集两路输入电压信号,信号源采纳标准信号发生器(注意:

信号幅值不能超过),搜集完成后就能够通过CCS提供的图形工具来显示搜集到的信号波形。

一样ADC的输入电压值Vin(模拟量)和采样值D(数字量)的关系如下:

在咱们的eZdsp2812实验系统中,ADC的VREF-端被接到0V,VREF+被接到,同时那个内部ADC的分辨率是12位的(n=12),因此上述关系就变成了:

在实验二工程所含文件的基础上,去掉文件,加入以下文件:

、、和(上述文件仍然在中的安装目录….\tidcs\c28\dsp281x\v100\DSP281x_common\下),同时还需要从头编写主程序源文件或修改其内容。

下面先介绍这些新加文件的内容和作用。

文件中要紧包括初始化ADC模块的代码,要实现对ADC模块的正确上电,先应该通过ADCENCLK位使能时钟信号,接着对带隙参考源电路上电。

延迟一按时刻(那个地址取8ms)后对ADC模块的其余部份上电。

ADC完成上电后,还要等待20us,才能进行第一次模数转换。

请勿必注意:

必需确保头文件中概念的CPU_RATE(以ns位单位)和当前CPU时钟的实际周期一致。

具体内容如下:

7.2.2.5#include""8000L20L

SPI

本实验例程的目的是实现F2812和串行DAC(TLV5617)之间的SPI通信,利用DAC输出两路锯齿波信号。

图7-2-1TLV5617和F2812的硬件连接

TLV5617是具有两个输出通道,10位分辨率的串行DAC芯片,它与F2812的接口关系如图7-2-1所示,其中DAC的片选信号(

)与GPIO的D0引脚相连。

TLV5617是一个“只监听”的SPI设备,因此它可不能发数据给DSP,其REF引脚上的电压决定了其输出电压的满量程值。

要注意,尽管它是具有10位分辨率的DAC,可是它通过内部乘法器实现乘2操作,因此其输入的数字量应该处于0到511之间。

在TLV5617片选信号有效的情形下,才开始有效帧数据的传输,传输进程中,最高位先传,数据位的有效信号应该超前SCLK信号半个时钟周期。

在实验二工程所包括文件的基础上,从头编写主程序源文件或修改其内容如下:

#include""

.B0)

7.2.2.6=1;004FSCI

本实验例程的要紧目的是应用F2812的SCI模块,实现DSP与PC机的数据通信。

具体接口电路如图7-2-2所示,PC机和DSP系统通过标准的DB9接口相连。

图7-2-2F2812的RS-232硬件接口

在PC机中,咱们利用Windows操作系统自带的串口通信程序-超级终端,在WindowsXP中该程序能够通过如下方式找到:

选择开始->所有程序->附件->通信->超级终端,打开后创建一个新的连接,并为其取名为“SCI-COM”,接着在“连接时利用”列表框当选择COM1,最后在COM1属性对话框中设置如下:

每秒位数:

9600

数据位:

8

奇偶校验:

停止位:

1

数据流操纵:

程序方面,在实验二工程所含文件的基础上,去掉文件,然后从头编写主程序源文件或将其内容修改如下。

#include""

voidConfigureGpio(void);

voidInitSystem(void);

voidSCI_Init(void);

interruptvoidSCI_TX_isr(void);

interruptvoidSCI_RX_isr(void);

n\r"};

voidmain(void)

{

InitSystem();

7.2.2.7实验七FIR

TI提供的C28x滤波器库包括以下部份

(1)用于计算加窗FIR和IIR滤波器系数的MATLAB脚本

(2)3个滤波器模块:

FIR1六、IIR5BIQ16和IIR5BIQ32

(3)可在C语言源程序中挪用的汇编函数,它们具有如下特点:

与C28xDSP内部的硬件特点相适应

利用高效的双乘加指令

具有ANSI-C标准的函数挪用接口

C28x滤波器库的安装程序是(TI网站提供下载)紧缩文件内的程序。

设计数字滤波器时,超级重要的一个步骤是确信滤波器参数,其中会涉及到很多相关的背景知识,尤其是数字信号处置方面的课程。

在本实验中,咱们将通过库函数安装包中提供的matlab脚本程序来生成。

在该.dat文件中通过宏概念命令#defineFIR16_COEFF{…..}来使其它C源程序能够方便地利用这些滤波器系数。

为了在C编程环境中更方便地利用这些库,所有相关的库函数(指针)及变量会被包括到一个接口数据结构中,实际应历时所有的初始化和运算都是通过那个数据结构的对象来实现。

typedefstruct{

long*coeff_ptr;//指向滤波系数的指针

long*dbuffer_ptr;//延迟缓冲器的指针

intcbindex;//圆形缓冲器的索引值,

//初始化函数会依照滤波器的阶数计算该值

intorder;//滤波器阶数,范围1~255

intinput;//最新输入的采样值

intoutput;//滤波器的输出

void(*init)(void*);//指向初始化函数的指针

void(*calc)(void*);//指向主计算函数的指针

}FIR16;

那个滤波器数据结构模块利用C语言中的结构体将各类变量及函数指针集成到一个独立的数据结构中,从而大大提高了程序的重用性和可保护性,TI提供的其他应用库也都采纳基于这种包括相关变量和函数指针的结构体,例如,信号发生库、FFT库、数据记录库等。

利用这些库开发软件程序时,一样都要先初始化那个结构体(包括赋变量初值和挪用初始化函数等),然后才能利用那个结构体来完成相应的工作(包括改变相关变量的值和挪用计算函数等)。

本实验通过ADC模块来采样信号发生器输出的方波信号,并对该采样值进行FIR滤波,最后通过CCS提供的波形显示工具观看滤波后的波形。

在ADC实验工程的基础上,成立一个包括如下内容的CMD文件,并将其添加到工程中。

SECTIONS

{

firldbalign(0x100)>DRAMH0PAGE=1//将延迟缓冲器数组定位到片内的H0中

firfilt:

>DRAMH0PAGE=1//将FIR16结构的对象定位片内的H0中

}

在BuildOptions中的Compiler属性页下,Preprocessor项中的IncludeSearchPath框中加入头文件所在的目录(也确实是的安装目录)。

在BuildOptions中的Linker属性页下,Basic类别里的LibrarySearchPath框中设置好库文件所在的目录,同时在IncludeLibrarys中填入。

(或直接通过Project->AddFiletoProject直接添加库文件)。

最后,源文件中声明部份和主程序修改如下:

#include""

#include<>//包括FIR滤波库的头文件

#include"//包括由matlab脚本程序产生的FIR滤波系数文件

#defineFIR_ORDER50//概念滤波器阶数

#pragmaDATA_SECTION(lpf,"firfilt");

FIR16lpf=FIR16_DEFAULTS;//概念FIR16结构的滤波器对象,并赋以默许的初值

#pragmaDATA_SECTION(dbuffer,"firldb");

longdbuffer[(FIR_ORDER+2)/2];//概念延迟缓冲器数组

constlongcoeff[(FIR_ORDER+2)/2]=FIR16_COEFF;//概念滤波系数数组(常数)

voidConfigureGpio(void);

voidInitSystem(void);

interruptvoidadc_isr(void);//ADC中断效劳程序的函数原型

//全局变量的概念及初始化

intadcInput0[1024];

intadcInput1[1024];

intfirOutput[1024];

unsignedintadcCount=0;

main()

{

//…

//以上系统及外设初始化代码同ADC实验主程序源程序while循环前的代码,

//接下来添加如下滤波器对象初始化代码

=dbuffer;//关联滤波器对象和延迟缓冲器数组

=(long*)coeff;//关联滤波器对象和滤波系数数组

=FIR_ORDER;//修改滤波器阶数

(&lpf);//挪用滤波器初始化函数

while

(1)

{

//通过LED显示当前循环采样指针在采样数组中的大概位置

//此处也能够直接采纳一个空循环

=LED[adcCount>>7];

}

}

//同时ADC中断函数的内容修改如下:

voidinterruptadc_isr()

{

//将采样值送入寄存采样值的循环数组中

adcInput0[adcCount]=>>4;

adcInput1[adcCount]=>>4;

adcInput1[adcCount]-=2047;//转化为12位有符号数

=adcInput1[adcCount];//向滤波器对象输入数据

(&lpf);//挪用滤波器的计算函数

firOutput[adcCount]=;//从滤波器对象输出结果

//实现数组的循环访问

adcCount++;

if(adcCount>1023)adcCount=0;

//从头初始化ADC采样序列

=1;//复位SEQ1

=1;//清除中断位INTSEQ1

=PIEACK_GROUP1;//清除PIE分组1的中断响应位

}

源程序的其它部份完全和ADC实验一样。

程序运行后,也和ADC实验一样,观看到的波形极可能是不持续的。

咱们能够利用条件断点功能,在adcCount=1023或0时停止程序的运行,观看通过FIR滤波后的波形。

在本节最后,咱们给出TI提供的C291xC/C++头文件和外设例程(通过中的程序能够将这些程序文件安装到硬盘中)推荐软件流程图,如图7-2-3所示。

改程序中所有的外设例程都是参照与之类似的流程来设置和应用DSP的。

另外还给出表7-2-1,该表包括了该程序中所有的例程名称及其描述,如此程序员在开发自己的2812应用程序时,就能够够依照需要参考C291xC/C++头文件和外设例程中提供的源程序,同时它关于学习2812软件编程的人来讲更是一项超级有效的资源,希望读者能够好好利用。

表7-2-所包括的例程及其描述

工程所在目录的名称

描述

adc_seqmode_test

ADC排序模式测试例程,采集A0通道的数据并存入缓存中

adc_seq_ovd_tests

ADC测试例程,使用了排序器忽略功能

adc_soc

双通道的ADC测试例程:

ADCINA3和ADCINA2。

EVA用来产生周期性的ADCSOC信号,来启动SEQ1的转换。

cpu_timer

CPU定时器0的测试例程:

在其中断服务程序中递增计数器变量。

ecan_back2back

eCAN自测试模式例程:

高速不间断发送eCAN数据。

ev_pwm

事件管理器PWM例程:

利用事件管理器的定时器来产生PWM波形。

用户可以通过示波器来观察其波形。

ev_timer_period

事件管理器定时器例程:

利用事件管理器的定时器来产生周期定时中断,在其中断服务程序中递增计数器变量。

flash

该例程将演示如

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1