首先建立工程,file-new-css project。然后设置该工程。(包含include路径,是否使用浮点,生成的文件路径等),然后加入一些TI已经写好的文件。最终如下图:
pjt是project的缩写,你可以用任何的文本编辑软件打开查看里面的内容,例如记事本等。他里面主要指定了这个工程里有哪些源文件(.C、.CPP)要参与编译,头文件的搜索路径,还有就是工程的编译选项。你在工程里添加删除源文件,build option里修改编译选项,实际上就是在修改这个pjt文件,每个项目\工程都要有一个对应的pjt文件,这样才能在CCS中管理工程,编译工程并最终输出可下载到DSP目标板运行的out文件。(编译后根据配置生成)
利用网上找的一个VC下的解释,在用VC编写程序的时候经常要用到相对路径的问题,在程序中写绝对路径会给代码移植带来巨大的麻烦,可以说是编程大忌。下面说明如何写相对路径。
相对路径,顾名思义,就是以当前文件为标准,找到另一个文件的位置关系。
如果当前打开的文件中要寻找同级的目录文件就要用到.\或者./vc编译器都可以识别。例如#define ".\XX\XX\xx.h"
如果当前打开的文件中要寻找在上级的目录文件就要用到..\或者../vc编译器都可以识别。例如#define "..\XX\XX\xx.h"
通过这样简单的标识,vc相对路径的问题就解决了,这样也就避免了设置繁琐的系统路径。当然了,设置相对路径要在编码的时候对文件的存放层次关系特别清楚,否则统一修改路径将会带来很大的工作量。
绝对路径即从最上层一步步的全部包含的地址。
感觉应该都是根据这个地址设置相对路径的。(上一级应该指的是\ZQ28335_SPI_8SEG的上一级)
头两个找到的是编译器的安装路径中的文件,大括号定义中的变量不知在哪,后两个为这两个文件放置的路径,大括号中的变量就定义在macros.ini中。
仿真器与目标板建立链接的设置。(写入仿真器的型号,目标板的型号。)
ccmxl文件用于仿真器与板子之间的连接,是仿真器在线调试必须的;
a.新建New——TargetConfiguration File即可;建立后单击View——TargetConfiguration即可查看;
注意,有必要在其上右击选择setas default将其设为default;
b.在新建项目后,也可以在其上右击选择LinkFile To Project将其添加到你的工程中去;
c.板子接仿真器,然后上电,右击ccxml文件,点击launchselected configuration,这样可以测试仿真器与板子的链接;
成功连接后,就可以点Run-Load-Load Program选项添加你的编译生成的.out文件,进行在线仿真。
主要是对外设的寄存器与内存的地址建立了联系(包含MEMORY与SECTIONS)
MEMORY代表内存空间,PAGE0是程序空间, PAGE1是数据空间;(就是放入到内存的哪个位置)
SECTIONS代表需要映射的段。
MEMORY 指令可以根据实际的硬件地址建立一个地址空间模型,SECTION 这条指令就可以起到地址控制分配的只用,将初始化和未初始化的段非配到 MEMORY建立的地址空间去。
(MEMORY也即是把一块内存地址取个名字,SECTIONS也即是把谁放入到这个内存中)
例如上面即时把DevEmuRegsFile段放到DEV_EMU中,也即是0x000880到0x000180内存中。
如果想改变放置的位置,下面是官方DSP2833x_GlobalVariableDefs.c中的一段代码:
#ifdef __cplusplus
#pragma DATA_SECTION("DevEmuRegsFile")
#else
#pragmaDATA_SECTION(DevEmuRegs,"DevEmuRegsFile");
#endif
volatile struct DEV_EMU_REGSDevEmuRegs;
在CCS编程中,如果我们不指定变量的存放位置,编译器会自动的给变量分配一个位置,但是如果有的时候需要把变量放在一个特定的空间内,我们应该如何操作呢,CCS提供了如下的两个指令:#pragma CODE_SECTION 与#pragma DATA_SECTION
其中data_section是针对数据空间的,code_section是针对程序空间的,具体的使用办法是
#pragmaDATA_SECTION(bufferB, ”my_sect”)
char bufferB[512];
在.cmd文件中建立对应的section就可以使用了。
MEMORY { PAGE 1: spacename :origin = 0x...., length 0x.. }
SECTIONS { .my_sect : {} >spacename PAGE 1 }
#pragma DATA_SECTION(函数名或全局变量名,"用户自定义在数据空间的段名");
#pragma CODE_SECTION(函数名或全局变量名,"用户自定义在程序空间的段名");
注意不能在函数体内声明,必须在定义和使用前声明,#pragma可以阻止对未调用的函数的优化。
对内存与段进行了划分,与DSP2833x_Headers_nonBIOS.cmd不同的是DSP2833x_Headers_nonBIOS.cmd只是对外设寄存器的位置的配置。28335_RAM_lnk.cmd对应的是可执行程序的放置位置的配置。方法是相同的。
DSP2833x_SysCtrl.c是对DSP2833x 的系统控制模块进行初始化。首先
(例如关于时钟,默认是全部开启)可以根据实际的项目进行修改。
DSP2833x_PieCtrl.c初始化外围中断矢量控制寄存器
其内部函数的形式:
主要是对在该头文件中出现的中断函数初始化一个默认的入口地址,如果在使能中断,但是又没有重新给他赋值新地址的时候则该地址则为其中断函数的入口地址。简单的说就是使能中断向量表,并且初始化相应的中断入口地址。函数如下:
定义了这样的一个结构体,内部元素为各中断源名字。(是定义的中断函数的函数名)
在对应头文件中。DSP2833x_DefaultIsr.c,似乎是定义的一个个空的中断函数,需要相应的中断函数的时候就在相应的空函数体内加入代码。(实际上似乎不是的,等之后编中断函数的时候再确认)函数如下形式:
28335如果是正常启动的话,ADC_cal()这个校准函数在上电引导程序内就被自动调用了,用户不需要干预。而在调试模式下这一过程可能被绕过,所以需要用户自行调用,以校准ADC的转换结果。
文档上提供的两种方法1、汇编法 2、指针函数法。第2种比较好理解,就是定义一个指向校准函数的指针,然后打开ADC时钟,运行校准函数就行。
第一种方法中,第一步添加adc_cal.asm,第二步映射到内存中一个位置,第三步调用adc_cal()
执行完boot之后就执行该程序,
CMD文件把codestart段放到0x33FFF6位置处,文件“DSP2833x_CodeStartBranch.asm”中有codestart段的定义,实际上codestart段只是包含了一个跳转指令,是程序跳转到_c_int00处,_c_int00在boot.asm in RTS library中有定义,_c_int00的代码最终会调用c的main函数,之后就是main函数的执行。(其实,仿真状态下,这个DSP281x_CodeStartBranch.asm文件是不起作用的。原因嘛就是一仿真,仿真器直接把程序入口放到了_c_int00处了。也就是说,_c_int00之前的所有程序被仿真器跳过了,根本不执行。但是在FLASH启动下,这个DSP281x_CodeStartBranch.asm文件就是必须的,否则不能启动)
rts2800.lib:C/C++运行支持库;
rts2800_ml.lib C/C++大内存模式运行支持库.
rts2800_ml.lib中有大量浮点运算处理的函数而rts2800.lib没有,具体可在库文件的原文件中查询。
具体解释在划线处。(运行时把相应的代码搬移到RAM中)
以上这些都是TI公司已经写好,可直接放入我们的工程中,方便我们的开发,具体使用可以再修改这些文件。