TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程

文章目录

  • 写在前面
  • 动机与目标
    • 工程特点
    • 工程已知缺陷
  • 1. 工程文件复制
    • CCS新建空白工程
    • 官方文件拷贝
    • 库文件整理
    • 添加 f28004x_headers_nonbios.cmd
  • 2. 文件编辑
  • 3. 从RAM执行时的配置
    • 添加索引路径
    • 添加数学库文件路径
    • 启用FPU和TMU
    • 定义_LAUNCHXL_F280049C
    • 配置仿真器
    • 文件管理
    • 添加CMD文件
  • 4. 从FLASH执行时的配置
    • 声明_FLASH和code_start
    • 添加cmd文件
  • 代码验证
  • 修订历史
  • 参考文献

写在前面

本文于20200415更新,针对旧版本的Bug做了修改,重新完善了流程,所搭建的工程在280049C的LaunchPad上做了初步验证,未来发现新的问题或者解决方案会继续更新。

每次折腾Code Composer Studio (CCS)都被各种warning和error怼的生活不能自理,而且随着新芯片的不断出现,软件版本的不断提高,网上的许多教程都有些过时,进一步增大了学习难度。这次折腾的时候还发现官方的代码库有一些小Bug,而且TI在19年4月的时候就知道了[15],到现在最新的支持库中居然还没改……

这回折腾的感想是多翻翻C2000ware的安装文件夹,里面有好多官方文档帮助入门。在这里首先推荐C:\ti\c2000\C2000Ware_3_01_00_00\device_support\f28004x\docs目录下的《F28004x_FRM_EX_UG》,有这个基本就可以入门了,其他的芯片也类似。另外推荐文献[16],里面可以找到许多文档和工具来辅助设计。

本博客后续与280049C相关的学习都在本文的工程上进行。

动机与目标

很多时候我们需要与其他人共享项目代码,但其他人可能并没有与自己一样的软件环境,所以有必要使用完全可移植的工程文件。本篇博文记录使用CCS9.3新建适用于280049C工程的方法,所有参考文献链接列在文章最后,在此对各个参考资料的作者表示感谢!整个文章的结构参考了[1],关于链接源文件时碰到的绝对路径和相对路径的问题,可以参考[2]。

工程特点

  • 新建的工程能够实现完全可移植,即任意拷贝到其他位置或电脑都能直接用CCS编译。新建的工程可以作为模板,之后可以延续使用此工程,只需更改Project工程名。
  • 同时支持寄存器编程了库函数编程[6][7]。在过去,我们通常使用寄存器编程,可以快速精准的操作DSP的每一位寄存器。但随着DSP的外设越来越丰富,能够更简洁、快速完成编程的库函数编程可能会成为未来的主流。翻阅TI新一代DSP的例程会发现,库函数编程的示例要远多于寄存器编程,且涵盖几乎所有外设和功能。
  • 基于当前最新的软件环境完成。软件的新版本通常会增加新的功能,修复Bug,并更能更进一步挖掘芯片的潜力,所以一般推荐使用最新版本的软件。同时,随着各个软件的不断更新,许多设置都出现了变化,工程师们需要不断的适应。本文使用的软件下载地址和DSP芯片信息可以参考我的文章[3]。具体来说,本文使用的软件环境是CCS9.3,编译器版本C2000_18.12.4.LTS,编译器的手册为[4],同时还需要安装C2000Ware_3_01_00_00。
  • 程序的输出方式采用eabi(ELF),这是TI今后将持续支持的文件格式,编程语言的新的特性将不断的被加入。而传统的输出方式legacy COFF是一种遗留的格式,它将被持续支持,但是现在编程语言的一些特性将不再被加入。二者的具体区别可以参考[5],同时在文献[4]中有提到:TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第1张图片
  • 工程使用单精度浮点单元(FPU32) [8],支持三角法数学单元(Trigonometric Math Unit, TMU)。其中 TMU是TI开发的针对三角函数,除法,开方等数学运算的硬件加速器。可以在5个cycles之内计算出sin, cos, arctan, 1/x等函数,可以加速电机控制和电源等控制算法的执行速度。在文献[10]中给出了性能提升的效果:
    TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第2张图片
    在文献[4]中给出了全部函数表
    TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第3张图片
  • 支持从Ram或者FLASH运行代码。一般来说,在Dubug的时候需要从Ram运行代码,而代码成熟之后需要切换到Release模式,从FLASH运行代码。
  • 没有添加CLA有关库和高级数学库。由于篇幅有限,一些高级功能没有被添加进来,如有需要,可以参考后续文章。

