当前位置:   article > 正文

成功烧写TMS320F2812经验_tms320f2812pgfa 烧写

tms320f2812pgfa 烧写

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                flash内得程序代码以最快速度运行,需要设置flash配置寄存器的等待周期数,而“设置flash配置寄存器的等待周期数”的这段代码是不能在flash内部执行的,这样就会出现两种实际的配置方式:
  
一种是2812系统无外扩程序存储器,此时程序只能写在2812内部得flash区,程序运行开始后,需要将“设置flash配置寄存器的等待周期数”的这段代码用数据复制的方式复制到内部sram区,比如 
L0 区,然后使用跳转指令跳转到L0 
区“设置flash配置寄存器的等待周期数”的代码进行flash配置寄存器的设置,设置完成后再使用跳转指令跳转到flash程序区执行正常的功能程序。这样以后的flash内的代码就会以最快速度运行。


  
还有一种是2812系统外扩了部分“引导”程序存储器,“设置flash配置寄存器的等待周期数”的这段代码放置在外扩的“引导”程序存储器内,而其他的所有程序代码都放在2812内部flash区,系统复位后,首先运行外扩的“引导”程序存储器内的程序,一旦完成了对内部flash配置寄存器的设置后,即跳转到flash程序区执行正常的功能程序。


  正如上述,对2812外部接口XINTF配置寄存器的设置代码,也是不能在“外部”程序代码区进行的,为了实现对其的正常设置,可仿照上述办法进行相关操作。


2007.8.13 19:06 作者:wind 收藏 | 评论:0
成功烧写TMS320F2812经验
分类:默认栏目用的是CCS2.20版本提供的SDFLASH,设置好SDFLASH后,主要是要将需要下载的.out文件写进去.
关键在于在线仿真时的cmd文件要加以更换成新的.使用的是:






-o .DebugPULSE_AD.out             
-m PULSE_AD.map


MEMORY
{
PAGE 0 : 
   OTP         : origin = 0x3D7800, length = 0x000800
   FLASHJ      : origin = 0x3D8000, length = 0x002000
   FLASHI      : origin = 0x3DA000, length = 0x002000
   FLASHH      : origin = 0x3DC000, length = 0x004000 
   FLASHG      : origin = 0x3E0000, length = 0x004000
   FLASHF      : origin = 0x3E4000, length = 0x004000
   FLASHE      : origin = 0x3E8000, length = 0x004000 
   FLASHD      : origin = 0x3EC000, length = 0x004000
   FLASHC      : origin = 0x3F0000, length = 0x004000
   FLASHB      : origin = 0x3F4000, length = 0x002000 
   FLASHA      : origin = 0x3F6000, length = 0x001FF6
   BEGIN       : origin = 0x3F7FF6, length = 0x000002
   PASSWDS     : origin = 0x3F7FF8, length = 0x000008
   ROM         : origin = 0x3FF000, length = 0x000FC0
   VECTORS     : origin = 0x3FFFC2, length = 0x00003E
         
PAGE 1 : 
   /* SARAM                     */     
   RAMM0M1    : origin = 0x000000, length = 0x000800


   /* Peripheral Frame 0:   */
   DEV_EMU    : origin = 0x000880, length = 0x000180
   FLASH_REGS : origin = 0x000A80, length = 0x000060
   CSM        : origin = 0x000AE0, length = 0x000010
   XINTF      : origin = 0x000B20, length = 0x000020
   CPU_TIMER0 : origin = 0x000C00, length = 0x000008
   CPU_TIMER1 : origin = 0x000C08, length = 0x000008                 
   CPU_TIMER2 : origin = 0x000C10, length = 0x000008                 
   PIE_CTRL   : origin = 0x000CE0, length = 0x000020
   PIE_VECT   : origin = 0x000D00, length = 0x000100


   /* Peripheral Frame 1:   */
   ECAN_A     : origin = 0x006000, length = 0x000100
   ECAN_AMBOX : origin = 0x006100, length = 0x000100


   /* Peripheral Frame 2:   */
   SYSTEM     : origin = 0x007010, length = 0x000020
   SPI_A      : origin = 0x007040, length = 0x000010
   SCI_A      : origin = 0x007050, length = 0x000010
   XINTRUPT   : origin = 0x007070, length = 0x000010
   GPIOMUX    : origin = 0x0070C0, length = 0x000020
   GPIODAT    : origin = 0x0070E0, length = 0x000020
   ADC        : origin = 0x007100, length = 0x000020
   EV_A       : origin = 0x007400, length = 0x000040
   EV_B       : origin = 0x007500, length = 0x000040
   SPI_B      : origin = 0x007740, length = 0x000010
   SCI_B      : origin = 0x007750, length = 0x000010
   MCBSP_A    : origin = 0x007800, length = 0x000040


   /* CSM Password Locations */
   CSM_PWL    : origin = 0x3F7FF8, length = 0x000008


   /* SARAM                    */     
   RAML0L1    : origin = 0x008000, length = 0x002000
   RAMH0      : origin = 0x3F8000, length = 0x002000        
}




