新建一个C2000工程

 安装好开发环境CCS与对应软件套件controlSUITE之后,可以尝试新建一个CCS工程。新建的CCS工程目标是:尽可能使该工程模块更方便使用,清晰明了,同时便于移植。

准备工作

 安装完毕的CCS与controlSUITE,可以参照安装CCS与controlSUITE

新建一个空项目

  1. 启动CCS v5,选择工作空间。
  2. 选择菜单栏File->New->CCS Project。进入New CCS Project设置选项。
  • Target:目标器件,左框选择2806x Piccolo,右框选择TMS320F28069
  • Connection:仿真器,选择Texs Instruments XDS100v2 USB Debug Probe
  • Project name:新建项目的名称,示例输入F28069Empty。将作为后续的工程模板使用;
  •  勾选Use default location
  • Compiler version:编译器版本,采用默认值TI v6.2.10。
  • Advance settings保持默认即可;
  • Project templates and examples:项目模板,选择Empty Project(with main.c)
  •  选择finish完成空项目工程的建立。
  1. 空项目建立完成后,可以看到Project Explore中存在F28069Empty工程。CCS已经自动加入了链接器命令文件28069_RAM_lnk.cmd。同时main.c中存在一个空的main函数。

增加外设与初始化文件

 在空项目建立完成后,将需要使用到的头文件与源文件导入,才能正常使用其中的初始化与外设驱动函数。

增加头文件

  1. 单击选中F28069Empty空项目。右键,选择New->Folder,进入新建文件夹界面。在Folder name栏输入include,作为头文件文件夹。
  2. 选择controlSUITE安装目录下controlSUITE\device_support\f2806x\v136\F2806x_headers\include,选择其中所有头文件并复制。右键F28069Empty空项目下include文件夹,选择paste粘贴指令。此时,头文件将复制于include文件夹中。
  3. 选择controlSUITE安装目录下controlSUITE\device_support\f2806x\v136\F2806x_common\include,选择其中所有头文件,复制到include文件夹中。

增加源文件

  1. 单击选中F28069Empty空项目。右键,选择New->Folder,进入新建文件夹界面。在Folder name栏输入source,作为源文件文件夹。
  2. 选择controlSUITE安装目录下controlSUITE\device_support\f2806x\v136\F2806x_common\source,选择其中(除F2806x_CSMPasswords.asmF2806x_SWPrioritizedDefaultIsr.cF2806x_SWPrioritizedPieVect.c外所有)源文件并复制。右键F28069Empty空项目下source文件夹,选择paste粘贴指令。此时,源文件将复制于include文件夹中。
  3. 注意:器件启动文件F2806x_CodeStartBranch.asm与延时函数源文件F2806x_usDelay.asm也已经复制与source文件夹下。

增加位域结构体支持源文件

  1. 复制controlSUITE\device_support\f2806x\v136\F2806x_headers\sourceF2806x_GlobalVariableDefs.c文件,放到工程工程目录source文件夹下。
  2. 复制controlSUITE\device_support\f2806x\v136\F2806x_headers\cmdF2806x_Headers_nonBIOS.cmd文件,放到工程根目录文件夹下。即复制后,右键F28069Empty空项目选择paste指令。

设置包含选项

 尽管已经增加了头文件与源文件,但是还需要设置包含路径,编译器才能搜索到需要的文件。
 在新建F28069Empty空项目右键,选择属性。选择Build->C2000 Compiler->Include Options
 单击Add,选择Workspace…(即选择相对路径),选择新建F28069Empty空项目下的include文件夹。

 点击OK,回复到属性设置界面,再次点击OK确认。
 点击build,该项目可以编译通过。

使用新工程进行LED闪烁实验

 新建项目中main为空函数。为了检验创建的工程是否可以正常使用,这里进行简单的测试。
 在这里,将main.c文件内容替换为如下内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "DSP28x_Project.h"
void main(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
GpioCtrlRegs.GPAMUX1.all = 0x00000000; // All GPIO
GpioCtrlRegs.GPAMUX2.all = 0x00000000; // All GPIO
GpioCtrlRegs.GPBMUX1.all = 0x00000000; // All GPIO
GpioCtrlRegs.GPADIR.all = 0xCFFFFFFF; // All outputs
GpioCtrlRegs.GPBDIR.all = 0x0000000F; // All outputs
EDIS;
for(;;)
{
GpioDataRegs.GPADAT.all =0xffffffff; //赋值修改为0xffffffff
GpioDataRegs.GPBDAT.all =0xffffffff; //赋值修改为0xffffffff
DELAY_US(1000000);
GpioDataRegs.GPADAT.all =0x0; //赋值修改为0x0
GpioDataRegs.GPBDAT.all =0x0; //赋值修改为0x0
DELAY_US(1000000);
}
}

 单击build编译工程,工程可以编译通过。
 将F28069核心板连接到电脑,将工程debug下载到核心板。运行工程,可以看到LED开始闪烁。
 可以证明,建立工程的方法是可行的。

对工程进行一点优化修改

 按照上述步骤,建立了一个可用的工程模板。以下,为了后续学习的便捷性,需要对工程进行少许修改。

定义数据类型头文件

 不同的器件平台和不同的编译器,可能具有不同的数据类型,或者同名的数据类型具有不同的长度。为了程序更易于移植使用,应该在程序设计中尽可能消除这种差异。
 因此,可以尝试建立数据类型定义。
 右键F28069Empty工程,选择New->Header File,为工程添加一个头文件。文件名定义为mytype.h
 在mytype.h中,输入如下数据类型定义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//Optimizing C C++ User's Guide.pdf
