初学 TI-DSP-C2000 指南
Author:mcj166
Time:2024.10.28
初识工作空间
背景:CCS软件基于eclipse,工作空间(workSpace)这个概念也从eclipse那里继承过来了。
作用:工作空间是CCS的工作路径。该路径下可以管理多个CCS工程。
打开CCS软件,第一件事就是选取工作空间目录。
工作空间目录下,会自动生成四个文件夹,用于保存工作空间的数据,不用管它。
- .jxbrowser.userdata
- .metadata
- dvt
- RemoteSystemsTempFiles
剩下的文件夹才是你的工程文件夹,或者其他。
有一个坑,工程不能放在工作空间目录,必须放在文件夹中,不然会出现无法导入工程的情况。
初识工程根目录
看到一些文件夹,形如
- DSP2833x_common
- DSP2833x_headers
很可能是你的工程依赖,并不是工程。工程可能会调用这些依赖。
一个v6版本以上的CCS工程,包含这些文件:

这三个文件都是在同一个目录下出现的。该目录即工程根目录。
工程根目录,在CCS默认设置中表示为 ${PPROJECT_LOC}
。
初识工程依赖
1、头文件目录(编译时需要)、库文件目录(链接时需要):
选择 Project
–>Properties

2、源文件依赖:
工程目录之外的源文件,如何被工程引用,需要手动引用成为工程依赖。
选择 Project
–>Add Files
–>选择文件(多选)–> Link to files (勾选相对路径)

然后在 Project Explorer
中使用鼠标拖动,将引用的源文件拖动到Source文件夹中,使得文件树结构更清晰。
3、依赖项管理:
选择 Project
–>Properties

工程目录之内存在的文件和文件夹,CCS都会自动引用为工程依赖。
如果有不想编译的 某文件
,需要手动进行编译屏蔽。
操作是右击该文件,选择 Exclude from Build
,该文件就会变灰色。
初识ti-cgt编译器
选择 Project
–>Properties

ti-cgt编译器:CCS使用专门编译C2000工程的编译器。
编译器版本的坑:莫名其妙的编译问题,试试换一个编译器版本,也许就解决了…
编译器版本管理:去ti官网下载,搜索 ti-cgt-c2000编译器,然后找教程安装。
编译优化:优化等级越高,文件体积越小,运行速度越快,但是调试信息越少。
初识配置
背景:CCS软件基于eclipse,配置(Configuration)也继承过来了。
作用:一个配置,保存了一套编译参数、链接参数、编译器版本、编译屏蔽等设置。
好处:允许一个工程保存几种不同配置,方便灵活切换。

一般情况下,设置两个配置,一个叫Debug,一个叫Release。
Debug是将编译好的 .out
文件烧录到目标器件的RAM中。烧录到RAM的特点是运行速度超快,烧录速度超快,但可能RAM不够大,掉电程序丢失。
Release是将编译好的 .out
文件或者 .bin
文件烧录到目标器件的FLASH中。烧录到FLASH的特点是运行速度慢,烧录速度慢,好在空间够大,掉电程序不丢失。
编译时,CCS会在工程目录下自动生成文件夹,文件夹名字是Debug和Release,和配置名字对应。编译产生的文件都存放在文件夹中。
初识目标配置文件
作用:目标配置(Target-Configuration)文件是 .ccxml
后缀。它定义了你用的什么型号的下载器、你的目标芯片是哪一款C2000芯片。如果不对应,就会报错,无法烧录程序。
方式一(手动配置):选择 File
–>New
–>Target Configuration File
。
方式二(自动配置):选择 Project
–>Properties
–>General
–>勾选自动配置Target-Configuration。
初识cmd文件
称呼:linker command file。
背景:是嵌入式汇编相关的文件。定义了存储空间的分页(PAGE)、分段(SECTIONS),及其寻址地址。
作用:定义存储空间(FLASH、RAM等)的划分。支持按需修改,但要注意特定硬件特定地址。
实操:将ti提供的 .cmd
文件拷贝到工程目录下,是大多数人的选择。必要时候,可能需要简单修改。
初识Flash烧录
一般来说,对于烧录到RAM中的操作,新手都很容易上手。但是,烧录到FLASH中的话,就很容易犯浑。