SECTIONS
{
   /* Allocate program areas: */
   .reset              : > BEGIN       PAGE = 0
   vectors             : > VECTORS     PAGE = 0
   .cinit              : > FLASHJ      PAGE = 0
   .text               : > FLASHA       PAGE = 0


   /* Allocate data areas: */
   .stack              : > RAMM0M1     PAGE = 1
   .bss                : > RAML0L1     PAGE = 1
   .ebss               : > RAML0L1     PAGE = 1
   .const:                        load =         FLASHB PAGE 0, run = RAML0L1 
PAGE 1
        {
            /* Get Run Address        */
            __const_run = .;
            /* Mark Load Address*/
            *(.c_mark)
            /* Allocate .const        */
            *(.const)
            /* Compute Length        */
            __const_length = .-__const_run;
        }  
   
   .econst:                        load =         FLASHB PAGE 0, run = RAML0L1 
PAGE 1
        {
            /* Get Run Address        */
            __econst_run = .;
            /* Mark Load Address*/
            *(.ec_mark)
            /* Allocate .const        */
            *(.econst)
            /* Compute Length        */
            __econst_length = .-__econst_run;
        }    
   .sysmem             : > RAMH0       PAGE = 1


   /* Allocate IQ math areas: */
   IQmath              : > FLASHI      PAGE = 0   /* Math Code */
   IQmathFastTables    : > FLASHI      PAGE = 0   /* Math Tables in fast memory 
*/
   IQmathTables        : > ROM         PAGE = 0   /* Math Tables In ROM */
      
   /* Allocate Peripheral Frame 0 Register Structures:   */
   DevEmuRegsFile      : > DEV_EMU     PAGE = 1
   FlashRegsFile       : > FLASH_REGS  PAGE = 1
   CsmRegsFile         : > CSM         PAGE = 1
   XintfRegsFile       : > XINTF       PAGE = 1
   CpuTimer0RegsFile   : > CPU_TIMER0  PAGE = 1      
   CpuTimer1RegsFile   : > CPU_TIMER1  PAGE = 1      
   CpuTimer2RegsFile   : > CPU_TIMER2  PAGE = 1      
   PieCtrlRegsFile     : > PIE_CTRL    PAGE = 1      
   PieVectTable        : > PIE_VECT    PAGE = 1


   /* Allocate Peripheral Frame 2 Register Structures:   */
   ECanaRegsFile       : > ECAN_A      PAGE = 1   
   ECanaMboxesFile     : > ECAN_AMBOX  PAGE = 1


   /* Allocate Peripheral Frame 1 Register Structures:   */
   SysCtrlRegsFile     : > SYSTEM      PAGE = 1
   SpiaRegsFile        : > SPI_A       PAGE = 1
   SciaRegsFile        : > SCI_A       PAGE = 1
   XIntruptRegsFile    : > XINTRUPT    PAGE = 1
   GpioMuxRegsFile     : > GPIOMUX     PAGE = 1
   GpioDataRegsFile    : > GPIODAT     PAGE = 1
   AdcRegsFile         : > ADC         PAGE = 1
   EvaRegsFile         : > EV_A        PAGE = 1
   EvbRegsFile         : > EV_B        PAGE = 1
   ScibRegsFile        : > SCI_B       PAGE = 1
   McbspaRegsFile      : > MCBSP_A     PAGE = 1


   /* CSM Password Locations */
   CsmPwlFile          : > CSM_PWL     PAGE = 1


}






然后把lib文件替换成:rts2800_fl040830.lib
就可以啦.
希望你也成功!!!




