中文版C281xCC++的头文件_第1页
中文版C281xCC++的头文件_第2页
中文版C281xCC++的头文件_第3页
中文版C281xCC++的头文件_第4页
中文版C281xCC++的头文件_第5页
已阅读5页,还剩36页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中文版C281xC/C++的头文件目录:1简介DSP281XC/C++头文件和外设例程程序包安装目录结构2外设位域结构编程方法传统#define方法位域和结构方法外设寄存器结构增加位域使用Bits-Fields编程时的Read-Modify-Write考虑使用BRs-Fields编程时的代码大小考虑3外设范例开始例程结构包含文件源代码连接命令文件例子编程流程包含的例子从FLASH开始执行例子4逐步使用头文件和范例代码准备包含DSP281X外设头文件包含通用范例代码5常见问题和处理read-modify-wriye的影响多标志位寄存器写1清零VolatileBits寄存器6版本变化7包含内容支持DSP281X的头文件DSP281X的头文件一主函数DSP281X的头文件一外设位域和寄存器结构定义文件CCS的,ge!文件变量名和数据段通用范例代码支持的外设中断扩展模块特殊外设文件有用函数源文件范例连接.cmd文件1简介TI针对‘DSP281X系列DSP芯片使用通用的C/C++语言编写了外设头文件和范例程序。这些代码可以作为应用的工具或根据使用者的需要而作为开发平台的基础。传统的编程方法需要程序员自行编写寄存器的H文件和所需的片内外设的初始化、配置文件,与传统的编程方法比较,基于C281XC/C++的头文件提供了软件开发的程序框架,其中包含有寄存器结构定义文件、外设头文件和器件的宏与类型定义等系统所需的各种文件。通过在那新的或原有的工程文件使用外设头文件,开发者可很容易的使用C或C++语言来控制片上外设。除此之外,程序员可以改动工程中需要用到的外设和主控制程序,还可以从提供的范例代码中挑选有用的函数,丢弃那些不需要的函数。这样程序编写简便、结构清晰、易于修改和维护,同时由于框架不需做太大的变动,程序员可以将精力集中于算法的研究,从而加速项目或产品的研发进度。注意:本章没有提供使用CCS来编写C或连接或汇编代码的向导。前提是用户已经有了281x的硬件平台且通过计算机连接到CCS软件。使用者应该了解怎么使用CCS通过JTAG下载程序并能进行基本的DEBUG操作。DSP281XC/C++头文件和外设例程程序包安装在使用DSP281XC/C++头文件前,计算机中必须安装有CCSFOR200〇,然后必须安装DSP281XC/C++头文件和外设例程程序包,此文件可在TI网址下载,安装程序包为sprc097.rar。解压缩后直接点击安装,显示如下画面;

按提示继续操作,选择相应目录点击Next安装完成。在ticds\c28\dsp281x\v100\doc目录下有相应帮助说明。目录结构安装后,可以看到C281XC/C++头文件和外设例程清晰的目录结构。目录结构当前的版本为V1.00,从结构图可以看出C/C++头文件、外设例程和共享源代码分别单独存放。这种文件分类方法使查找文件方便,易于使用者快捷的将这些文件融合到新的或原来的工程文件B〇DSP281x日白7100docBしDSP281x_common白cmdゝinclude〇source画二)DSP281x_examplesBjDSP281x_headerscmdgelincludesource表1DSP281X主目录结构目录<base>默认安装路径。<base>\doc文档(包含版本更新信息)<base>\DSP281xheaders合并外设头文件到新工程文件所需的文件。头文件的bkfield结构方法的描述请见第3节如何将外设头文件添加到新的或已有工程文件请见第4节<base>\DSP281x_examples基于DSP281X头文件的CCS编译的程序代码这些例程说明了281x片上外设的配置关于这些例程的综述请见第3节<base>\DSP281x_common通过在DSP_281X外设程序中使用共享源文件来说明使用DSP_281X外设头文件来完成各种任务。如对新的工程文件有帮助,可以随意使用这些文件。第6节给出了这些文件的列表。DSP281x_headersネロDSP281x_common目录下的源文件根据文件类型被进ー步分为各个子目录。表2列出了这些子目录及其文件的类型。子目录描述DSP281x_headers\cmd分配位域结构的连接命令文件,详见第2节DSP281x_headers\source需要并入新的或原有的项目文件的头文件的源文件DSP281x_headers\include281X片上外设的头文件子目录描述DSP281x_common\cmd281x的存储器命令范例文件DSP281x_common\source281x外设例程通用.h文件DSP281x_common\include281x外设例程通用,c文件2外设位域结构编程方法DSP281X头文件和外设例程使用bkfield结构方法来映射和访问基于281x的外设寄存器。本节介绍这种方法并与传统的#define方法进行了比较。传统#define方法传统使用C语言访问寄存器的方法是通过使用#define宏来创建每个寄存器的地址标志。例如:/*********************************************************************Traditionalheaderfile//MemoryMap//AddrRegister#defineCPUTIMERO_TIM(volatileunsignedlong*)OxOCOO//OxCOOTimerOCountLow//OxCOlTimer0CountHigh#defIneCPUTIMERO_TIM(volatileunsignedlong*)0x0C02//0xC02TimerOPeriodLow//0xCO3TimerOPeriodHigh#defineCPUTIMERO_TIM(volatileunsignedInt*)0x0C04//0XC04TimerOControl//0xC05reserved#defineCPUTIMERO_TIM(volatileunsignedint*)0x0C06//0xC06TimerOPre-scaleLow#defineCPUTIMERO二TIM(volatileunsignedint*)0x0C07//0XC07TimerOPre-scaleHigh这种#deMe的定义方法可以重复来定义每个外设的每个寄存器。即使是的几个同类外设,例如SCI-ASCI-B,每个寄存器都可以根据其地址被独立的分开。传统的#define方法的不足主要有以下几条:访问寄存器的每一位困难;不能在CCS的watchwindow看到寄存器的位变化;不能利用由CCS自动完成的代码向导的优势:对于相同外设,头文件的开发者无法利用代码重用的优势。位域和结构方法位域结构的编程方法使用C语言将同一类外设的所有寄存器规为ー组。然后连接器将每个C语言编写的外设寄存器结构体映射为存储器空间。这种映射允许编译器使用CPU的DP指针直接访问外设寄存器。除此之外,许多寄存器的位域也被定义了,这样编译器就可以直接读或操作寄存器内的单独位。外设寄存器结构节中使用#define方法定义了CPUTimer0寄存器。本节同样定义CPUTimer。寄存器,但是使用C语言结构体将CPUTimer寄存器统一定义。连接器将在内存中映射CPUTimer。的寄存器结构体。/*********************************************************************CPU-Timerheaderfileusingstructures*********************************・**•****•••************************/structCPUTIMER_REGSUint32TIM;//TimercounterregisterUint32PRD;//PeriodregisterUintl6TCR;//TimercontrolregisterUintl6rsvdl;//reservedUintl6TPR;//Timerpre-scalelowUintl6TPRH;//Timerpre-scalehigh);注意以下几点:寄存器名字出现顺序必须与其在内存中分配的顺序相一致。内存中保留的空间,在结构体中也用保留变量(rsvdlrsvd2)表示,除非占用保留空间,否则这些保留结构体成员不会被使用。Uintl6Uint32分别表示无符号16-bit,32-bit。在28x系列中,有unsignedint和unsignedlong两种类型。这主要是操作方便考虑,其相应的类型定义可以在DSP281X-Device,h中找到。寄存器文件结构体定义用来声明一个访问寄存器的变量。芯片的每个外设都需要这样定义。多个同类外设使用同样的结构体定义。例如,在某个器件有三个CPUTimer,则可以被定义为三个volatilestructCPUTIMER_REGS变量,如下:/・****•*・•*********************************♦*************************♦CPU-Timerheaderfileusingotructures******♦**********************♦**************************************/volatilestructCPUTIMER_REGSCpuTimerORegs;volatileatructCPUTIMER__REGSCpuTimerlRegs;volatileotructCPUTIMER_REGSCpuTimer2Regs;声明变量时关键字volatile很重要,关键字volatile将告诉编译器变量的内容能被硬件改变,这样编译器就不会优化使用volatile定义的变旦里。编译器使用DATA_SECTION宏将每个外设结构体的相应变量分配到数据段。下面的例子,变量CpuTimerORegs被分配到CpuTimerORegsFile数据段。

