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

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

举报
开通vip

2812控制精确的1秒LED闪烁程序2812控制精确的1秒LED闪烁程序2812控制精确的1秒LED闪烁程序PAGE2812控制精确的1秒LED闪烁程序第一个精确的1秒LED闪烁程序1   程序特点本程序使用F2812硬件,控制GPIOF14管脚上的一个LED做精确的1秒间隔闪烁,并且程序从Flash启动。2   建立工程   文件该工程包含以下文件:注:除了为自己写的之外,其他均为F2812DEMO自带的文件。其中部分文件做了小小的修改,下文会详述建立工程打开,选择Project—>New…,输入工程名,这里是MyFirstPjt,选择工程目...

2812控制精确的1秒LED闪烁程序
2812控制精确的1秒LED闪烁程序2812控制精确的1秒LED闪烁程序PAGE2812控制精确的1秒LED闪烁程序第一个精确的1秒LED闪烁程序1   程序特点本程序使用F2812硬件,控制GPIOF14管脚上的一个LED做精确的1秒间隔闪烁,并且程序从Flash启动。2   建立工程   文件该工程包含以下文件:注:除了为自己写的之外,其他均为F2812DEMO自带的文件。其中部分文件做了小小的修改,下文会详述建立工程打开,选择Project—>New…,输入工程名,这里是MyFirstPjt,选择工程目录后点击确定,然后在左侧的工程管理窗口中选中,右键—>添加文件,将下列文件加入工程:然后再次选中,右键—>ScanAllFileDependencies,CCS系统会自动搜索关联的文件,特别是.h头文件,并将所有.h头文件显示出来,如下图所示:如果你看不到,请点击+号展开文件列 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 。但注意此时并没有完成,还需要设置编译环境:在左侧的工程管理窗口中选中,右键—>BulidOptions…做如下设置:很关键的一个设置是必须设置头文件的搜索路径,CCS在编译时先搜索安装目录下的头文件,然后再搜索用户指定的路径,如果再找不到,就报错。头文件的搜索路径设置如下:其中$(Proj_dir)表示工程所在的目录,这里设置为“$(Proj_dir)\DSP281x_headers\include,$(Proj_dir)\DSP281x_common\include”多个路径中间用逗号隔开。当然也可以设置绝对路径,但这样设置方便一些,便于在工程拷贝中不用再更改设置。然后设置库和库的搜索路径:这里使用了自带的库,该库位于CCS安装目录的C2000\cgtools\lib下,此库中带有bootloader的obj文件,以便于与用户的应用程序连接,大信号模式下用,小信号模式下用。  编译略,与众多IDE相似。  下载首先确保安装了F2812的Flash烧写插件和仿真器的驱动,硬件连接好后,按CTRL+ALT+R以RESET仿真器,按ALT+C连接DSP和PC,点击CCS上的Tools下的F28xxOn-ChipFlashProgrammer即可下载。具体步骤从略。   运行断开仿真器,上电即可运行。具体从略。3    程序详解   #include""ect"ramfuncs"将该段代码定义到段“ramfuncs”中,段ramfuncs的位置在编译时指定,实际上由文件中的如下语句来指定:ramfuncsLOAD=FLASHD,PAGE=0,RUN=RAML0,PAGE=1,LOAD_START(_RamfuncsLoadStart),LOAD_END(_RamfuncsLoadEnd),RUN_START(_RamfuncsRunStart)第1行表示该段的装载在PAGA0的FLASHD中(PAGA0和FLASHD的分段请见文件,后文将有详解);第2行表示该段的运行地址在PAGE1的RAML0中(PAGA1和RAML0的分段请见文件,后文将有详解);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,必须先声明,本工程在文件中做了如下声明:externUint16RamfuncsLoadStart;externUint16RamfuncsLoadEnd;externUint16RamfuncsRunStart;然后就可以使用了。在中,使用MemCopy()函数将段ramfuncs中的函数DSP28x_usDelay()的代码从装载地址RamfuncsLoadStart—RamfuncsLoadEnd拷贝到RamfuncsRunStart开始的SARAM空间中。之后在程序运行时,只要调用DSP28x_usDelay()函数,都会自动地指向SARAM中相应的函数入口地址,这一点是自动完成的。MemCopy()函数原型在中,在声明。注意:即使这样,定时仍然可能不精确,因为可能有中断打断DSP28x_usDelay()的运行,所以在调用之前要关中断。4     如何从Flash启动   F2812的BootLoader工作原理要让程序从Flash中启动,必须用到DSP的BootLoader。那么什么是BootLoader呢?      F2812内部有一块ROM,称为On-ChipROM,其结构如图所示:从地址0x3FF000到0x3FFB50固化的是集中数学运算表(F2812内部地址是统一编址,寄存器、外设、ROM、RAM地址不重叠),包括正弦和余弦表,可以通过CCS的View—>Graph—>Image绘制出一个漂亮的个正弦波形。从0x3FFC00到0x3FFFC0固化的有BootLoader的程序,以及版本号、校验等信息。详情请参考TI的“TMS320x281xDSPBootROMReferenceGuide(SPRU095B)”。从0x3FFFC0到0x3FFFFF装载的是复位向量和CPU中断向量。这些向量的映射在Debug模式下会映射到不同的位置,详情请参考TI的“TMS320x281xDSPBootROMReferenceGuide(SPRU095B)”。那么DSPF2812从上电到启动过程中到底做了哪些工作?1.      上电复位时,上电运行BootLoader根据MP/MC引脚的状态决定是从片外的3fffc0处(XINTFZone7)读取复位向量或者是从片内的OnChiprom的3fffc0处读取复位向量。MC方式下从片内读取,MP方式下从片外读取。复位向量位置见文件中的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引导模式时)。因此地址0x3F7FF6是用户程序的入口,见中:BEGIN:origin=0x3F7FF6,length=0x000002和codestart:>BEGINPAGE=06.      在片内flash的3F7FF6和3F7FF7处一般会放有一个跳转指令。本工程中,由一段代码来完成,见文件:作用是先关闭看门狗,然后跳转到c_int00,即LB_c_int00。更具根据上文,的代码必须从0x3F7FF6开始,所以程序中有这么一句:.sect"codestart"7.      执行这个跳转指令后程序就开始运行c_int00这个函数了,这个函数在rts的库中。见CCS的安装目录下的C2000\cgtools\lib\。实际上c_int00执行的是,8.      这个函数就是建立一个c程序的运行环境,等建立完c运行环境后c_int00调用main函数,详情见TI的“TMS320x281xDSPBootROMReferenceGuide(SPRU095B)”中的BootLoader的源代码。C_int00可以看作是c程序的Main函数入口。9.      main函数开始就是我们自己编写的应用程序了。实际上,如果想让程序从Flash中启动,只要硬件配置正确,软件上只要将代码段.text定位到Flash中即可,剩下的全部由编译器自动完成。关键是撰写正确的.cmd文件。5     CMD文件详解   该文件是为硬件的各种寄存器映射存储器地址分页和分配空间地址,一般是固定的,用户无权改动也不必改动,该文件适合在没有使用操作系统BIOS时使用。使用时不必改动。MEMORY{PAGE0:/*ProgramMemory*/PAGE1:/*DataMemory*/DEV_EMU:origin=0x000880,length=0x000180/*deviceemulationregisters*/PIE_VECT:origin=0x000D00,length=0x000100/*PIEVectorTable*/FLASH_REGS:origin=0x000A80,length=0x000060/*FLASHregisters*/CSM:origin=0x000AE0,length=0x000010/*codesecuritymoduleregisters*/XINTF:origin=0x000B20,length=0x000020/*externalinterfaceregisters*/CPU_TIMER0:origin=0x000C00,length=0x000008/*CPUTimer0registers(CPUTimer1andTimer2arereservedforBIOS)*/PIE_CTRL:origin=0x000CE0,length=0x000020/*PIEcontrolregisters*/ECANA:origin=0x006000,length=0x000040/*eCANcontrolandstatusregisters*/ECANA_LAM:origin=0x006040,length=0x000040/*eCANlocalacceptancemasks*/ECANA_MOTS:origin=0x006080,length=0x000040/*eCANmessageobjecttimestamps*/ECANA_MOTO:origin=0x0060C0,length=0x000040/*eCANobjecttime-outregisters*/ECANA_MBOX:origin=0x006100,length=0x000100/*eCANmailboxes*/SYSTEM:origin=0x007010,length=0x000020/*Systemcontrolregisters*/SPIA:origin=0x007040,length=0x000010/*SPIregisters*/SCIA:origin=0x007050,length=0x000010/*SCI-Aregisters*/XINTRUPT:origin=0x007070,length=0x000010/*externalinterruptregisters*/GPIOMUX:origin=0x0070C0,length=0x000020/*GPIOmuxregisters*/GPIODAT:origin=0x0070E0,length=0x000020/*GPIOdataregisters*/ADC:origin=0x007100,length=0x000020/*ADCregisters*/EVA:origin=0x007400,length=0x000040/*EventManagerAregisters*/EVB:origin=0x007500,length=0x000040/*EventManagerBregisters*/SCIB:origin=0x007750,length=0x000010/*SCI-Bregisters*/MCBSPA:origin=0x007800,length=0x000040/*McBSPregisters*/CSM_PWL:origin=0x3F7FF8,length=0x000008/*PartofFLASHA.CSMpasswordlocations.*/}SECTIONS{PieVectTableFile:>PIE_VECT,PAGE=1/***PeripheralFrame0RegisterStructures***/DevEmuRegsFile:>DEV_EMU,PAGE=1FlashRegsFile:>FLASH_REGS,PAGE=1CsmRegsFile:>CSM,PAGE=1XintfRegsFile:>XINTF,PAGE=1CpuTimer0RegsFile:>CPU_TIMER0,PAGE=1PieCtrlRegsFile:>PIE_CTRL,PAGE=1/***PeripheralFrame1RegisterStructures***/SysCtrlRegsFile:>SYSTEM,PAGE=1SpiaRegsFile:>SPIA,PAGE=1SciaRegsFile:>SCIA,PAGE=1XIntruptRegsFile:>XINTRUPT,PAGE=1GpioMuxRegsFile:>GPIOMUX,PAGE=1GpioDataRegsFile:>GPIODATPAGE=1AdcRegsFile:>ADC,PAGE=1EvaRegsFile:>EVA,PAGE=1EvbRegsFile:>EVB,PAGE=1ScibRegsFile:>SCIB,PAGE=1McbspaRegsFile:>MCBSPA,PAGE=1/***PeripheralFrame2RegisterStructures***/ECanaRegsFile:>ECANA,PAGE=1ECanaLAMRegsFile:>ECANA_LAMPAGE=1ECanaMboxesFile:>ECANA_MBOXPAGE=1ECanaMOTSRegsFile:>ECANA_MOTSPAGE=1ECanaMOTORegsFile:>ECANA_MOTOPAGE=1/***CodeSecurityModuleRegisterStructures***/CsmPwlFile:>CSM_PWL,PAGE=1}   MEMORY{PAGE0:/*ProgramMemory*//*Memory(RAM/FLASH/OTP)blockscanbemovedtoPAGE1fordataallocation*/ZONE0:origin=0x002000,length=0x002000/*XINTFzone0*/ZONE1:origin=0x004000,length=0x002000/*XINTFzone1*/RAML0:origin=0x008000,length=0x001000/*on-chipRAMblockL0*/ZONE2:origin=0x080000,length=0x080000/*XINTFzone2*/ZONE6:origin=0x100000,length=0x080000/*XINTFzone6*/OTP:origin=0x3D7800,length=0x000800/*on-chipOTP*/FLASHJ:origin=0x3D8000,length=0x002000/*on-chipFLASH*/FLASHI:origin=0x3DA000,length=0x002000/*on-chipFLASH*/FLASHH:origin=0x3DC000,length=0x004000/*on-chipFLASH*/FLASHG:origin=0x3E0000,length=0x004000/*on-chipFLASH*/FLASHF:origin=0x3E4000,length=0x004000/*on-chipFLASH*/FLASHE:origin=0x3E8000,length=0x004000/*on-chipFLASH*/FLASHD:origin=0x3EC000,length=0x004000/*on-chipFLASH*/FLASHC:origin=0x3F0000,length=0x004000/*on-chipFLASH*/FLASHA:origin=0x3F6000,length=0x001F80/*on-chipFLASH*/CSM_RSVD:origin=0x3F7F80,length=0x000076/*PartofFLASHA.Programwithall0x0000whenCSMisinuse.*/BEGIN:origin=0x3F7FF6,length=0x000002/*PartofFLASHA.Usedfor"boottoFlash"bootloaderthismode,whenbootisfilished,itturnstoaddress0x3F7FF6torun*/CSM_PWL:origin=0x3F7FF8,length=0x000008/*PartofFLASHA.CSMpasswordlocationsinFLASHA*//*ZONE7:origin=0x3FC000,length=0x003FC0/*XINTFzone7availableifMP/MCn=1*/ROM:origin=0x3FF000,length=0x000FC0/*BootROMavailableifMP/MCn=0*/RESET:origin=0x3FFFC0,length=0x000002/*partofbootROM(MP/MCn=0)orXINTFzone7(MP/MCn=1)*/VECTORS:origin=0x3FFFC2,length=0x00003E/*partofbootROM(MP/MCn=0)orXINTFzone7(MP/MCn=1)*/PAGE1:/*DataMemory*//*Memory(RAM/FLASH/OTP)blockscanbemovedtoPAGE0forprogramallocation*//*RegistersremainonPAGE1*/RAMM0:origin=0x000000,length=0x000400/*on-chipRAMblockM0*/RAMM1:origin=0x000400,length=0x000400/*on-chipRAMblockM1*/RAML0:origin=0x008000,length=0x001000/*on-chipSARAMblockL0*/RAML1:origin=0x009000,length=0x001000/*on-chipSARAMblockL1*/FLASHB:origin=0x3F4000,length=0x002000/*on-chipFLASH*/RAMH0:origin=0x3F8000,length=0x002000/*on-chipRAMblockH0*/}/*Allocatesectionstomemoryblocks.Note:codestartuserdefinedsectioninusedtoredirectcodeexecutionwhenbootingtoflashramfuncsuserdefinedsectiontostorefunctionsthatwillbecopiedfromFlashintoRAM*/SECTIONS{/*Allocateprogramareas:*/.cinit:>FLASHAPAGE=0.pinit:>FLASHA,PAGE=0.text:>FLASHAPAGE=0codestart:>BEGINPAGE=0ramfuncs:LOAD=FLASHD,PAGE=0,RUN=RAML0,PAGE=1,LOAD_START(_RamfuncsLoadStart),LOAD_END(_RamfuncsLoadEnd),RUN_START(_RamfuncsRunStart)csmpasswds:>CSM_PWLPAGE=0csm_rsvd:>CSM_RSVDPAGE=0/*Allocateuninitalizeddatasections:*/.stack:>RAMM0PAGE=1.ebss:>RAML1PAGE=1.esysmem:>RAMH0PAGE=1/*InitalizedsectionsgoinFlash*//*ForSDFlashtoprogramthese,theymustbeallocatedtopage0*/.econst:>FLASHAPAGE=0.switch:>FLASHAPAGE=0/*AllocateIQmathareas:*/IQmath:>FLASHCPAGE=0/*MathCode*/IQmathTables:>ROMPAGE=0,TYPE=NOLOAD/*MathTablesInROM*//*.resetisastandardsectionusedbythecompiler.Itcontainsthe*//*theaddressofthestartof_c_int00forCCode./*/*WhenusingthebootROMthissectionandtheCPUvector*//*tableisnotneeded.Thusthedefaulttypeissethereto*//*DSECT*/.reset:>RESET,PAGE=0,TYPE=DSECTvectors:>VECTORSPAGE=0,TYPE=DSECT}第1行的作用是为DSP的存储器空间分段,使用MEMORY{}格式,一般分两页:PAGE0和PAGE1,前者为程序空间,后者为数据空间。在PAGE0中,又分成许多小段,各段可以单独命名。例如:ZONE0:origin=0x002000,length=0x002000/*XINTFzone0*/其中ZONE0为段名,origin关键字表示起始地址,length关键字表示长度。第5~19行均为DSP内部存储空间的段,各段名都是约定俗成的。第20行CSM_RSVD为一个代码安全模块的存储地址,该模块在FLASHA中,与bootloader位置相邻。第22行为DSP程序的入口地址,所以称为BEGIN,上文已有所阐述。第24行CSM_PWL为代码安全模块的一个128bit密码的存储地址,是为了保护程序不被盗取用的,可以在使用2812的FlashdownloadProgram插件的界面上看到其设置。第28行ROM为Bootloader程序的存储地址。第29行RESET为CPU的复位向量的存放地址。第31行VECTORS为CPU中断向量表的存放地址。第38~43行为数据空间的定义。第53行是制定程序的目标位置(存放位置),使用SECTIONS{}格式。第59行.text是指定程序代码的存放位置为PAGE0的FLASHA中。第60行codestart是制定程序的入口,实际上必须在地址BEGIN(0x3F7FF6),本程序是将的这一段代码放在此处。第61~65行的作用上文节已有所阐述,详见CCS的帮助文档。第71行.stack是设定程序的堆栈的位置。第81、82行是设置OnChipROM中的数学运算表的位置。
本文档为【2812控制精确的1秒LED闪烁程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥10.0 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
刚桥
暂无简介~
格式:doc
大小:372KB
软件:Word
页数:11
分类:企业经营
上传时间:2021-11-18
浏览量:11