上图展示了Release配置下,需要将程序烧录到FLASH中,所以使用了ti提供的
- DSP2833x_Headers_nonBIOS.cmd
- Example_Flash28335_API.cmd
- Flash28335_API_V210.lib
- Example_Flash2833x_API.h
- Flash2833x_API_Config.h
- Flash_2833x_API_Library.h
- Example_Flash2833x_API.c
- Example_Flash2833x_CsmKeys.asm
其中,部分源码存在于 Flash28335_API_V210.lib
库文件中。
有一个坑:下载到Flash中的程序,运行会很慢,RAM中运行需要100ns,在Flash中可能就需要10us了。会发现Debug和Release的差别很大。
但是又不可能把所有代码从Flash拷贝到RAM中,因为RAM可能不够大。ti是这样解决的,只将函数代码从Flash拷贝到RAM中,并且只是一小部分函数。这一小部分函数是需要高速运行的函数,例如中断函数、反复调用的函数、计算量大的函数。
以下伪代码,是来自ti的例子,提取出来的。
// 首先,需要在 main 函数中调用下面。不然就没办法拷贝函数到RAM
// 其中,在 .cmd 文件中搜索,可找到一个段(Section)命名为 ramfuncs
Example_MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);
InitFlash();
// 其次,把某函数拷贝到RAM,也就是拷贝到段(Section)命名为 ramfuncs
// 在某函数声明或者定义的地方,进行如下操作
#pragma CODE_SECTION(myFUNC, "ramfuncs");
void myFUNC();
选择 Window
–>Show View
–>Memory Allocation

观察发现,ramfuncs的占用变大了,说明成功将函数拷贝ram了。
初识例程
例程的学习肯定是初学者必须经历的。那么,例程去哪里找呢。这里,推荐ti官方的例程。ti的例程可以简单的分为三个类型,一个是device-support,一个是driverlib,一个是SDK和libraries。
拿到一个现有的工程,如果你很容易判断出工程中的哪些文件拷贝自哪个类型的例程,说明你了解得够多。所以,学习例程会帮忙你加深对代码的理解。ti提供的例程、资料、套件每年都在更新,所以例程也都迭代了很好版本了。
1、说说device-support:
device-support版本的例程是用寄存器来编程。编程过程中,你需要查询技术参考手册(Technical Reference Manual)了解寄存器的作用。技术参考手册在ti官网获取,例如 sprui07 是ti提供的TMS320F2833x的技术参考手册。
device-support分为老版和新版。
老版在 controlSUITE 套件里面找到,直到2016年更新到V210之后停更了。直到目前还有很多很多工程代码参考的是老版例程,所以是一定要掌握的。
新版放在了 C2000Ware 套件里面,直到目前2024年还在更新。但是仔细观察的话,新版和旧版并没有太大差别,基本上只是改了个名字,实质性代码并没有变。
2、说说driverlib:
driverlib版本可以说是比较新的版本了,代码风格和device-support版本相差挺大。同样也在 C2000Ware 套件中。
driverlib版本的例程是用库函数来编程的。库函数是ti帮你写好的。你只需要调用库函数就能比较轻松的配置寄存器。熟练的话都不需要查询技术参考手册了。
使用driverlib还有一个好处,那就是可以使用 SysConfig 工具。这个工具使用可视化界面帮忙你配置芯片外设,并生成初始化代码。对于熟悉 stm32cubeMX 的同学来说,这个工具很亲切。spracx3 是ti提供的应用手册,使用教程就在里面。
3、说说SDK:
ti提供的软件开发套件(SDK)很多,里面有很多例程和库。例如
版本迭代很多版本了。新版本在ti官网很容易获取,老版本在 controlSUITE 中。
4、说说libraries:
不管是C2000Ware还是controlSUITE还是SDK,解压后都有个libraries文件夹,里面有例程。ti官网搜相对应的英文名字也有相应的应用手册文档。也是迭代了很多版本了。注意的是,libraries中,有的用汇编写的,有的基于device-support写的,有的基于driverlib写的。
完结
初学 TI-DSP-C2000 的坑、要注意的点,基本上说的差不多了。接下里就是查手册、看寄存器、看内部设计框图、看原理图、写代码、调试……和普通的嵌入式开发流程没太大的区别了。