/********************************************************************♦DSP28lx_headers\source\DSP28lx_GlobalVariableDefs.c/*AssignthevariableCpuTimerORegstotheCpuTimerORegsFileoutputsectionusingthetpragmacompilerstatementCandC++usedifferentformsofthe#pragmastatementWhencompilingaC++program,thecompilerwilldefine_cplusplusautomatically*/usedbyC++usedbyCvariableCpuTimerORegsoftypeCPUTIMER_REGSTOC\o"1-5"\h\z#ifdefcplusplus usedbyC++usedbyCvariableCpuTimerORegsoftypeCPUTIMER_REGS#pragmaDATA_SECTION("CpuTimerORegsFile*)#else一 Z/#pragmaDATA_SECTION(CpuTimerORegs,"CpuTimerORegsFile");#endlfvolatilestructCPUTIMER_REGSCpuTimerORegs; //~//数据段再次为器件的每个外设寄存器结构体变量分配地址空间。每个结构体被分到其自己的数据段后,连接器直接映射每个数据段到内存映射寄存器,如下所示:/*********************************************************************DSP281x_headers\lnclude\DSP281x_Meaders_nonBIOS.cmd**************/MEMORY(PAGE1:CPU_TIMERO:origin=OxOOOCOO,length=0x000008SECTIONS(CpuTimerORegsFile:>CPUTIMER0,PAGE=1)一/♦CPUTimerOregisters通过将变量直接映射到相同的外设寄存器内存地址空间,开发者可以使用C语言访问所需的变量成员来访问寄存器。如想写CPU-Timer0TCR寄存器,则程序员不得不访问CpuTimerORegs变量中的TCR成员。♦User・〇source£ileCpuTimerORegs.TCR.all=TSS_MASK;//ExampleofaccessingtheTCRregister2.3增加某一位实际中可能要经常直接访问寄存器的中的某位。0281xC/C++头