工程已知缺陷

由于工程同时兼容了较多的文件,目前本文的方法还有一些缺陷,后续如果找到解决方法会逐步修复。这里列出已经发现的问题:

  • 不能使用寄存器编程时的初始化函数InitSysCtrl(); 解决方法是使用库函数编程的初始化函数Device_init(); 具体可以参考本文最后的例程。这个其实是个比较奇怪的问题,使用InitSysCtrl();时代码编译不会报错,但无法进入仿真器连接DSP时无法正确进入调试模式……我个人分析与函数extern void SysCtl_delay(uint32_t count);的调用有关,可能是汇编文件哪里没配置好……有篇文章[19]分析了该问题,但还没有看懂……
  • 由于命名空间冲突[15],与LIN总线有关的函数被重命名了,使用时需注意。(估计暂时用不到)
  • 无法启用编译命令–idiv_support,可能是快速整型除法功能,未来解决。
  • 编译时会报一个与code_start有关的warning。(但如果不配置code_start,会导致代码无法从FLASH启动)
  • 库函数没有高亮。使用TI官方教程中的方法配置工程后,部分库函数在代码中会自动高亮显示,但是配置成可移植工程后无高亮。

1. 工程文件复制

CCS新建空白工程

在CCS软件中点击project->New CCS Project,并按照需要进行设置,工程名可以随意设置,本文取为F280049C_Template。 TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第4张图片
在Tool-chain中设置Output format为eabi(ELF)
TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第5张图片
点击Finish之后获得如下图所示的工程文件 TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第6张图片
工程文件夹下的文件如下:
TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第7张图片
后续称该文件夹为“工程文件夹”,将向其中拷贝许多文件。

官方文件拷贝

在软件的安装位置 C:\ti\c2000\C2000Ware_2_01_00_00\device_support\f28004x内有该DSP的支持文件,接下来分别复制到自建的工程中。

  • 将C:\ti\c2000\C2000Ware_2_01_00_00\device_support\f28004x\common文件夹下的source文件夹整体拷贝至工程文件夹 TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第8张图片

  • 将C:\ti\c2000\C2000Ware_3_01_00_00\device_support\f28004x\headers\source文件夹下的这个文件复制到工程文件夹刚才的source文件夹中;TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第9张图片

  • 完成后的source文件夹内容如下图所示:TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第10张图片

  • 将C:\ti\c2000\C2000Ware_3_01_00_00\device_support\f28004x\common下的include文件夹整体复制到工程文件夹TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第11张图片

  • 将C:\ti\c2000\C2000Ware_3_01_00_00\device_support\f28004x\headers\include中的所有文件复制到工程文件夹的include文件夹中TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第12张图片

  • 复制C:\ti\c2000\C2000Ware_3_01_00_00\device_support\f28004x\common\cmd中的4个.cmd文件到工程文件夹(事实上其中两个与cla有关的cmd文件在本文范围内不会用到,不复制也可以),关于这些cmd文件的区别可以参考[11][12]。TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第13张图片

  • 复制库函数,这些文件都在C:\ti\c2000\C2000Ware_3_01_00_00\driverlib\f28004x\driverlib这个文件夹下。如下图,文件夹中有2个子文件夹和一系列.c和.h文件,需要分别操作。TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第14张图片

  • 首先将所有.h文件复制到工程文件夹的include文件夹中TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第15张图片

  • 在工程文件夹中新建C_lib文件夹,driverlib中的所有.c文件拷贝进去。TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第16张图片

  • 将ccs和inc两个文件夹直接复制到工程文件夹。

  • 到这里为止工程文件夹如下图所示:TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第17张图片