本人qq: 15007807  欢迎以后交流. 
点评:
FLASH不用分这么细的,编大一点的程序会有麻烦
以下是本人做过的某项目CMD文件
MEMORY
{
PAGE 0 :
   /* For this example, H0 is split between PAGE 0 and PAGE 1 */  
   /* BEGIN is used for the "boot to HO" bootloader mode      */
   /* RESET is loaded with the reset vector only if           */
   /* the boot is from XINTF Zone 7.  Otherwise reset vector  */
   /* is fetched from boot ROM. See .reset section below      */
   
   RAMM0      : origin = 0x000000, length = 0x000400
   BEGIN      : origin = 0x3f7ff6, length = 0x000002  
   PRAMH0     : origin = 0x3d8000, length = 0x004000   /*   */
   RESET      : origin = 0x3FFFC0, length = 0x000002           
   
         
PAGE 1 : 


   /* For this example, H0 is split between PAGE 0 and PAGE 1 */


   LSARAM     : origin = 0x3de000, length = 0x008000 /*   */
   RAMM1      : origin = 0x000400, length = 0x000400
   DRAMH0     : origin = 0x3f8000, length = 0x001000 /*   */
   BUFA       : origin = 0x8000,   length=0x1000
   BUFB       : origin = 0x9000,   length=0x1000
   BUFC       : origin = 0x3f9000, length=0x1000
   RECORDDATA : origin = 0x80020,  length=0x700
   PARAMETER  : origin = 0x80725,  length=0x20
   PASSWORD   : origin = 0x80005,  length=0x08
}




SECTIONS
{
   /* Setup for "boot to H0" mode: 
      The codestart section (found in DSP28_CodeStartBranch.asm)
      re-directs execution to the start of user code.  
      Place this section at the start of H0  */


   codestart        : > BEGIN,        PAGE = 0
   ramfuncs         : > PRAMH0        PAGE = 0  
   .text            : > PRAMH0,       PAGE = 0
   .cinit           : > PRAMH0,       PAGE = 0
   .pinit           : > PRAMH0,       PAGE = 0
   .switch          : > RAMM0,        PAGE = 0
   .reset           : > RESET,        PAGE = 0, TYPE = DSECT /* not used, */
   
   .stack           : > RAMM1,        PAGE = 1
   .ebss            : > DRAMH0,       PAGE = 1
   .econst          : > LSARAM,       PAGE = 1      
   .esysmem         : > DRAMH0,       PAGE = 1
   .bufferA         : {}>BUFA         PAGE 1 
   .bufferB         : {}>BUFB         PAGE 1  
   .bufferC         : {}>BUFC         PAGE 1  
   .RecordData      : {}>RECORDDATA   PAGE 1
   .parameter       : {}>PARAMETER    PAGE 1
   .password        : {}>PASSWORD     PAGE 1
}


2007.8.13 19:04 作者:wind 收藏 | 评论:0
于DDS的简单介绍
分类:默认栏目DDS同DSP(数字信号处理)一样,是一项关键的数字化技术。DDS是直接数字式频率合成器(Direct Digital 
Synthesizer)的英文缩写。与传统的频率合成器相比,DDS具有低成本、低功耗、高分辨率和快速转换时间等优点,广泛使用在电信与电子仪器领域,是实现设备全数字化的一个关键技术。 


  
一块DDS芯片中主要包括频率控制寄存器、高速相位累加器和正弦计算器三个部分(如Q2220)。频率控制寄存器可以串行或并行的方式装载并寄存用户输入的频率控制码;而相位累加器根据频率控制码在每个时钟周期内进行相位累加,得到一个相位值;正弦计算器则对该相位值计算数字化正弦波幅度(芯片一般通过查表得到)。DDS芯片输出的一般是数字化的正弦波,因此还需经过高速D/A转换器和低通滤波器才能得到一个可用的模拟频率信号。 


 
 另外,有些DDS芯片还具有调幅、调频和调相等调制功能及片内D/A变换器(如AD7008)。 
 