文件和外设例程中使用位域结构编程方法对许多片上寄存器的位进行了定义。例如,可以对每个CPU-Timer寄存器的每个位定义。CPU-TimerControl寄存器的位定义如下:パ*******************************************************************♦DSP281Xheaders\Include\DSP28lxCpuTimers.hCPU-Timerheaderfile************************************レ*******************************/structTCRBITS{//bitsdescriptionUintl6rsvdl:4;//3:0reservedUintl6TSS:1;//4TimerStart/StopUlntl6TRD:1;//5TimerreloadUintl6rsvd2:4;//9:6reservedUlntl6SOFT:1;//10EmulationmodesUintl6PREE:1;//11Ulntl6rsvd3:2;//12:13reservedUlntl6TIE:1;//14OutputenableumtieTIP:1;//15Interruptflag);使用统一体声明寄存器的优点就是既可以使寄存器以位域结构体被访问,又可以使其被当作一个16位或32位的变量整体被访问。例如,timercontro!寄存器的统一体定义如下:/*********************************************************************DSP281Xheaders\include\DSP281x_CpuTimerfl.hCPU-Timerheaderfile***************************••••*************************************/unionTCR_REG{Uintl6 all;structTCR_BITSbit;);一旦每个寄存器的位域和统一体定义被确立,贝リCPU-Timer寄存器结构体则能以统一体的定义方式被访问。/********************************************************************♦DSP281x_headerB\include\DSP281x_CpuTimers.hCPU-Timerheaderfile********************************************************************/structCPUTIMER_REGS);union);unionTIM_GROUPTIM;//TimercounterregioterunionPRD_GROUPPRD;//Periodregisteruniontcr":REGTCR;//TimercontrolregisterUintl6rsvdl;//reservedunionTPRREGTPR;//Timerpre-scalelowunionTPRH_REGTPRH;//Timerpre-scalehigh这样在C语言代码中,就可以用位域或单独量来操作CpuTimer寄存器了。/**************************************************♦*****************♦User/asourcefile********•*************♦*******••*・••*・*********♦*************♦******/CpuTimerORegs.TCR.bit.TSS=1; //ExampleofaccessingasinglebitCpuTimerORegs.TCR.all=TSS_MASK;//Exampleofaccessingthewholeregister位域结构方法具有以下的ー些优点:使用者不需要定义标志就可以操作寄存器的位;在CCS的watchwindow可以直接查看寄存器文件和位:当使用CCS时,编辑器将会自动弹出你所要输入的结构/位成分提示列表;这种自动的提示使编写代码变得很容易,从而省去了查找寄存器和位名字文档的麻烦。使用位域编程时的Read-Modify-Write考虑当对寄存器内的某一位进行写操作时,硬件将会产生一次read-modify-write操作,就是说,寄存器的内容被读出,其中的一位被修改,然后整个寄存器内容再被写回。对于28x器件这些操作在ー个时钟周期即可完成。当寄存器内容被写回时,寄存器内其他位将会以原值写回。由于ー些寄存器不推荐使用位域方法访问,所以没有统一体定义。这些例外的寄存器是那些对查询(读)某位有益的寄存器,包括;当写1时即清除某位,如的事件管理标志寄存器;无论何时访问都需要以一定的方式写的寄存器,如看门狗控制寄存器。那些没有位或统一体定义的寄存器不能以.bit或.all访问,如下:*User*ssourcefileSysCtrlRego.WDCR=0x0068;使用位域编程方法时的代码量考虑使用位域定义访问寄存器使得代码易读、易修改、易维护。同时这种方法对访问或查询寄存器的某一位也非常有效。然而如果多次访问某ー寄存器,每次使用.bit将会比使用一次.all访问寄存器的代码多得多。例如:/*********************************************************************User'ssourcefile********************************************************************ノCpuTimerORegs.TCR.bit.TSS=1;//1=StoptimerCpuTimerORegs.TCR.bit.TRB=1;//1=reloadtimerCpuTimerORegs.TCR.bit.SOFT=1;//TimerFreeRunCpuTimer2Regs.TCR.bit.FREE=1;//TimerFreeRunCpuTimer2Regs.TCR.bit.TIE=1;//1=EnableTinierInterrupt.bit的方法使得代码易读易改,但代码量稍有增加。如果代码长短对程序很重要则可以使用.all结构方法一次写整个寄存器。/*********************************************************************User*ssourcefileハ******************************************************************/CpuTimerORegs.TCR.all=TCR_MASK;3外设实例在C281xC/C++HeaderFilesandPeripheralExamples^]DSP281x_examples\目录下有几个工程项目例程,这些例程使用DSP281xV1.00头文件配置片上外设。3.4节给出了例程的清单。3.1入门按以下步骤装载theDSP281XCPU-Timer例程作为开始。其他例子的调试步骤大同小异。.使用F2812eZdsp或其他的硬件平台,在同CCS相连接。.装载例程的GEL或工程项目文件每个例程都包含ー个CCS的GEL文件,这个文件自动装载工程项目、编译代码、配置观察窗。同样如不使用GEL文件可以直接装载エ程文件。按照以下顺序装载DSP281xCPU-Time啲GEL文件:a扌丁开CCS:File->LoadGELb浏览CPUTimer例程目录:DSP281x_examples\cpu_timerc选择并打开Example_281xCpuTimer,gel件d从CCS的GEL下拉菜单中选择DS尸287xCpuTimerExample->厶。aaLacaLBt//7cし尸rq/ec爆4戈并编译整个工程项ロ例程。3查看Example_281xCpuTimer.c原文件中main主文件最上面的注释文件Example_281xCpuTimer.c在main程序开始有简短的介绍,包括所有的设定、所需的硬件。4安装调试程序所需的硬件安装源文件中指出需备的硬件。DSP281xCPU-Timer例程只需要硬件处于""BoottoHO"方式。其他的例程可能需要额外的硬件配置,如将模式配置引脚短接或接高、接地。表3列出引导模式的设置,便于参考。对于使用F2812eZdsp的用户而言,可以选择相应的跳线来选择引到模式。关于‘281x引导模式更详细的信息可以参看TMS320F28xBootROMReferenceGuide(SPRU095).、Table3. 281xBootModeSettingsGPIOF4GPIOF12GPIOF3GPIOF2Mode1XXXBoottoflash0x3F7FF601XXCallSPIbootloader0011CallSCIbootloader0010BoottoHOSARAM0X3F80000001BoottoOTP0X3D78000000CallparallelbootloaderNote: X=Don'tCare5装载代码硬件安装配置完成后,从CCS的GEL下拉菜单选择DSP281xCpuTimerExample->Load_Code将.out文件下载到28器件内,在观察窗输入感兴趣的变量,复位然后执行代码到主程序开始的地方。每次当器件复位时,GEL文件会重新装载输出文件。如果不想这样,可以把GEL删掉,只要选择GEL文件,点击右键选择remove即可。6执行程序,在观察窗增加变量,检查内存内容7试验、修改、重新构建例程当打算对例程进行一些修改时,最好拷贝ー份完整的程序来修改或者至少对原始文件作个备份。TI提供的新的例程是以这些基本文件为基础的。3.2节和3.3节对程序结构和流程有更详细的描述。8从CCS中移除GEL文件或工程项目文件。移除GEL文件,只要选中文件名点击右键选择remove即可。例程中使用了theDSP281x_headers目录中的头文件和DSP287;gco/77/77OC目录中的共享文件。只是example目录下的文件针对不同的例子程序也就不尽相同。注意:多数的例程都使用位域的方法来访问寄存器。这样有利于更好的帮助使用如何去使用外设及器件。使用位域方法编程使得繁冗的代码易读易于修改。与.all方法比较只不过会增加些代码量。注意SPRC097文件中的例程文件关掉了编译优化器,如果需要可以重新设定编译环境,打开编译优化器。

每个例程都有非常简单的结构。其中包括独立的原代码、共享原代码、头文件和连接命令文件。Common(shared)SourceCodeUsedbymorethenoneexample.Containgenericfunctionsforsettingupperipherlstoadefinedstateorfunctionsthatmaybeusefultore-useindifferentapplicationsDSP281x_GlobalVanableDefscThissourcefileisrequiredtousetheDSP281xperipheralheaderfiles.臼总EMample_281xCpuTinief.p|t(Debug)Common(shared)SourceCodeUsedbymorethenoneexample.Containgenericfunctionsforsettingupperipherlstoadefinedstateorfunctionsthatmaybeusefultore-useindifferentapplicationsDSP281x_GlobalVanableDefscThissourcefileisrequiredtousetheDSP281xperipheralheaderfiles.LJDSP刷OSConfigLJGeneratedFilesffiロ(ncludeLJLbranes日ヨSource■DSP281x_CodeStartBi項DSP281xlcpuTimer$ct]DSP281x_DefauMsrct]DSP281x.Glob^/anableDefsc图DSP281x_PieCtrtc士]DSP281x_PieVectc< 二^^"*SharedSourceCode7]DSP281x.SysCbtc< 1因Example_281xCpuTmetc◄ ExampleSpecificSourceCodeJDSP281x_He«ders_nonBI0Scmd名F2812_EzDSP_RAMJnkcmd^^ DSP281x_Headers_nonBIOScmdLinkerfilerequiredbytheperipheralspecificheaderfiles.Memoryblockspecificlinkercommandfile包含文件所有的例程#include以下2个头文件。*DSP281x_exampleo\cpu_tiiier\Exaniple_281xCpuTinier.c#include"DSP28lx_Device.h" //DSP281XHeaderfileIncludeFile#include"DSP28lx_Exampleo.h" //DSP281XExamplesIncludeFileDSP281x_Device.h这个文件位于DSP281x_headers\include口录下。它需要使用DSP281X的外设头文件。这个文件包含所需的外设头文件和器件的宏与类型定义。DSP281x_Examples.h此文件定义了例程所需的参数。它不需要使用DSP281X的头文件,但是某些通用源代码要使用。这个文件在DSP281x_common\include目录下。源代码每个例程由相对独立的原代码组成,这个代码可以是通用的,也可以是共享的。DSP281x_GlobalVariableDefs.c使用DSP281X外设头文件的任何一个工程都必须包含这个源文件。在这个文件中,声明了外设寄存器的结构变量和数据段的分配。这个文件位于DSP281x_headers\source目录下。详细例程代码对某个具体的示例,这个文件是是特殊的,它的文件名有前缀Example_281xoExample_281xCpuTimer.c就是示例CPUTimer的具体文件,其它的例子中不使用这个文件。此文件位于DSP281x_examples\<example>目录下通用源代码剩下的源代码文件在示例程序中是共享的。这些文件包含外设通用函数或可利用的实用程序。共享源文件在DSP2812x_shared\source目录下。用户可以在原有工程文件或新的工程文件中选择、合并ー些或全部共享源文件。连接命令文件每ー个示例都使用两个连接命令文件。这些文件详细的说明了代码和程序段的存储位置。ー个连接文件用来将编译产生的段分配到片上存储区,另ー个用来分配使用DSP281X外设头文件编程所需的外设寄存器结构体的数据段。存储区连接分配:连接文件如表4所示,它用来分配片上存储段。这些连接文件在DSP281x_common\cmd目录下。每ー个实例将选择以下文件中的ー个,具体选择那ー个由示例中的存储器决定。表4 存储连接命令文件存储连接命令文件示例目录描述F2812_EzDSP_RAM_ink.cmdDSP281x_common\cmdEZdsp存储图只分配了SARAM的位置,无Flash,OTP或CSM密码保护位置F2810.cmdDSP281x_common\cmdF2810存储连接命令文件,包含所有的Flash,OTP和CSM密码保护存储位置F2812.cmdDSP281x_common\cmdF2812存储连接命令文件,包含所有的Flash,OTP和CSM密码保护存储位置F2812_Xintfroot.cmdDSP281x_common\cmd来自F812XINTFzone7的bootDSP头文件结构数据段分配:任何ー个使用DSP281X头文件外设结构的工程必须包含ー个连接命令文件,这个连接命令文件将外设寄存器结构数据段分配到正确的存储位置。在v.058的头文件中,位置分配是包含在存储连接文件中的。为了容许将头文件从源代码中分离出来,分配文件被分成一个单独的文件,如表5所示。表5DSP281x外设头连接命令文件DSP28IX外设头连接命令文件目录描述DSP281x_Headers_BIOS.cmdDSP281x_Headers\cmdLink.cmd分酉己BIOSエ程中的头文件变量。这个文件必须包含在任意ー个使用头文件的BIOS的工程中,详见4.2DSP281x_Headers_nonBIOS.cmdDSP281x_Headers\cmdLink.cmd分酉已BIOSエ程中的头文件变量。这个文件必须包含在任意ー个使用头文件的nonBIOS的工程中,详见4.2

