*.gel是你的秘书,可以帮你打杂
Gel文件用来处理一些繁琐的事情,例如我总是用Gel来自动初始化DSP系统,代码如下:StartUp() { int i; //setup_memory_map(); for( i=0; i<1000; i++) i=i; GEL_Reset(); for( i=0; i<1000; i++) i=i; init_emif(); for( i=0; i<1000; i++) i=i; GEL_ProjectLoad( "D://ti//MyProjects//EagleEye//V100//EagleEye.pjt"); for( i=0; i<10000; i++) i=i; GEL_Load( "D://ti//MyProjects//EagleEye//V100//debug//EagleEye.out"); for( i=0; i<10000; i++) i=i; GEL_Go( main); }
[color=rgb(51, 102, 153) !important]复制代码
只要打开CCS,它就会自动依次执行:系统软件复位、配置EMIF的各种寄存器、打开项目文件、装载项目文件,并且自动执行到MAIN(),停在那里等着你继续操作。
如果不用Gel,你就麻烦了。
GEL 文件的功能同emuinit.cmd 的功能基本相同,用于初始化DSP。但它的功能比emuinit的功能有所增强,GEL 在CCS 下有一个菜单,可以根据DSP 的对象不同,设置不同的初始化程序。
以TMS320LF2407 为例: #define SCSR1 0x7018 ;定义scsr1 寄存器 #define SCSR2 0X7019 ;定义scsr2 寄存器 #defineWDKEY 0x7025 ;定义wdkey 寄存器 #defineWDNTR 0x7029 ;定义wdntr 寄存器 StartUp() ; 开始函数 { GEL_MapReset(); ; 存储空间复位GEL_MapAdd(0x0000,0,0x7fff,1,1); 定义程序空间从0000 -7fff 可读写 GEL_MapAdd(0x8000,0,0x7000,1,1); 定义程序空间从8000-f000 可读写 GEL_MapAdd(0x0000,1,0x10000,1,1); 定义数据空间从0000-10000 可读写 GEL_MapAdd(0xffff,2,1,1,1); 定义i/o 空间0xffff 可读写 GEL_MapOn(); 存储空间打开 GEL_MemoryFill(0xffff,2,1,0x40); 在i/o 空间添入数值40h *(int *)SCSR1=0x0200; 给scsr1 寄存器赋值 *(int *)SCSR2=0x000C; 给scsr2 寄存器赋值,在这里可以进行mp/mc 方式的转换 *(int *)WDNTR=0x006f; 给wdntr 寄存器赋值 *(int *)WDKEY=0x055; 给wdkey 寄存器赋值 *(int *)WDKEY=0x0AA; 给wdkey 寄存器赋值 }
[color=rgb(51, 102, 153) !important]复制代码
GEL文件只是在仿真器和目标系统上电的时候起到初始化dsp的作用在上电后再改变GEL文件将不会对DSP产生影响除非断电后再上电;
DSP5416的GEL文件/* set PMST to: MP = OVLY = 1; DROM off, CLKOUT on */ #define PMST_VAL 0x0ffe0u /* set wait-state control reg for: 2 w/s or more on i/o; one for ext memory */ #define SWWSR_VAL 0x2009u /* set external-banks switch control for: no bank switching; BH set */ #define BSCR_VAL 0x02u /* Set Default Reset Initialization Value */ #define ZEROS 0x0000u
[color=rgb(51, 102, 153) !important]复制代码
这一部分是对寄存器初始化/* Set Peripheral Control Register Addresses for DEV_RESET */ #define DMPREC 0x0054u #define DMSA 0x0055u #define DMSDI 0x0056u #define DMA_CH0_DMFSC_SUB_ADDR 0x0003u #define DMA_CH1_DMFSC_SUB_ADDR 0x0008u #define DMA_CH2_DMFSC_SUB_ADDR 0x000Du #define DMA_CH3_DMFSC_SUB_ADDR 0x0012u #define DMA_CH4_DMFSC_SUB_ADDR 0x0017u #define DMA_CH5_DMFSC_SUB_ADDR 0x001cu #define MCBSP0_SPSA 0x0038u #define MCBSP0_SPSD 0x0039u #define MCBSP1_SPSA 0x0048u #define MCBSP1_SPSD 0x0049u #define MCBSP2_SPSA 0x0034u #define MCBSP2_SPSD 0x0035u #define MCBSP_SPCR1_SUB_ADDR 0x0000u #define MCBSP_SPCR2_SUB_ADDR 0x0001u #define MCBSP_SRGR1_SUB_ADDR 0x0006u #define MCBSP_SRGR2_SUB_ADDR 0x0007u #define MCBSP_MCR1_SUB_ADDR 0x0008u #define MCBSP_MCR2_SUB_ADDR 0x0009u #define SRGR1_INIT 0x0001u #define PRD0 0x0025u #define TCR0 0x0026u #define PRD1 0x0031u #define TCR1 0x0032u #define TIMER_STOP 0x0010u #define TIMER_RESET 0x0020u #define PRD_DEFAULT 0xFFFFu #define GPIOCR 0x0010u StartUp() { C5416_Init(); GEL_TextOut("Gel StartUp complete./n"); } menuitem "C5416_Configuration"; hotmenu CPU_Reset() { GEL_Reset(); PMST = PMST_VAL; /* don't change the wait states, let the application code handle it */ /* note: at power up all wait states will be the maximum (7) */ /* SWWSR = SWWSR_VAL; */ BSCR = BSCR_VAL; GEL_TextOut("CPU Reset Complete./n"); } /* All memory maps are based on the PMST value of 0xFFE8 */ hotmenu C5416_Init() { GEL_Reset(); PMST = PMST_VAL; /* don't change the wait states, let the application code handle it */ /* note: at power up all wait states will be the maximum (7) */ /* SWWSR = SWWSR_VAL; */ BSCR = BSCR_VAL; C5416_Periph_Reset(); GEL_XMDef(0,0x1eu,1,0x8000u,0x7f); GEL_XMOn(); GEL_MapOn(); GEL_MapReset(); GEL_MapAdd(0x80u,0,0x7F80u,1,1); /* DARAM */ GEL_MapAdd(0x08000u,0,0x8000u,1,1); /* External */ GEL_MapAdd(0x18000u,0,0x8000u,1,1); /* DARAM */ GEL_MapAdd(0x18000u,0,0x8000u,1,1); /* SARAM */ GEL_MapAdd(0x28000u,0,0x8000u,1,1); /* SARAM */ GEL_MapAdd(0x0u,1,0x60u,1,1); /* MMRs */ GEL_MapAdd(0x60u,1,0x7FA0u,1,1); /* DARAM */ GEL_MapAdd(0x08000u,1,0x8000u,1,1); /* DARAM */ GEL_TextOut("C5416_Init Complete./n"); } /* ****************************** */ C5416_Periph_Reset() { IFR = 0xFFFFu; IFR = 0x0000u; DMA_Reset(); MCBSP0_Reset(); MCBSP1_Reset(); MCBSP2_Reset(); TIMER0_Reset(); GPIO_Reset(); } DMA_Reset() MCBSP0_Reset() MCBSP1_Reset() MCBSP2_Reset() TIMER0_Reset() GPIO_Reset()
[color=rgb(51, 102, 153) !important]复制代码
在上面的各个初始化函数中,多半是把0值付给寄存器。当然这些初始化值如果用户不使用的话必须在主程序中做修改。
所以加载了GEL文件以后,并不一定所有的寄存器都是复位值,主程序中没有赋值的寄存器并不一定就是它的上电复位值,因为加上了仿真器,加载了GEL文件,起到了作用。