您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > TMS320F2812总结
TMS320F2812学习总结一、复位2812复位后,芯片会采样XMPNMC引脚的状态,这个脚的状态决定了2812复位后是从内部的BootRom引导还是从外部接口区域7引导,如果XMPNMC=1(微处理模式),那么复位的中断向量将会指向外部的存储区域7,当然这种模式下必须保证外部的存储区域可用,同时引导程序必须由程序员事先写好,才能保证芯片的正常启动。如果XMPNMC=0(微计算机模式),那么外部存储区域7将被禁止而内部的BootRom使能,在这种情况下,芯片复位后将会从内部的BootRom获得复位向量。一般情况下我们都是采用微计算机模式,因此对这一引导方式做详细地说明。在微计算机模式下,芯片复位后从内部的BootRom0x3fffc0处读取0z3ffc00这个地址,因此程序就从这个地址开始执行。图1.1是BootRom图1.1片上BootRom的存储器映射表,可以看出0x3fffc0处正好是2812的复位向量,跳转后的地址0x3ffc00正好是芯片的引导加载函数的入口,因此芯片复位后将会执行引导加载函数,然后该函数根据芯片的特殊GPIO口的状态确定芯片的引导模式。表1.1给出了4个GPIO引脚的状态来确定所要使用的引导模式。表1.1由4个GPIO引脚选择的引导模式GPIOF4(SCITXDA)PUGPIOF12(MDXA)NOPUGPIOF3(SPISTEA)NOPUGPIOF2(SPICLK)NOPU模式选择1xxx跳转到Flash0x3F7FF6地址处01xx调用SPI_Boot函数,利用SPI口从外部串行EEPROM中引导0011调用SCI_Boot函数从SCI_A口进行引导0010跳转到H0SARAM中0x3F8000地址处0001跳转到OTP中0x3D7800地址处0000调用Parallel_Boot函数从GPIO口B进行引导注:1、PU代表该引脚内部被拉高,NOPU则表示该引脚没有被内部拉高。2、必须要得别注意SPICLK可能具有外部逻辑。3、如果引导模式选择Flash、H0或者OTP,那么引导加载器不加载外部代码。由于通常情况下我们都使用的是Flash引导。下面着重介绍Flash引导模式:在这种模式下,BootRom会将芯片配置成28x操作模式,并直接跳转到Flash存储器的0x3f7ff6处,这个地址恰好位于128位密码所在的地址前面,只要在这个地址处事先写好一条跳转指令就可以把程序的执行重新定位到包含自定义引导加载器函数或者用户的应用代码的存储区域中(我的理解:通过ccs3.1编译的时候,编译器会自动生成这样一句指令LB_c_int00,放在0x3f7ff6处,执行完这句指令之后,程序会跳到_c_int00这个函数,这个函数也是ccs自动生成的,目的是建立一个c程序运行的环境,等建立完这个环境之后,又会执行这样一句指令LB_main,mian函数就是用户的应用程序,芯片的复位引导完成)二、初始化2812完成复位引导之后,执行用户的应用程序之前必须对器件进行配置,也就是一个初始化的过程,该过程包括看门狗、时钟模块、外设时钟、Flash、以及中断向量初始化。(1)看门狗2812的看门狗是一个8位的计数器,当8位的计数器计数到最大值的时候,看门狗模块会产生一个输出脉冲(512个振荡器时钟宽度)。如果不希望产生脉冲信号,必须在计数最大值之前给看门狗复位控制寄存器依次写“0x55、0xAA”。用户可以通过看门狗控制寄存器使能或者屏蔽看门狗,使能后必须周期性写看门狗复位控制寄存器,屏蔽后看门狗不起作用。(2)时钟模块2812的处理器上有基于PLL的时钟模块,为器件以及各种外设提供时钟信号,这个时钟模块提供两种操作模式。内部振荡器:在X1/XCLKIN和X2两个引脚之间连接一个石英晶体。外部时钟源:将输入时钟信号直接接到X1/XCLKIN引脚上,X2悬空,这种情况下不使用内部振荡器。外部的XPLLDIS引脚的状态可以选择是否需要进行倍频。当XPLLDIS为低电平,系统直接采用外部时钟或晶振直接作为系统时钟;当XPLLDIS为高电平时外部的时钟经过PLL倍频后为系统提供时钟。图2.1晶体振荡器及锁相环模块因此当使能PLL单元时,就必须对锁相环控制寄存器进行配置,选择相应的时钟频率。同时通过高低速外设时钟寄存器对外设时钟进行定标(也就是根据所选外设以及系统的要求,对CPU时钟进行分频,满足外设的要求)。(3)Flash一般情况下可以不对Flash进行初始化,但是对于时序要求比较高的系统通过对Flash的初始化可以提高程序的运行速度,所以对Flash的初始化显得比较重要,下面着重介绍Flash的初始化过程。在Flash引导模式下,由于程序代码是烧写在Flash中,当然这些代码中间也包括Flash的初始化程序,因此这样的初始化是无效的,因为不可能在Flash中对Flash进行初始化,所以在执行这段代码的时候必须将其COPY到RAM当中执行(调试中发现如果不进行COPY程序将会运行在一段不可知的空间)。先给出Flash的初始化程序。voidInitFlash(void){EALLOW;//EnableFlashPipelinemodetoimproveperformance//ofcodeexecutedfromFlash.FlashRegs.FOPT.bit.ENPIPE=1;//CAUTION//Minimumwaitstatesrequiredfortheflashoperating//atagivenCPUratemustbecharacterizedbyTI.//Refertothedatasheetforthelatestinformation.//SettheRandomWaitstatefortheFlashFlashRegs.FBANKWAIT.bit.RANDWAIT=5;//SetthePagedWaitstatefortheFlashFlashRegs.FBANKWAIT.bit.PAGEWAIT=5;//CAUTION//Minimumcyclesrequiredtomovebetweenpowerstates//atagivenCPUratemustbecharacterizedbyTI.//Refertothedatasheetforthelatestinformation.//Fornowusethedefaultcount//SetnumberofcyclestotransitionfromsleeptostandbyFlashRegs.FSTDBYWAIT.bit.STDBYWAIT=0x01FF;//SetnumberofcyclestotransitionfromstandbytoactiveFlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT=0x01FF;EDIS;//Forceapipelineflushtoensurethatthewriteto//thelastregisterconfiguredoccursbeforereturning.asm(RPT#7||NOP);}在上述初始化的函数中主要完成的是对Flash的读时序的配置,完成上面的函数之后,使用如下指令定义这段函数的代码段:#pragmaCODE_SECTION(InitFlash,ramfuncs);关于这句指令的用法可以参考TI的C语言手册(TMS320F28xOptimizingC/C++CompilerUser’sGuide)SPRU514通过这句指令的定义之后,就把InitFlash函数定义在一个程序段名已知的空间中,该段段名为“ramfuncs”。在CMD文件中实现以下描述:ramfuncs:LOAD=FLASHH,PAGE=0RUN=RAML0L1,PAGE=1LOAD_START(_RamfuncsLoadStart),LOAD_END(_RamfuncsLoadEnd),RUN_START(_RamfuncsRunStart)通过这样的描述之后,编译器会把InitFlash函数所在的段“ramfuncs”编译到FLASHH,然后指定它的运行空间为RAML0L1,这样编译器会对ramfuncs定位,指定它所在FLASHH中的开始地址_RamfuncsLoadStart,结束地址_RamfuncsLoadEnd,以及在RAML0L1中运行的开始地址_RamfuncsRunStart,至于该地址位于所在Flash或者RAM的什么地方,编译器会根据CMD文件中其他段的定义来分配,如果内存溢出或者Flash空间不够,编译器会自动报错,然后可以根据错误内容修改相应的空间到一个合适的位置。完成上述工作之后,还不能实现程序的COPY,因为这时并没有真正的把程序COPY到RAM中,只是指定了它们各自的位置,所以最后一步要做的就是按照这三个已知的地址,通过一个函数把它们真正的实现转移,这个函数的原型如下:voidMemCopy(Uint16*SourceAddr,Uint16*SourceEndAddr,Uint16*DestAddr){while(SourceAddrSourceEndAddr){*DestAddr++=*SourceAddr++;}return;}有了这个函数的支持之后,就可以实现Flash初始化了,步骤如下。先在外部声明三个参数:externUint16RamfuncsLoadStart;externUint16RamfuncsLoadEnd;externUint16RamfuncsRunStart;再调用函数:MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);因为在CMD文件中已经使得这三个参数获得实际的地址,此时它们所携带的参数就是要COPY程序的开始和结束地址,以及要运行程序的开始地址,执行完这个函数之后,初始化Flash函数的代码已经被转移到RAM当中了,因此这时候再执行函数:InitFlash();就已经在RAM当中执行了,这样就可以实现对Flash的初始化了。(4)中断向量2812的CPU支持17个CPU级的中断,这其中包括一个不可屏蔽中断和16个可屏蔽中断。2812的器件有很多外设,每个外设都会产生一个或者多个外设级中断,由于CPU没有能力去处理这么多的中断请求,因此需要一个中断扩展寄存器来仲裁这些中断。外设中断扩展模块(PIE)就是用来管理这些扩展中断的,在这个模块中多个中断源复用几个中断输入信号,PIE最多可以支持96个中断,其中8个中断分为一组,复用一个CPU中断,总共12组中断,每个中断都有自己的中断向量表存放在RAM中,因此在系统初始化时,必须定位中断向量表。在28x器件中,中断向量可以映射到5个不同的存储空间。在实际的应用中只使用PIE中断向量的映射。中断向量映射主要由以下位/信号来控制。WMAP:该位在状态寄存器1(ST1)的位3,复位后的值为1。可以通过改变ST1的值或使用STEC/CLRC指令来改变WMAP的值,正常操作时该位置1。M0M1MAP:该位在状态寄存器1(ST1)的位11,复位后的值为1。可以通过改变ST1的值或使用STEC/CLRC指令来改变M0M1MAP的值,正常操作时该位置1。MP/MC:该位在XINTCNF2寄存器的位8。对于有外部接口(XINTF)的器件(如F2812),复位时XMP/MC引脚上的值为该寄存器的值。对于没有外部接口的器件(如F2810),XMP/MC内部拉低。器件复位后,可以通过调整XINTCNF2寄存器(地址::0x00000B34)来改变该位的值。ENPIE:该位在PIECTRL寄存器的位0,复位的默认值为0(PIE被屏蔽)。器件复位后可以通过调整PIECTRL寄存器(地址:0x00000CE0)来改变该位的值。根据上述控制位的不同设置,中断向量表有不同的映射方式,如下表所示:表2.1中断向量表映射配置表向量映射
本文标题:TMS320F2812总结
链接地址:https://www.777doc.com/doc-4499781 .html