在配置281x器件时,所有的示例程序都和以下推荐的流程相似。表1反应了大致的流程:BootROMorBootfromXINTFZone7Usedtore-directcodeexecutionfromthebootentrypointtotheCInitroutine.CodecanbeconfiguredtodisabletheWatchDogiftheWDistimingoutbeforemain()isreached.AssignedtotheBEGINsectionbythelinker.Locatedat0x3F8OOOforBoottoHOLocatedat0x3F7FF6forBoottoFlashCInitRoutine.TheCompiler'sboot.asmwhichis申 /automaticallyincludedwiththeruntimelibrary.c"init 口アThiswillsetOBJMODEto28x.InitPLL,TurnonPeripheralClocksandsettheclockpre-scalersDisabletheWatchDogConfigureGPIOPinstotheirperipheralfunctionorasaninputoroutputasrequiredbytheexample.InitalizetheentirePIEVectorTablewithpointers,todefaultInterruptServiceRoutines(ISRs)foundinDSP281x_Defaultlsr.c.ItisusefulfordebugpurposestohavetheentiretableinitalizedeveniftheISRisnotgoingtobeused.\RemapPIEvectorsusedbytheexampletoISR

functionsfoundwithintheexampleprogram.Initalizetheperipheralsasrequiredbytheexample.ゝEnabletherequiredPIEandCPUinterrupts.Anyadditionalcoderequiredfortheexample.Figure1.FlowforExampleProgramsDSP281xC/C++头文件和外设例程程序包所包含的例程表6包含的示例示例描述adc_seqmode_testADCSeq方式检测.通道AO连续转换,记录在存储器中adc_seq_ovd_tests使用排序ADC检测,超过芯片的C版本相应的特性。adc_soc使用ADCINA3和ADCINA2两通道做ADC转换。中断使能,使用SEQ1,EVA配置产生一个周期的ADCSOCocpu_timer配置cputimerO,在每次ISR中断服务程序里工作累加计数一次。ecan_back2backeCAN自检测模式例程。在高速的时候,用eCAN连续的传送数据ev_pwm事件管理器PWM示例。本程序使用EV定时器产生PWM波形。可以使用示波器来观测这个波形。ev_timer_period事件管理器定时器示例。本程序使用EVA和EVB定时器,在ー个周期溢出的时候,触发中断。每次中断服务程序中累加计数。flash将EV定时器例程从SARAM移到Flash。其中包含将程序从SARAM拷贝到Flash的相关步骤。为了更快的执行,也将部分中断服务程序从Flash复制到SARAMgpio_loopback通用10口回送检测。本程序中,将8位的GPIO口配置为输出,8位ロ配置为输入。配置为输出的管脚和输出的管脚形成ー个闭环。输出数据从输入管脚中读回。gpio_toggle使用DATA,SET/CLEAR和TOGGLE寄存器等不同的方法切换所有的10管脚。可以使用示波器观测这些管脚mcbspjoopback配置McBSP做为回送检测。使用查询来代替中断mcbsp_loopback_interrupts配置McBSP做为回送检测。使用中断和先进先出寄存器。run_from_xintf本示例说明使用F2812eZdsp开发板如何从XINTFzone7导入和配置XINTF存储器接口sci_autobaud外部连接SCI-A和SCLB,在两个外设之间传送数据。使用SCI的自动波特特性。在不同的波特率下做重复测试sci_loopbackSCI示例代码,使用SCI模块的回送测试模式传送数据。本程序使用位查询,而不是中断。scijoopback_interruptsSCI示例代码,使用内部回送测试模式,通过SCI-A传送数据。同时使用中断方法和先进先出寄存器。spi_loopbackSPI示例,使用外部冋送检测模式传送数据spi_loopback_interruptsSPI示例,使用外部回送检测模式传送数据。同时使用中断方法和先进先出寄存器。sw_prioritized_interrupts在大多数应用中,可以使用标准中断硬件优先级。本示例说明了如果有需要,可以使用ー种中断软件优先级的方法,watchdog说明喂狗和间接喂狗触发中断从Flash执行的例程大部分DSP281X示例属于“H0弓|导”模式,都是从SARAM开始执行的。下面的示例(DSP281x_example\Flash)在"flash弓|导"模式下,程序将从Flash开始执行。这个示例是事件管理定时器的例子,通过以下的改变使它从Flash开始执行。改变连接命令文件连接flash从工程文件夹中将F2812_281x_EzDSP_RAMJnk.cmd移去,添加F2812.cmd或F2810.cmd。F2812.cmd和F2810.cmd在DSP281x_common\cmd目录下〇.添?ロDSP281x_common\source\DSP281x_CSMPasswords.asrr^!j工程中。这个文件含有密码,此密码将被编程,放在CSM密码位置。建议在开发阶段将此密码设为OxFFFF,这样器件可以很容易打开。详细的信息可以参考TMS320F28xSystemcontrol和InterruptsReferenceGuide(SPRU078)..修改代码,拷贝那些从Flash的导入地址到它们在SARAM中的运行地址过程中必须在SARAM中运行的函数。特别的,flash等待状态初始化程序必须在SARAM外执行。在DSP281X的例程中,那些从SARAM执行的函数,通过下面所示的编译CODE_SECTION#pragma声明,已经被分配在ramfuns区段中。*DSP281Xcommon\source\DSP281x_SysCtrl.c*********7*********************7************************************/♦♦pragmaCODE_SECTION(InitFlash,"ramfuncs");然后,寄存器连接命令文件(如下所示)在ramfuns段中分配flash导入地址和SARAM的运行地址。/********************************************************************D£P28lx_common\1nclude\F2812.cmd********************************************************************/SECTIONS(ramfuncs:LOAD=FLASMD,RUN=RAMLO,LOAD_START(_RamfuncsLoadStart),LOAD2END(_RamfuncsLoadEnd),RUNSTART7_RamfuncsRunStart),PAGE=0)象上面的详细说明一样,连接器将特殊符号分配到固定的地址,如下:AddressSymbolLoadstartRamfuncsLoadStartLoadendRamfuncsLoadEndRunstartRamfuncsRunStart使用包含示例MemCopy程序或c库的标准mencopy。功能,这些符号能被用来从Flash到SARM拷贝函数.执行从flash到SARAM的拷贝功能,需包含示例MemCopy函数:a,添カ口DSP281x_common\source\DSP281x_MemCopy至リ工程项目中b,添加如下的函数原型到示例源文件中。在DSP28lx_Examples.h已经包含了。/********************************************************************DSP281x_conmon\lnclude\DSP281x_Exainples.h哀*******************************************************************/MemCopy(&RamfuncsLoadStart,iRamfuncsLoadEnd,iRamfuncsRunStart);c,添加以下的变量声明到源代码中,使编译器知道这些代码已经存在。连接命令文件为每ー个变量分配地址,如下所示,对DSP281X例程,这些已经在DSP281x_examples.h中完成。*DSP281Xcommon\lnclude\D£P281x_Examples.h********************************************************************/externUintl6RamfuncsLoadStart;externUintl6RamfuncsLoadEnd;externUlntl6RamfuncsRunStart;d.对每ー个需要从flash拷贝到SARAM的区,修改代码调用MemCopy函数即可。/********************************************************************DSP281x_examples\Flashsourcefile*★★★*♦****★*★*****♦★★★*★★★★★♦***★★★★**♦*★***♦♦♦*★*♦***★★*♦***♦*/MemCopy(&RamfuncsLoadStart,iRamfuncsLoadEnd,iRamfuncsRunStart);.修改代码,调用flash初始化程序:这个功能将设置flash的等待状态,使能Flash流水线模式/*********************************************************************DSP281Xperipheralexample.cfile********************************************************************/InitFlash();.“Flash引导”模式所需的跳接。引导模式的需要的跳接方式如下:表7281x导入模式设立GPI0F4GPI0F12GPI0F3GPI0F2Mode1XXXBoottoflash0x3F7FF601XCallSPIbootloader0011CallSCIbootloader0010BoottoHOSARAM0x3F800000Q1BoottoOTP0x3D78000000Callparallelbootloader汪忌:x=任意对那些使用F2812eZdsp开发板的用户,可以参考eZdsp'suser'sguide来选择导入模式的相应的跳线接法。如果想获得更详细的信息,可以参考“28lxbootmodesrefertotheTMS320F28xBootROMReferenceGuide(SPRU095)”.烧写编译后的程序可以使用Specturmdigital's站点的SDFlash工具。.在ccs中调试、下载工程,只选择File->LoadSymbols.在调试的工作环境下,当调试者不能或不需要下载目标代码时,比如代码在ROM或flash中是,只下载符号信息是十分有用的.这中工作方式从指定的文件中下载符号信息.4逐步使用头文件和范例代码按下面步骤将外围头文件和范例代码加入到自己的工程中。准备在开始将头文件和范例代码加到自己工程文件前,建议按以下几个步骤做好准备:.按步装载ー个范例工程按步装载ー个范例工程,以便熟悉头文件和范例代码。这ー点在第3章节已有描述。.为将要使用的源文件拷贝ー个副本—DSP281x_headers:合并头文件到新工程文件所需的代码。-DSP281x_common:用在范例工程文件的ー些共享源代码一DSP281x_examples:基于头文件和共享代码的范例工程文件包含DSP281X外设头文件将DSP281X头文件加入到工程中后,就可以在代码中采用位域结构的方法对DSP的外设