库文件整理

  • 删除ccs文件夹中多余的文件,如下图选中的文件。另外由于采用eabi输出,所以ccs文件夹中与COFF输出有关的文件也可以删除。TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第18张图片TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第19张图片TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第20张图片

  • 复制C:\ti\ccs\tools\compiler\ti-cgt-c2000_18.12.4.LTS\lib 和 C:\ti\c2000\C2000Ware_3_01_00_00\libraries\math\FPUfastRTS\c28\lib中的数学运算库到工程文件夹。TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第21张图片TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第22张图片关于各个库文件名后缀的具体意义,可以参考[4]的8.1.7节。TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第23张图片TI还提供了其他库,在C:\ti\c2000\C2000Ware_3_01_00_00\libraries文件夹,需要时也可以复制过来。这里先不复制。完成上述复制后的工程如下图所示:TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第24张图片

添加 f28004x_headers_nonbios.cmd

这个cmd文件其实我一直没搞懂它的作用,应该是将一些寄存器分配到指定的存储空间。
该文件的位置在C:\ti\c2000\C2000Ware_3_01_00_00\device_support\f28004x\headers\cmd
将其复制到工程文件夹即可。

2. 文件编辑

为了同时实现库函数编程和寄存器编程,并解决[15]和[17]中的问题,需要对TI官方的文件做一些编辑,需要修改3个地方。

  1. 删除source文件夹f28004x_usdelay.asm文件中函数声明的下划线。这步主要是为了适应eabi输出的需要,也即函数名前不加下划线。如下图是修改前:
    TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第25张图片如下图是修改后:
    TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第26张图片
  2. include文件夹下的f28004x_lin.h文件需要修改一个变量名,该变量名可以任意修改,修改原因是命名重复。修改前:TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第27张图片修改后:TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第28张图片
  3. include文件夹下的f28004x_globalprototypes.h和source文件夹的f28004x_sysctrl.c均需要修改IDLE函数名,该变量名可以任意修改,修改原因也是命名重复。这里直接给出修改后的结果:TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第29张图片TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第30张图片

3. 从RAM执行时的配置

至此已经完成了必要文件的复制,但是工程还不能正确的检索到它们,因此需要添加一些索引路径。一般在debug时希望工程从RAM中执行,本节讨论从RAM中执行时的配置。
首先,右键点击项目浏览器中的项目名,打开Properties(属性),设定成DEBUG。这里的名字实际上也可以根据自己的喜好随便改。TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第31张图片
后续添加文件路径的时候会涉及到一些缩写,这些缩写在如下位置做了定义:TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第32张图片

添加索引路径

  1. 右键点击项目浏览器中的项目名,打开Properties(属性)。注意这里不同版本的CCS的界面可能不同,比如CC9.3该栏靠上,而CC6.0该栏靠下。
    TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第33张图片
    直接在对话框中输入 ${PROJECT_ROOT}/include,表示工程文件夹中的include文件夹。
    上图中Workspace选项是相对路径,Browse…是绝对路径。如果选择Browse…来确定路径,当工程移植到非此时默认的workplace工作空间,就又会提示错误,故一般选择Workspace选项。
    然后可以看到工程浏览器中工程Includes下多出了刚才添加的路径:
    TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第34张图片

添加数学库文件路径

