完全可移植c2000控制器工程模板创建
- 前言
- 步骤
- 创建工程
- 库函数支撑文件拷贝
- 寄存器支撑文件拷贝
 
- 参考博文及资料
前言
迄今为止只学过TI的两款c2000控制器TMS320F280049C和28335,并且所有代码编写都是通过写寄存器来实现的。相较于直接使用TI编写好的库函数,写寄存器的开发效率实在是太低了,而且还不方便检查。为此想重新学习一下c2000控制器的工程模板创建,在阅读其他作者的笔记后,归纳了一个简单的创建步骤,寄存器操作和库函数操作同时兼容。
该教程以创建TMS320F280049C工程模板为例,其他类型的创建方式可以类似操作。
我使用的CCS是10.3.1版本,c2000ware是目前最新的版本C2000Ware_4_02_00_00。
这些在TI官网都能下载到,就不放链接了
步骤
创建工程
File -> New -> CCS Project
 
 依次选择或填写你的芯片型号,仿真器型号,工程名以及输出文件格式output format。在output format有legacy coff和eabi elf之分。eabi elf是未来主流的格式,TI讲持续更新它并添加新的语言特性;而legacy coff不会有额外的更新,但不至于被取缔[1]。因此推荐大家还是选用eabi模式。
创建完工程以后,在工程下新建4个文件夹,分别命名cmd、inc、lib、src,分别用于存放cmd文件、头文件、库、源文件。
 
 这时候可以在main.c函数编写以下测试代码。一步步感受工程完善。
#include "device.h"
void main(void)
{
    // Initialize device clock and peripherals
    Device_init();
    // Initialize GPIO and configure the GPIO pin as a push-pull output
    Device_initGPIO();
    // Initialize PIE and clear PIE registers. Disables CPU interrupts.
    Interrupt_initModule();
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    Interrupt_initVectorTable();
    // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
    EINT;
    ERTM;
    
    // Loop Forever
    for (;;)
    {
    }
}
库函数支撑文件拷贝
将以下三个文件夹下的头文件全部复制到工程文件下下的inc文件夹内,并添加头文件路径。
- C2000Ware_< version>\driverlib\f28004x\driverlib
- C2000Ware_< version>\driverlib\f28004x\driverlib\inc
- C2000Ware_< version>\device_support\f28004x\common\include
${PROJECT_ROOT}/inc表示该工程文件夹下的inc文件夹,是一个相对路径。这也是为了工程的可移植。
 
- 将C2000Ware_< version>\device_support\f28004x\common\cmd\28004x_generic_ram_lnk.cmd文件复制到工程文件夹下的cmd文件夹去。
- 将C2000Ware_< version>\device_support\f28004x\common\source\device.c文件复制到工程文件夹下的src文件中去。
- 将C2000Ware_< version>\driverlib\f28004x\driverlib\ccs\Debug\driverlib_eabi.lib文件复制到工程文件夹下的lib文件中去。
至此,工程文件如下。由于inc文件夹下的头文件过多,这里就不展开了。
 
尝试第一次编译,编译通过。
 
 截至到现在,工程仍然只适用于库函数编程。
接下来继续添加寄存器编程的相关文件,以兼容两种编程方式。
寄存器支撑文件拷贝
- 将C2000Ware_< version>\device_support\f28004x\headers\include下的所有文件拷贝到工程文件下的inc文件中去。
- 将C2000Ware_< version>device_support\f28004x\headers\source
 下的f28004x_globalvariabledefs.c拷贝到src中。
- 将C2000Ware_< version>device_support\f28004x\common\source下的以下文件拷贝到src中。
  
- 将C2000Ware_< version>device_support\f28004x\headers\cmd下的f28004x_headers_nonbios.cmd拷贝到cmd中。
在main.c的测试代码中添加#include “F28x_Project.h”
 尝试第二次编译,出现以下报错。
 
这是由于寄存器编程和库函数编程中存在重复的定义。
 
因此需要编辑工程属性,添加预定义_DUAL_HEADERS
 
尝试第三次编译,编译通过
修改测试代码main.c文件
#include "device.h"
#include "F28x_Project.h"
void main(void)
{
    // Initialize device clock and peripherals
    Device_init();
    InitSysCtrl();
    // Initialize GPIO and configure the GPIO pin as a push-pull output
    Device_initGPIO();
    InitGpio(); //初始化GPIO
    // Initialize PIE and clear PIE registers. Disables CPU interrupts.
    Interrupt_initModule();
    InitPieCtrl(); //初始化PIE
    IER = 0x0000; //CPU级中断失能
    IFR = 0x0000; //清除CPU级中断标志
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    Interrupt_initVectorTable();
    InitPieVectTable(); //初始化向量表
    // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
    EINT;
    ERTM;
    // Loop Forever
    for (;;)
    {
        ;
    }
}
进行第四次编译,出现报错。这是因为eabi和coff格式下,对汇编源文件的不同要求导致的[5]。
 
 将src\f28004x_usdelay.asm文件中函数名前的下划线删去,再进行第五次编译。编译通过。
 
 至此,该工程文件已经能够同时兼容库函数编程与寄存器编程了。
参考博文及资料
[1] TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程
 [2] DSP TMS320F280049之CCS工程的建立(库函数版)
 [3] DSP TMS320F280049之CCS工程的建立(寄存器版)
 [4] C2000ware_< version>/device_support/f28004x/docs/F28004x_FRM_EX_UG.pdf
 [5] 关于CCS的coff和elf



