进行访问。在新的或原有的工程文件中添加头文件需执行以下步骤:3.将“DSP281x_DEVICE.h”这个文件加入到你的源文件中这个包含文件将依次包含所有的外设特定的头文件,还有一些采用位域结构的方法对DSP的外围设备中某些位的定义。*Userrasourcefile****■*******★★★★★*****♦**********■**********■************■************♦*/♦includeMDSP281x_Device.h*.编辑DSP281x_Device.h文件和选择你正在创建的对象。在下面这个范例中,文件配置用来对F2812设备进行选择:♦define TARGETTARGET0TARGET0♦define DSP28_F2810.把DSP281x_GlobalVariableDefs・c源文件加到工程中此文件在DSP281x_headers\source、目录下,该文件包含:ー访问外设寄存器的变量的声明ー数据段#pragma的分配,连接器用它将变量分配到存储器中合适的位置.把合适的DSP281X的连接命令文件加到工程中如2.2节描述,当使用DSP281X头文件方法,外设寄存器的数据段是通过连接器将变量分配到存储器中合适的位置。为了完成你的工程中的对存储器空间的分配,下面其中的ー个连接文件必须包含在你的工程中,它们位于DSP281x_headers\cmd\目录ド一对于非DSP/BIOS工程: DSP281x_nonBI0S.cmdー对于DSP/BIOS工程: DSP281x_Headers_BI0S.cmd添加连接文件到工程文件的方法取决于于所使用的CodeComposerStudio的版本CodeComposerStudioV2.2版本及其以上版本:对于CCS2.2,它允许工程文件中包含多个连接命令文件。可将合适的头连接命令文件(BIOS和非BIOS)直接添加工程中白:jProjectsE冷Example_281xWatchdog.pjt(Debug)ロDependentProjectsロDSP/BIOSConfig;…㈡GeneratedFiles国口Include•コLibrariesELJSource国DSP281x_Headers_nonBIOS.cmd園F2812_EzDSP_RAMJnk.cmd