DDS有如下优点:⑴ 频率分辨率高,输出频点多;⑵频率切换速度快,可达us量级;⑶ 频率切换时相位连续;⑷ 可以输出宽带正交信号;⑸ 
输出相位噪声低,对参考频率源的相位噪声有改善作用;⑹可以产生任意波形;⑺ 
全数字化实现,便于集成,体积小,重量轻,因此八十年代以来各国都在研制和发展各自的DDS产品,如美国QUALCOMM公司的Q2334,Q2220;STANFORD公司的STEL-1175,STEL-1180;AD公司的AD7008,AD9850,AD9854等。这些DDS芯片的时钟频率从几十兆赫兹到几百兆赫兹不等,芯片从一般功能到集成有D/A转换器和正交调制器。
2007.8.13 18:44 作者:wind 收藏 | 评论:0
使用C/C 语言编写基于DSP程序的注意事项
分类:默认栏目 1、 
不影响执行速度的情况下,可以使用c或c/c++语言提供的函数库,也可以自己设计函数,这样更易于使用“裁缝师”优化处理,例如:进行绝对值运算,可以调用fabs()或abs()函数,也可以使用if...else...判断语句来替代。 


    2、 要非常谨慎地使用局部变量,根据自己项目开发的需要,应尽可能多地使用全局变量和静态变量。
    3、 
一定要非常重视中断向量表的问题,很多朋友对中断向量表的调用方式不清楚。其实中断向量表中的中断名是任意取定的,dsp是不认名字的,它只认地址!!中断向量表要重新定位。这一点很重要。
    4、 
要明确dsp软件开发的第一步是对可用存储空间的分析,存储空间分配好坏关系到一个dsp程序员的水平。对于dsp,我们有两种名称的存储空间,一种是物理空间,另一种是映射空间。物理空间是dsp上可以存放数据和程序的实际空间(包括外部存储器),我们的数据和程序最终放到物理空间上,但我们并不能直接访问它们。我们要访问物理空间,必须借助于映射空间才行!!但是映射空间本身是个“虚”空间,是个不存在的空间。所以,往往是映射空间远远大于实际的物理空间,有些映射空间,如io映射空间,它本身还代表了一种接口。只有那些物理空间映射到的映射空间才是我们真正可访问(读或写)的存储空间。
    5、 尽可能地减少除法运算,而尽可能多地使用乘法和加法运算代替。
    6、 
如果ti公司或第三方软件合作商提供了dsplib或其他的合法子程序库供调用,应尽可能地调用使用。这些子程序均使用用汇编写成,更为重要之处是通过了tms320算法标准测试。而且,常用的数字信号处理算法均有包括!!
    7、 尽可能地采用内联函数!!而不用一般的函数!!可以提高代码的集成度。
    8、 编程风格力求简炼!!尽可能用c语言而不用c++语言。我个人感到虽然c++终代码长了一些,好象对执行速度没有影响。
    9、 
因为在c5000中double型和float型均占有2个字,所以都可以使用,而且,可以直接将int型赋给float型或double型,但,尽可能地多使用int数据类型代替!这一点需要注意!!
    10、 程序最后至少要加上一个空行,编译器当这个空行为结尾提示符。
    11、 大胆使用位运算符,非常好用!!
2007.8.13 18:09 作者:wind 收藏 | 评论:0
CMD文件的作用
分类:默认栏目在DSP里,程序执行过程中也有好多地方需要跳转,所以需要跳转的目标地址。如果你在编程序时知道你所要跳转的地址,那就更好的,但实际上,这是很不好控制的。所以就产生了.CMD。它有一个最大的好处,可以把每个段分配地址,所以比如你想从一个段跳到另一个段的时候,就很方便的知道这个段的起始地址。 


CMD 
它是用来分配rom和ram空间用的,告诉链接程序怎样计算地址和分配空间.所以不同的芯片就有不同大小的rom和ram.放用户程序的地方也不尽相同.所以要根据你的芯片进行修改.cmd文件分两部分.MEMORY和SECTIONS. 


MEMORY 

  PAGE 0 .......... 
  PAGE 1......... 

