完全可移植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