CodeComposerStudioV2.2以上版本对于低于CCS2.2的版本,每个工程只能包含一个主要的连接命令文件。然而,如果需要,这个文件在需要时可称为additional.cmd。对DSP281X头文件,要包含所需的存储器分配,可按照下面两个步骤:1)更新工程的主要连接命令文件,用ー1项调用已提供的DSP281X外设结构连接命令文件*User*slinker.cmdfile♦♦♦♦♦♦♦♦•♦♦♦♦♦♦♦♦♦♦*♦♦♦♦♦♦♦/*Usethisincludeflieonlyfornon-BIOSapplications*/-1DSP281x_Headers_nonBIOS.cmd/*UsethisincludefileonlyforBIOSapplications*//*-1DSP281x_Headers_BIOS.cmd*/2)添加DSP281X外围连接器命令文件(.cmd)的目录路径到当前的工程中a,打开菜单:Project->BuiIdOptionsb.选择Linker项,再选择Basic项c.在LibrarySearchPath里将目录路径DSP281x_headers\cmd添加到你的系统中。7.把DSP281X头文件目录路径添加到当前的工程中确定头文件所在的目录的位置:a,打开菜单:Project->BuiIdOptionsb.选择Compiler项c.选择pre-processord,在IncludeSearchPath里将目录路径DSP281x_headers\inc1ude添加到你的系统中GeneralConpilcr|Linker|LinkOrder|GeneralConpilcr|Linker|LinkOrder|•g-q-pd-as-frHC\Hdcs\c28\DSP281k\v100\DSF281Lexam兩3仙曲chdcgゝDmbW・f$”CAtidcs\c28\DSP281x\v1OO^DSP281x_e<amples'watchdog\DebuゴColeg5yBaseAdvancedFeedbackFile?AssembレIParserDiagnosticsPreprocessorColeg5yBaseAdvancedFeedbackFile?AssembレIParserDiagnosticsPreprocessorIncludeSearchPath(«i):[jDefineSymbols(d):UrdcfincSymboh(u):Pteprocessng.|..VKDSP291x_header^Vinclude]|_DEBUG;LARGE_MODELfContinuewithCompiolicn+卬0)8,其他附加的build项卜面是ー些附加的compiler和!inker项,这些选项可通过Project-〉BuiIdOptions菜单进行设置。-Compiler项-ml高级选择和检测用于大存储器模式。在28x设备4M存储器空间可对数据段任何位置进行设定。