同样右键点击项目浏览器中的项目名,打开Properties(属性)进行设置。
${PROJECT_ROOT}/rts2800_fpu32_eabi.lib
${PROJECT_ROOT}/rts2800_fpu32_fast_supplement_eabi.lib
TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第35张图片其中默认的库文件是libc.a,根据本文开头提到的官网文档,可以直接删除。
快速运行库rts2800_fpu32_fast_supplement.lib是rts2800_fpu32.lib的一个函数子集,它是对rts2800_fpu32.lib中一些函数进行重写,提高运算速度,所以添加是有次序要求,需要进行设置如下:

link order中添加这两个库,排序rts2800_fpu32_fast_supplement.lib在前rts2800_fpu32.lib在后
TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第36张图片

启用FPU和TMU

同样右键点击项目浏览器中的项目名,打开Properties(属性)进行设置。 关于编译器–fp_mode的设置等信息可以参考文献[4]的2.3节。
目前不推荐启用–idiv_support,在本工程中启用该选项会导致程序无法正确运行。
TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第37张图片TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第38张图片TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第39张图片

定义_LAUNCHXL_F280049C

这一步不是必须的。
在这里插入图片描述
官方的例程基于ControlCard编写,如果想直接在LaunchPad上运行,需要定义这样一个指令。如果自己完全从零开始编辑代码,不需要做这一步。
TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第40张图片

配置仿真器

对于280049C,其官方的LaunchPad开发板使用了XDS110仿真器的两线调试模式,而官方的ControlCard使用的是XDS100V2仿真器,开发时需要注意区分,并分别设置。本文以采用两线制调试的XDS110仿真器为例进行设置。

右键点击工程名,选择New—>TargetConfiguration File,File name取名任意,这里取为LaunchPad.ccxml,点击Finish。
TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第41张图片
TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第42张图片

文件管理

  • 将4个.cmd文件选中,右键,选择Exclude from Build。4个文件中的许多对存储区的定义是冲突的,这样操作后,他们就不参加编译了。后续将根据需要再将有用的那个加回来。TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第43张图片
  • 同样,C_lib文件夹也是不需要参与编译的,右键进行同样的设置。

添加CMD文件

这一步会将有用的那个.cmd文件重新加回来。右键工程名,属性,在如下图所示的对话框中把cmd文件包含进来。
TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第44张图片
尽管这里使用了绝对路径,但系统会自动切换成相对路径。只要再次打开属性面板就会发现已经自动切换了。而且需要用到的.cmd也自动地重新解除了Exclude from Build的状态。
TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第45张图片至此,从RAM中运行的配置全部结束。

4. 从FLASH执行时的配置

当代码调试完毕,需要将代码烧录到FLASH中,这样DSP就可以脱离仿真器运行了。配置步骤与从RAM中执行相似,具体如下:
首先切换到FLASH配置界面
TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第46张图片
然后重复与RAM中执行类似的配置,具体包括以下几步,本节不在赘述:

  • 添加索引路径
  • 添加数学库文件路径
  • 启用FPU和TMU
  • 定义_LAUNCHXL_F280049C
  • 文件管理

声明_FLASH和code_start

为了使程序正确的从flash启动,编程时通常有一些特殊的代码需要运行(通常TI都已经在库函数中提供)。为了确保这些代码能够正确编译,执行本步骤。
TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第47张图片
TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第48张图片

添加cmd文件

与之前相同,只不过这次是将FLASH相关的cmd加进来。
TMS320F280049C 学习笔记2 搭建完全可移植的CCS9.3工程_第49张图片
至此,FLASH中的配置结束。

代码验证

接下来使用简单的代码对搭建的工程进行验证,在主函数main.c中输入如下代码,并编译。下载运行后,LaunchPad的红色Led会闪烁,频率1Hz。

如果是在FLASH中编译,会报如下警告:
#10063-D entry-point symbol other than “_c_int00” specified: “code_start”
在这里插入图片描述
并不会影响到程序的运行,报错原因和解决措施仍在探索中。

#include "F28x_Project.h"
#include "device.h"
#include "math.h"

