2812控制精确的1秒LED闪烁程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第一个精确的1秒LED闪烁程序1程序特点本程序使用F2812硬件,控制GPIOF14管脚上的一个LED做精确的1秒间隔闪烁,并且程序从Flash启动。2建立工程2.1文件该工程包含以下文件:注:除了Main.c为自己写的之外,其他均为F2812DEMO自带的文件。其中部分文件做了小小的修改,下文会详述2.2建立工程打开CCS3.1,选择Project—New…,输入工程名,这里是MyFirstPjt,选择工程目录后点击确定,然后在左侧的工程管理窗口中选中MyFirstPjt.pjt,右键—添加文件,将下列文件加入工程:然后再次选中MyFirstPjt.pjt,右键—ScanAllFileDependencies,CCS系统会自动搜索关联的文件,特别是.h头文件,并将所有.h头文件显示出来,如下图所示:如果你看不到,请点击+号展开文件列表。但注意此时并没有完成,还需要设置编译环境:在左侧的工程管理窗口中选中MyFirstPjt.pjt,右键—BulidOptions…做如下设置:很关键的一个设置是必须设置头文件的搜索路径,CCS在编译时先搜索安装目录下的头文件,然后再搜索用户指定的路径,如果再找不到,就报错。头文件的搜索路径设置如下:其中$(Proj_dir)表示工程所在的目录,这里设置为“$(Proj_dir)\DSP281x_headers\include,$(Proj_dir)\DSP281x_common\include”多个路径中间用逗号隔开。当然也可以设置绝对路径,但这样设置方便一些,便于在工程拷贝中不用再更改设置。然后设置库和库的搜索路径:这里使用了CCS3.1自带的库rts2800_ml.lib,该库位于CCS安装目录的C2000\cgtools\lib下,此库中带有bootloader的obj文件,以便于与用户的应用程序连接,大信号模式下用rts2800_ml.lib,小信号模式下用rts2800.lib。2.3编译略,与众多IDE相似。2.4下载首先确保安装了F2812的Flash烧写插件和仿真器的驱动,硬件连接好后,按CTRL+ALT+R以RESET仿真器,按ALT+C连接DSP和PC,点击CCS上的Tools下的F28xxOn-ChipFlashProgrammer即可下载。具体步骤从略。2.5运行断开仿真器,上电即可运行。具体从略。3程序详解3.1Main.c#includeDSP281x_Device.h//DSP281xHeaderfileIncludeFile#includeDSP281x_Examples.h//DSP281xExamplesIncludeFile#includeDSP281x_Gpio.h//////#includeDSP281x_XIntrupt.h//////externvoidDSP28x_usDelay(Uint32time);voidmain(void){InitSysCtrl();DisableDog();MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);InitGpio();//初始化pio,gpiof14为输出DINT;IER=0x0000;IFR=0x0000;InitPieCtrl();InitPieVectTable();//初始化中断向量表for(;;){GpioDataRegs.GPFTOGGLE.bit.GPIOF14=1;//gpiof14输出值翻转DELAY_US(0xF4240);//DelayOnesecond}}其中:InitSysCtrl()主要用来配置DSP的时钟频率,该函数在DSP281x_SysCtrl.c文件中;DisableDog()关闭看门狗,函数也在DSP281x_SysCtrl.c中;MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart)这一句用来将将Flash中的DSP28x_usDelay()函数调入RAM中运行,下面将详解。3.2闪烁LED的实现本工程的LED接到GPIOF14的管脚上,使用GPIO来控制LED的亮灭。InitGpio()用来初始化GPIO,函数原型在Gpio.c中:voidInitGpio(void){//SetGPIOAportpins,AL(Bits7:0)(input)-AH(Bits15:8)(output)8bits//InputQualifier=0,noneEALLOW;GpioMuxRegs.GPFMUX.bit.XF_GPIOF14=0;//将/XPLLDIS配置为I/OGpioMuxRegs.GPFDIR.bit.GPIOF14=1;//配置为outputEDIS;}其它的语句:DINT;IER=0x0000;IFR=0x0000;InitPieCtrl();InitPieVectTable();//初始化中断向量表可要可不要,作用从略。GpioDataRegs.GPFTOGGLE.bit.GPIOF14=1;//gpiof14输出值翻转语句的作用是将gpiof14的管脚电平取反,达到控制LED闪烁的目的。3.3将Flash中的程序DSP28x_usDelay()调入RAM中运行本程序为了实现精确的定时,使用了一个用汇编编写的延时函数DSP28x_usDelay(),该函数在文件DSP281x_usDelay.asm中,细节请阅读该文件。为了调用该函数,在Main.c中做了如下声明:externvoidDSP28x_usDelay(Uint32time);该函数的定时仍然不够精确,因此在文件DSP281x_Examples.h中做了如下的宏定义修正:#defineDELAY_US(A)DSP28x_usDelay(((((longdouble)A*1000.0L)/(longdouble)CPU_RATE)-9.0L)/5.0L)函数DSP28x_usDelay(Uint32time)要想非常精确,必须在SARAM中运行,因此需要在运行时将其调入SARAM中。为此,需要做如下工作:首先,在DSP281x_usDelay.asm中使用.sectramfuncs将该段代码定义到段“ramfuncs”中,段ramfuncs的位置在编译时指定,实际上由F2812.cmd文件中的如下语句来指定:ramfuncsLOAD=FLASHD,PAGE=0,RUN=RAML0,PAGE=1,LOAD_START(_RamfuncsLoadStart),LOAD_END(_RamfuncsLoadEnd),RUN_START(_RamfuncsRunStart)第1行表示该段的装载在PAGA0的FLASHD中(PAGA0和FLASHD的分段请见F2812.cmd文件,后文将有详解);第2行表示该段的运行地址在PAGE1的RAML0中(PAGA1和RAML0的分段请见F2812.cmd文件,后文将有详解);LOAD_START(_RamfuncsLoadStart)令编译器创建了一个变量RamfuncsLoadStart,该变量指向段ramfuncs的装载地址的首地址(LOAD_START为编译伪指令,请见CCS的帮助文档);LOAD_START(_RamfuncsLoadEnd)令编译器创建了一个变量RamfuncsLoadEnd,该变量指向段ramfuncs的装载地址的末地址(LOAD_END为编译伪指令,请见CCS的帮助文档);LOAD_START(_RamfuncsRunStart)令编译器创建了一个变量RamfuncsRunStart,该变量指向段ramfuncs的运行地址的首地址(LOAD_START为编译伪指令,请见CCS的帮助文档);从第1和2行可以看出,段ramfuncs中的函数DSP28x_usDelay()的装载地址和运行地址是不同的,本程序中装载在Flash的块FLASHD中,而在SARAML0中运行,这只是目标,实际运行时DSP并会自动将Flash中的代码拷贝到SARAM中,因此需要手动添加代码来完成。在C函数中,为了使用变量RamfuncsLoadStart、RamfuncsLoadEnd和RamfuncsRunStart,必须先声明,本工程在文件DSP281x_GlobalPrototypes.h中做了如下声明:externUint16RamfuncsLoadStart;externUint16RamfuncsLoadEnd;externUint16RamfuncsRunStart;然后就可以使用了。在Main.c中,使用MemCopy()函数将段ramfuncs中的函数DSP28x_usDelay()的代码从装载地址RamfuncsLoadStart—RamfuncsLoadEnd拷贝到RamfuncsRunStart开始的SARAM空间中。之后在程序运行时,只要调用DSP28x_usDelay()函数,都会自动地指向SARAM中相应的函数入口地址,这一点是自动完成的。MemCopy()函数原型在MemCopy.c中,在DSP281x_GlobalPrototypes.h声明。注意:即使这样,定时仍然可能不精确,因为可能有中断打断DSP28x_usDelay()的运行,所以在调用之前要关中断。4如何从Flash启动4.1F2812的BootLoader工作原理要让程序从Flash中启动,必须用到DSP的BootLoader。那么什么是BootLoader呢?F2812内部有一块ROM,称为On-ChipROM,其结构如图所示:从地址0x3FF000到0x3FFB50固化的是集中数学运算表(F2812内部地址是统一编址,寄存器、外设、ROM、RAM地址不重叠),包括正弦和余弦表,可以通过CCS的View—Graph—Image绘制出一个漂亮的1.25个正弦波形。从0x3FFC00到0x3FFFC0固化的有BootLoader的程序,以及版本号、校验等信息。详情请参考TI的“TMS320x281xDSPBootROMReferenceGuide(SPRU095B)”。从0x3FFFC0到0x3FFFFF装载的是复位向量和CPU中断向量。这些向量的映射在Debug模式下会映射到不同的位置,详情请参考TI的“TMS320x281xDSPBootROMReferenceGuide(SPRU095B)”。那么DSPF2812从上电到启动过程中到底做了哪些工作?1.上电复位时,上电运行BootLoader根据MP/MC引脚的状态决定是从片外的3fffc0处(XINTFZone7)读取复位向量或者是从片内的OnChiprom的3fffc0处读取复位向量。MC方式下从片内读取,MP方式下从片外读取。复位向量位置见文件F2812.cmd中的PAGE0:RESET:origin=0x3FFFC0,length=0x000002以及:.reset:RESET,PAGE=0,TYPE=DSECT2.一般我们用的是MC方式,即从片内读取复位向量,在片内的rom3fffc0处有一个向量指向了一个程序InitBoot。实际上该函数就从地址3fffc0开始。复位后处理器从3fffc0处读取3ffc00这个地址,所以InitBoot程序从3ffc00处开始执行。3.3ffc00处开始的就是initboot过程。首先根据IO管脚的状态判断该进入那一种引导方式,引导方式有:4.然后根据不同的引导方式来引导程序:在SCITXA引脚为高电平时就是flashboot方式。其它的方式还需要用户编写引导代码,详情见TI的“TMS320x281xDSPBootROMReferenceGuide(SPRU095B)”。5.然后调用ExitBoot函数,来配置硬件,设置寄存器等的初始值,设置运行环境等。随后,此时置PC=3F7FF6(内部Flash引导

1 / 12
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功