迄今为止只学过TI的两款c2000控制器TMS320F280049C和28335,并且所有代码编写都是通过写寄存器来实现的。相较于直接使用TI编写好的库函数,写寄存器的开发效率实在是太低了,而且还不方便检查。为此想重新学习一下c2000控制器的工程模板创建,在阅读其他作者的笔记后,归纳了一个简单的创建步骤,寄存器操作和库函数操作同时兼容。
在后面导入C2000ware的demo程序时发现有.syscfg文件,并且主函数里面还有board.h文件, Board_init()函数,就连并学习了以下TI的sysconfig。
总的来说,sysconfig是一个图形化编程工具,开发效率能够更高更快。
该教程以创建TMS320F280049C工程模板为例,其他类型的创建方式可以类似操作。
我使用的CCS是10.3.1版本,c2000ware是目前最新的版本C2000Ware_4_02_00_00,sysconfig是
这些在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文件夹内,并添加头文件路径。
${PROJECT_ROOT}/inc表示该工程文件夹下的inc文件夹,是一个相对路径。这也是为了工程的可移植。
至此,工程文件如下。由于inc文件夹下的头文件过多,这里就不展开了。
尝试第一次编译,编译通过。
截至到现在,工程仍然只适用于库函数编程。
接下来继续添加寄存器编程的相关文件,以兼容两种编程方式。
在main.c的测试代码中添加#include “F28x_Project.h”
尝试第二次编译,出现以下报错。
修改测试代码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文件中函数名前的下划线删去,再进行第五次编译。编译通过。
至此,该工程文件已经能够同时兼容库函数编程与寄存器编程了。
在前面所创建的工程模板下,新建一个syscfg文件。注意文件的后缀名是.syscfg,命名任意。这时候会弹出一个弹窗,点击yes将SysConfig添加到该工程的toolchain。
可以看到工程下多了一个Generated Source,并且打开工程属性,Build下也新加了SysConfig菜单。
在Build -> SysConfig -> Basic Options下添加meta data file路径。
C2000Ware_< version>.metadata\sdk.json
并且根据自己的C2000器件类型,填写device family类型或者board类型。我选用的芯片是280049C,因此填写的就是F28004x.[7]
右键创建的.syscfg文件,open with SysConfig Editor。任意配置一个模块以测试。SysConfig的使用教程参阅[6] [8]。
然后在main函数中添加#include “board.h”以及初始化函数Board_init().
#include "device.h"
#include "F28x_Project.h"
#include "board.h"
void main(void)
{
Device_init(); // Initialize device clock and peripherals
Device_initGPIO(); // Initialize GPIO and configure the GPIO pin as a push-pull output
Interrupt_initModule(); // Initialize PIE and clear PIE registers. Disables CPU interrupts.
IER = 0x0000; //CPU级中断使能
IFR = 0x0000; //清除CPU级中断标志
Interrupt_initVectorTable(); // Initialize the PIE vector table with pointers to ISR
Board_init();
EINT; // Enable Global Interrupt (INTM)
ERTM; // Enable real-time interrupt (DBGM)
for (;;)
{
;
}
}
SysConfig会自动根据你在GUI界面进行的配置选项,自动生成代码或更新代码文件。
编译工程,编译通过。
C2000ware有两种开发方式,bit-field和driverlib。
bit-field开发方式能够加深对各个模块的理解和学习,但难度较大,需要熟悉寄存器,并且要经常查阅芯片手册。当需要利用多种芯片开发时,尤其是没有学过的芯片,这种方式就显得很慢了,还需要我们再去过一便手册。
driverlib开放方式相对于bit-field开发方式来讲,就摒弃了对模块寄存器的读写,只需要几条库函数,就能完成写几十条甚至几百条操作寄存器的功能,开发速度更快。但前提条件时要知道,配置某一种模块某种功能时,究竟该调用什么库函数。
TI研发的SysConfig就解决了这个问题,根据模块根据功能自动生成代码,并且能够快速对多种处理器开发。
最近翻了翻TI的编译器文档[9],文档中提到了在不同输出各式coff和eabi情况下,某些内存段的命名需要更改。
注意到ram_cmd文件本身就有上面段的替代只不过是用条件编译来写的。
因此只需要在条件编译中再增加__TI_EABI__。
[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
[6] C2000 SysConfig
[7] How to configure CCS Project Properties for C2000 SysConfig.
[8] SysConfig Development Tool for C2000™ real-time MCUs
[9] TMS320C28x Optimizing C/C++ Compiler
v22.6.0.LT