#define DEVICE_GPIO_PIN_LED1        23U  // GPIO number for LD4
#define DEVICE_GPIO_PIN_LED2        34U  // GPIO number for LD5

void main(void)
{
    // 初始化时钟和外设 Initialize device clock and peripherals
    Device_init();
    // InitSysCtrl();  //本工程不能使用寄存器的InitSysCtrl();函数初始化。

    /*//库函数版配置
    // 初始化GPIO并设置为推挽输出 Initialize GPIO and configure the GPIO pin as a push-pull output
    Device_initGPIO();
    GPIO_setPadConfig(DEVICE_GPIO_PIN_LED1, GPIO_PIN_TYPE_STD);  // Push-pull output or floating input
    GPIO_setDirectionMode(DEVICE_GPIO_PIN_LED1, GPIO_DIR_MODE_OUT);
    */
    InitGpio();  //寄存器指令配置
    GPIO_SetupPinMux(DEVICE_GPIO_PIN_LED1, GPIO_MUX_CPU1, 0);
    GPIO_SetupPinOptions(DEVICE_GPIO_PIN_LED1, GPIO_OUTPUT, GPIO_PUSHPULL);


    // 初始化PIE并清空PIE寄存器,关闭CPU中断
    // Initialize PIE and clear PIE registers. Disables CPU interrupts.
    Interrupt_initModule();

    // 初始化PIE向量表
    // 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;

    float a=cos((float)3.1415926/4);  // FPU32
    float b=__sin((float)(3.14/4));   // TMU

    for(;;)
    {
        // Turn on LED
        // 硬件电路设计是GPIO输出低电平时LED亮
        GPIO_writePin(DEVICE_GPIO_PIN_LED1, 0);

        // 延迟0.5s Delay for a bit.
        DEVICE_DELAY_US(500000);

        // Turn off LED
        GPIO_writePin(DEVICE_GPIO_PIN_LED1, 1);

        // Delay for a bit.
        DEVICE_DELAY_US(500000);
    }
}

修订历史

  1. 初稿 2020年2月10日
  2. 第一次修订 2020年3月15日:优化文章结构,发现编译命令–idiv_support 导致的错误,暂时的解决方案是关闭该功能。
  3. 第二次修订 2020年4月15日:优化文章结构,补充了FLASH运行的配置方法。

注意:本文提供的工程下载资源中的文件版本是第一次修订后的结果,无法从FLASH运行。如有需要,需参考相关章节进行配置。

参考文献

  1. 关于DSP的CCS6.0平台下的工程搭建(完全可移植)
  2. CCSv7使用指南连载8:构建便于移植的工程
  3. TMS320F280049C 学习笔记1 概述
  4. TMS320C28x Optimizing C/C++ Compiler v19.6.0.STS User’s Guide
  5. MSP430应用技巧1:COFF ABI与EABI
  6. DSP TMS320F280049之CCS工程的建立(库函数版)
  7. DSP TMS320F280049之CCS工程的建立(寄存器版)
  8. C28x Floating Point Unit fastRTS Library
  9. TMS320F28004x Microcontrollers Technical Reference Manual
  10. Accelerators: Enhancing the Capabilities of the C2000™ MCU Family
  11. DSP 两个CMD文件讲解
  12. 超详细的CMD文件讲解(DSP28035)
  13. Fast Integer Division – A Differentiated Offering From C2000™ Product Family
  14. TMS320C28x Extended Instruction Sets Technical Reference Manual
  15. CCS/TMS320F280049C: Name space conflict when trying to add Driverlib and Bitfield support to the same project
  16. TMS320F280049: Piccolo F28004x Development Tools and Examples
  17. 关于“unresolved symbols remain”错误的解决
  18. rts2800_fpu32_fast_supplement.lib与rts2800_fpu32.lib的添加
  19. [经验] 基于F28004x的C2000芯片引导过程
  20. C2000™ Key Technology Guide

你可能感兴趣的:(TI,DSP学习)