SECTIONS 
{SECTIONS 

.vectors ................. 
.reset ................. 
................ 



MEMORY是用来指定芯片的rom和ram的大小和划分出几个区间. 
PAGE 0 对应rom;PAGE 1对应ram 
PAGE 里包含的区间名字与其后面的参数反映了该区间的起始地址和长度. 
如: PAGE 0 : VECS(区间名字): origin(起始地址) = 0h , length (长度)=040h /*VECTORS*/ 
SECTIONS:(在程序里添加下面的段名如.vectors.用来指定该段名以下,另一个段名以上的程序(属于PAGE0)或数据(属于PAGE1)放到“>”符号后的空间名字所在的地方。 


如引用字段名“.vectors ”的程序或数据将被放到VECS ,VECS是PAGE0即是ROM空间 00H至40H的地方 
SECTIONS 

.vectors : { } > VECS PAGE 0 /* Interrupt vector table */ 
.reset :   { } > VECS PAGE 0 /* Reset code */ 
............ 

.vectors,.reset都是段名。  加不加“.”随你便,即.vectors表示名为  “.vectors”的段。 
{}表示段的全部,{}> VECS PAGE 0表示将段的全部放入名为 VECS PAGE 0的内存区。 
example: 
/****************************************************************************/ 


/******** Specify the memory configuration **********************************/ 


/****************************************************************************/ 


MEMORY 

PAGE 0: VECS: origin = 00000h, length = 00040h 
         LOW: origin = 00040h, length = 03FC0h 
       SARAM: origin = 04000h, length = 00800h 
          B0: origin = 0FF00h, length = 00100h 
PAGE 1: B0: origin = 00200h, length = 00100h 
        B1: origin = 00300h, length = 00100h 
        B2: origin = 00060h, length = 00020h 
     SARAM: origin = 08000h, length = 00800h 

/*--------------------------------------------------------------------------*/ 
/* SECTIONS ALLOCATION  */ 
/*--------------------------------------------------------------------------*/ 
SECTIONS 

.text : { } > LOW PAGE 0 
.cinit : { } > LOW PAGE 0 
.switch : { } > LOW PAGE 0 
.const : { } > SARAM PAGE 1 
.data : { } > SARAM PAGE 1 
.bss : { } > SARAM PAGE 1 
.stack : { } > SARAM PAGE 1 
.sysmem : { } > SARAM PAGE 1 

1,系统定义: 
.cinit 存放C程序中的变量初值和常量; 
.const 存放C程序中的字符常量、浮点常量和用const声明的常量; 
.switch 存放C程序中switch语句的跳针表; 
.text 存放C程序的代码; 
.bss 为C程序中的全局和静态变量保留存储空间; 
.far 为C程序中用far声明的全局和静态变量保留空间; 
.stack 为C程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果; 
.sysmem 用于C程序中malloc、calloc和realloc函数动态分配存储空间 
2,用户定义: 
#pragma CODE_SECTION (symbol, "section name"; 
#pragma DATA_SECTION (symbol, "section name" 






DSP的C语言的特殊性 
大家在使用51系列C语言时已经注意到,控制器的C语言和PC机上使用的C有一个显著的特点:经常要对硬件操作,程序中有大量针对控制器内部资源进行操作的语句。所以,开发者要明白怎样用C语言来操纵控制器的内部资源,既怎样用C语句操作寄存器和内部存储器等。 


举个例子,在51汇编中我们写 MOV A,#20H,汇编程序能够识别A是指累加器,而在51 C程序中我们写 
ACC=32;,编译器能够识别ACC是指累加器而不是一般的变量。即每一个寄存器都有一个专有名字供开发者使用,它们定义在一个头文件reg51.h 
中,程序员只需在程序的开始部分用#include“reg51.h”语句将该文件包含进来即可。注意:这些寄存器的名字不能用做变量名。 
同样,在TMS320F240的C语言中也有一个头文件C240.H定义各个寄存器的名称,这里摘录几条语句进行介绍。 
比如:#define IMR ((PORT)0x0004) 
#define XINT1_CR ((PORT)0x07070) 
IMR 
、XINT1_CR就对应两个寄存器,实际是寄存器的地址,用高级语言的说法是指针。我们也在程序的开始部分用#include“c240.h”语句将该文件包含进来。这样,在DSP的C语言中使用它们只需在前面加一个星号(*),例如, 


*IMR=0X1010;/* 将16进制数1010H赋给IMR寄存器 */ 
*XINT1_CR=0X0A0B0;/*将16进制数A0B0H赋给XINT1_CR寄存器 */ 


最好将c240.h这个文件打印出来,弄清楚各个寄存器的定义名称。 
TMS320F240芯片的C语言开发过程 
简单地说,整个过程包括以下五个步骤: 
1、编辑C语言源程序 
2、编译源程序(注意编译参数) 
3、链接目标文件(注意用CMD文件&#x
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/697491
推荐阅读
相关标签
  

闽ICP备14008679号