//chapter 6.4 Data Types
#ifndef MYTYPE_H_
#define MYTYPE_H_
typedef char int8; //in fact,16 bits.
//typedef unsigned char Uint8;//in fact,16 bits.
typedef unsigned char uint8;//in fact,16 bits.
//typedef int int16;
//typedef unsigned int Uint16;
typedef unsigned int uint16;
//typedef long int32;
//typedef unsigned long Uint32;
typedef unsigned long uint32;
//typedef long long int64;
//typedef unsigned long long Uint64;
typedef unsigned long long uint64;
typedef volatile int8 vint8;
typedef volatile uint8 vuint8;
typedef volatile int16 vint16;
typedef volatile uint16 vuint16;
typedef volatile int32 vint32;
typedef volatile uint32 vuint32;
typedef volatile long long vint64;
typedef volatile unsigned long long vuint64;
//typedef float float32;
//typedef long double float64;
#endif /* MYTYPE_H_ */

 查阅Optimizing C C++ User's Guide.pdf手册6.4节data type可以看到相关的数据类型定义。基于此确定数据类型的定义。
 其中部分定义被注释掉了,原因在于引入的头文件中,已经按照一致的方法定义了,这里不能再次重复定义。

定义公用包含头文件

 在后续实验中,为了增加代码的可读性,程序将进行模块化设计。简单地说,对于不同外设,设置单独的文件夹存储头文件与源文件。
 对于每一个外设均需要引入芯片支持文件,例如,位域结构体支持文件每一个外设均需要使用。为此,可以设置一个公共包含文件common.h,该文件在每个外设文件夹中被引入。
 在项目根目录下添加名为common.h的头文件,并添加如下内容。

1
2
3
4
5
6
7
8
#ifndef COMMON_H_
#define COMMON_H_
#include "include\DSP28x_Project.h"
#include "mytype.h"
#endif /* COMMON_H_ */

定义总包含文件

 按照文件夹区分外设后,需要定义总的包含文件,便于程序正常调用不同外设的不同函数。例如,一般来讲,main主程序需要访问全部外设的函数。
 如果每个外设导入一个头文件,在外设较多的时候,导入部分将占有较大篇幅,使程序看起来不简洁。或者,如果系统控制的中断服务函数同样需要访问所有外设,还需要同样大篇幅导入。
 因此,可以设置一个includes.h头文件,用来单独管理外设头文件。
 新建includes.h,并添加如下代码。在后续学习中,外设的头文件将在#include "common.h"后继续添加。

1
2
3
4
5
6
#ifndef INCLUDES_H_
#define INCLUDES_H_
#include "common.h"
#endif /* INCLUDES_H_ */

修改main函数包含文件

 上一步定义了总包含文件,这里,将main主函数中原有的#include "DSP28x_Project.h"修改为#include "includes.h"
 重新编译并调试工程,该工程仍然可以正常运行。

删除测试代码

 上述完成的F28069Empty工程中,加入了LED闪烁的测试代码。本节目的是新建一个空工程,因此,这里可以将测试代码删除。建议main函数调整为如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "includes.h"
uint32 loop_count = 0;
void main(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
for(;;)
{
loop_count++;
}
}

 其中加入的EINTERTM为中断控制指令,后续章节会有介绍。
 新建了变量loop_count计数主循环运行次数,在调试程序时有一些用途。
 以后的学习中,将使用该工程作为模板。
 CCS支持工程的直接复制。在使用的过程中,单击选中工程。按住ctrl+C可以复制工程,再按住ctrl+V,则可以完成工程的复制。

 重命名后,则可以开始开发新的项目。

程序在flash中执行

 目前为止,所创建的工程均是在RAM中运行。现在,仅仅需要对原有工程进行一些修改,即可完成在flash运行的工程。这样,器件再重新上电后可以继续执行原有程序。
注意:尽管介绍了程序在flash运行的方式,但是在学习过程中,强烈建议尽量使用ram运行方式进行实验。在ram运行程序使得器件相对安全。如果使用flash进行程序烧录,初学者由于操作不正确或者不熟练等,可能造成flash锁死等情况发生。
 修改步骤如下。

  1. 更改链接器命令文件,将28069_RAM_lnk.cmd文件进行删除,同时替换为controlSUITE\device_support\f2806x\v136\F2806x_common\cmd下的F28069.cmd
  2. main函数#include "includes.h"之后,增加如下4条语句;
1
2
3
4
5
// These are defined by the linker (see F2808.cmd)
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
extern Uint16 RamfuncsLoadSize;
  1. main函数InitPieVectTable()后,增加如下2条语句。
1
2
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (Uint32)&RamfuncsLoadSize);
InitFlash();

此时,程序再进行烧录,可以看到扇区擦除的过程。

文章目录
  1. 1. 准备工作
  2. 2. 新建一个空项目
  3. 3. 增加外设与初始化文件
    1. 3.1. 增加头文件
    2. 3.2. 增加源文件
  4. 4. 增加位域结构体支持源文件
  5. 5. 设置包含选项
  6. 6. 使用新工程进行LED闪烁实验
  7. 7. 对工程进行一点优化修改
    1. 7.1. 定义数据类型头文件
    2. 7.2. 定义公用包含头文件
    3. 7.3. 定义总包含文件
    4. 7.4. 修改main函数包含文件
    5. 7.5. 删除测试代码
  8. 8. 程序在flash中执行
|