-pdr诊断选择和检测产生非严重性警号。编译器会产生一个警告,表明代码虽然是有效的但是可疑。在许情况下,这些警告是使能一pdr项产生的,它提醒你代码可能会在以后引起问题。—Linker项:-w高级选项和检测对输出段的警告。这个选项将提醒你在代码中存在未分配的存储器空间。在缺省值情况,连接器会尝试对未分配的代码和数据段提供一个有效的存储器地址,而不会产生警号。但是,当这个段被分配到ー个意外的地址时,可能会引起问题。4.3包含的通用范例代码把通用范例代码包含在你的项目,这样可以大大影响已经为某型号芯片写好的代码。合并共享源代码到ー个新的或已存在的工程文件中,可以按以下几个步骤:1.Include”DSP281x_Examples.h"到当前的源文件中。GeneralCompiler|Linker|LinkOrder|这个包含文件将包含范例代码中的ー些通用的GeneralCompiler|Linker|LinkOrder|•g-q-pdr-as -I-fr"CAtidcs\c28\DSP281x\v100\DSP281x_examples\walchdog\Debug"コ•fsHCAtidcs\c28\DSP281x\v100\DSP281x_examples\watchdog\[)ebug" .Category:Preprocessor[BasicAdvancedFeedbackTilesAssemblyIParserIncludeSearchPath(-i):[DefineSymbols(«d):PreprocessorUndefineSymbols(-u):Preprocessing:Diagnostics|de;..ADSP281xcommonゝincludeCategory:Preprocessor[BasicAdvancedFeedbackTilesAssemblyIParserIncludeSearchPath(-i):[DefineSymbols(«d):PreprocessorUndefineSymbols(-u):Preprocessing:Diagnostics|de;..ADSP281xcommonゝinclude|_DEBUG;LARGE_MODEL|None「ContinuewithCompilation(-ppa)3,添加连接命令文件到当前工程中在DSP281x_common\cmd目录下提供了下面几个存储器连接文件(.cmd),其中大多数范例使用了F2812_ExDSP_RAM_Ink.cmd文件。表8.包含主要的连接命令文件主要连接命令文件例子描述F2812_EzDSP_RAM_lnk.cmd主要eZdsp范例连接文件。仅用在SARAM空间,它不受代码安全模式的保护。这个存储器映射文件用于F2812EzDSP的所有范例,不使用Flash或OTP存储器地址F2812_XintfBoot.cmd用于从XINTFZone7启动的连接命令文件F2810.cmd上要F2810连接命令文件,包含所有的Flash和OTP存储器F2812.cmd主要F2812连接命令文件,包含所有的Flash,OTP和XINTF存储器4.设定CPU频率在DSP281x_common\include\DSP281x_Examples.h文件中指定了合适CPU频率。在这个文件中包含一些范例。•DSP281x_common\include\DSP281x_Examples.h#defineCPU_RATE//#deflneCPU_RATE//♦defineCPU_RATE6.667L //#defineCPU_RATE//#deflneCPU_RATE//♦defineCPU_RATE7.143L //fora140MHzCPUclockspeed(SYSCLKOUT)8.333L //fora120MHzCPUclockspeed(SYSCLKOUT)5DSP281xC/C++头文件和外设例程程序包所包含的内容这部分将列出此版本中包含的所有文件。头文件-DSP281x_headerDSP281x_header在<base>\DSP281x_header\目录下DSP281X头文件-主文件以下这些文件必须添加到任何ー个使用DSP281X头文件的工程中。参考4.2节的相关信息将头文件合并到ー个新的或原有工程文件中。表11DSP281X头文件-主文件文件位置描述DSP281x_Device.hDSP281x_Headers\inciude主包含文件。在任何ー个.C原文件中都包含此文件。这个文件依次包含下面列出的所有特定外设.h文件。

另外,这个文件还包含类型(typedef)声明和通用的掩码值。参考4.2节。DSP28Ix.GlobalVariableDefs.cDSP281x_Headers\source定义了一些访问外设结构的变量和数据区#pragma分配声明。任何ー个使用头文件的工程都必须包含这个文件。参考4.2〇DSP28lx_Headers_BIOS.cmdDSP281x_Headers\cmd连接.cmd文件,在使用BIOS的工程文件中分配头文件变量。任何ー个使用头文件的BIOS工程都必须包含这个文件。参考4.2。DSP281x_Headers_nonBIOS.cmdDSP281x_Headers\cmd连接.cmd文件,在non-BIOS工程中分配头文件变量.任何ー个使用头文件的non-BIOS工程都必须包含这个文件。参考4.2〇DSP281X头文件一外设位-域和寄存器结构定义文件以下的文件定义281x器件每个外设位-域和寄存器结构。通过包含DSP281x_Device.h,这些文件自动的包含在工程文件中。参考4.2节的相关信息将头文件合并到ー个新的或原有的工程文件中。表12DSP281X头文件位-域和寄存器结构定义文件文件位置描述DSP281x_Adc.hDSP281x_Headers\includeADC寄存器结构和位ー域定义DSP281x_CpuTimer.hDSP281x_Headers\includeCpu-Timer寄存器结构和位-

域定义DSP28lx_DevEmu.hDSP28lx_Headers\include仿真寄存器定义DSP281x_ECan.hDSP281x_Headers\includeeCAN寄存器结构和位-域定义DSP281x_Ev.hDSP281x_Headers\includeEV寄存器结构和位ー域定义DSP281x_Gpio.hDSP281x_Headers\includeGPIO寄存器结构和位-域定义DSP281x_Mcbsp.hDSP281x_Headers\includeMcBSP寄存器结构和位-域定义DSP281x_PieCtrl.hDSP28lx_Headers\includePIE寄存器结构和位ー域定义DSP281x_PieVect.hDSP281x_Headers\include完整PIE向量表定义DSP281x_Sci.hDSP281x_Headers\includeSCI寄存器结构和位ー域定义DSP281x_Spi.hDSP281x_Headers\includeSPI寄存器结构和位ー域定义DSP281x_SysCtrl.hDSP281x_Headers\include系统寄存器结构,包含Watchdog,PLL,CMS,Flash/OTP,Clock寄存器DSP281x_Xintf.hDSP281x_Headers\include扩展存储器接口XINTF寄存器结构和位ー域定义DSP281x_Xintrupt.hDSP281x_Headers\include外部中断寄存器结构和位ー域定义5.1.3CodeComposer.gel文件使用带DSP281X头文件的外设寄存器结构,包含以下的CodeComposerStudio.gel文件表13包含的GEL文件文件位置描述DSP281x_Peripheral.gelDSP281x_Headers\gel提供ー个GEL下拉菜单,将DSP281X数据结构下载到观察窗口。将GEL_LoadGel(lt<base>DSP281x_Peripheral.h)函数添加到底油的F2812.gel中,CCS将可以自动的下载这个文件DSP28Ix.GpioQuickRef.gelDSP281x_Headers\gel为DSP281X器件上的GPIO口提供ー个快速的参考。能将MUX信息输出到调试窗ロ

5.1.4变量名和数据段本节列出了DSP281x_headers\source\DSP281x_GlobalVariableDefs.c文件中使用的变量名和分配的数据段。PeripheralStartingAddressStructureVariableNameADC0x007100AdcRegsCodeSecurityModuleOxOOOAEOCsmRegsCodeSecurityModulePasswordLocationsCsmPwlCPUTimer0OxOOOCOOCpuTimerORegsDeviceandEmulationRegisters0x000880DevEmuRegseCAN0x006000ECanaRegseCANMailBoxes0x006100ECanaMboxeseCANLocalAcceptanceMasks0x006040ECanaLAMRegseCANMessageObjectTim©Stamps0x006080ECanaMOTSRegseCANMessageObjectTime-Out0x0060C0ECanaMOTORegsEventManagerA(EV-A)0x007400EvaRegsEventManagerB(EV-B)0x007500EvbRegsFlash&OTPConfigurationRegisters0x000A80FlashRegsGeneralPurposeI/ODataRegisters0x0070E0GpioDataRegsGeneralPurposeMUXRegistersOxO070C0GpioMuxRegsMcBSPRegisters0x007800McbspaRegsPIEControlOxOOOCEOPieCtrIRegs5.2通用例程代码-DSP281x_common外设中断扩展(PIE)块supportDSP281x_PieCtrl.h除了说明寄存器的定义外,还为PIE块提供基本的ISR结构。这些文件是:表14基本PIE块特殊支持文件文件位置描述DSP28lx_Defaultlsr.cDSP281x_common\source完整PIE向量表的中断服务外壳程序(ISRs)。可以选择填充一个函数或将你的ISR重新映射到PIE向量表。注意:这个文件对DSP'BIOS工程文件没有用。DSP281x_Defaultlsr.hDSP281x_common\includeDSP281x_Defaultlsr.c中的ISR函数原型声明。注意:这

个文件对DSP'BIOS工程文件没有用DSP281x_PieVect.cDSP281x_common\source此处是DSP281x_Defaultlsr.c中ISR函数的ー个实例,创建•个带指针的PIE向量表结构初始化。为了初始化到默认的ISR位置,可以拷贝这个实例到PIE向量表。另外,以下包含的文件是为了中断的软件优先级。这些文件被用来代替上面那些需要使用的额外软件中断优先级文件。更多的信息可以参考示例和文件DSP281x_example\sw_prioritized_interrupts表15中断PIE软件优先级特别支持文件文件位置描述DSP281x_SWPrioritizedDefaultlsr.cDSP281x_common\source默认的中断服务外壳程序。你可以选择填充一个函数或将你的ISR重新映射到PIE向量表。注意:这个文件对DSP'BIOS工程没有用。DSP281x_SWPrioritizedLevel.hDSP281x_common\includeDSP28lx_Defaultlsr.c中的ISR函数原型声明。注意:这个文件对DSP'BIOS工程没有用。DSP281x_SWPriorit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论