当前位置:   article > 正文

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

tms320f280049c如何移植工程

写在前面

本文于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]中有提到:ELF
  • 工程使用单精度浮点单元(FPU32) [8],支持三角法数学单元(Trigonometric Math Unit, TMU)。其中 TMU是TI开发的针对三角函数,除法,开方等数学运算的硬件加速器。可以在5个cycles之内计算出sin, cos, arctan, 1/x等函数,可以加速电机控制和电源等控制算法的执行速度。在文献[10]中给出了性能提升的效果:
    性能提升
    在文献[4]中给出了全部函数表
    函数表
  • 支持从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官方教程中的方法配置工程后,部分库函数在代码中会自动高亮显示,但是配置成可移植工程后无高亮。
  • 不兼容SFRA功能。(2020-9-16更新)
  • 未直接包含driverlib.lib文件,导致每次编译都会重新从.c和.h文件生成driverlib。(2020-9-16更新)

1. 工程文件复制

CCS新建空白工程

在CCS软件中点击project->New CCS Project,并按照需要进行设置,工程名可以随意设置,本文取为F280049C_Template。 CCS新建工程设置
在Tool-chain中设置Output format为eabi(ELF)
ELF
点击Finish之后获得如下图所示的工程文件 新建的工程
工程文件夹下的文件如下:
新建的工程文件夹
后续称该文件夹为“工程文件夹”,将向其中拷贝许多文件。

官方文件拷贝

在软件的安装位置 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文件夹整体拷贝至工程文件夹 在这里插入图片描述

  • 将C:\ti\c2000\C2000Ware_3_01_00_00\device_support\f28004x\headers\source文件夹下的这个文件复制到工程文件夹刚才的source文件夹中;在这里插入图片描述

  • 完成后的source文件夹内容如下图所示:在这里插入图片描述

  • 将C:\ti\c2000\C2000Ware_3_01_00_00\device_support\f28004x\common下的include文件夹整体复制到工程文件夹在这里插入图片描述

  • 将C:\ti\c2000\C2000Ware_3_01_00_00\device_support\f28004x\headers\include中的所有文件复制到工程文件夹的include文件夹中在这里插入图片描述

  • 复制C:\ti\c2000\C2000Ware_3_01_00_00\device_support\f28004x\common\cmd中的4个.cmd文件到工程文件夹(事实上其中两个与cla有关的cmd文件在本文范围内不会用到,不复制也可以),关于这些cmd文件的区别可以参考[11][12]。在这里插入图片描述

  • 复制库函数,这些文件都在C:\ti\c2000\C2000Ware_3_01_00_00\driverlib\f28004x\driverlib这个文件夹下。如下图,文件夹中有2个子文件夹和一系列.c和.h文件,需要分别操作。在这里插入图片描述

  • 首先将所有.h文件复制到工程文件夹的include文件夹中在这里插入图片描述

  • 在工程文件夹中新建C_lib文件夹,driverlib中的所有.c文件拷贝进去。在这里插入图片描述

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

  • 到这里为止工程文件夹如下图所示:在这里插入图片描述

库文件整理

  • 删除ccs文件夹中多余的文件,如下图选中的文件。另外由于采用eabi输出,所以ccs文件夹中与COFF输出有关的文件也可以删除。在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 复制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中的数学运算库到工程文件夹。在这里插入图片描述在这里插入图片描述关于各个库文件名后缀的具体意义,可以参考[4]的8.1.7节。后缀TI还提供了其他库,在C:\ti\c2000\C2000Ware_3_01_00_00\libraries文件夹,需要时也可以复制过来。这里先不复制。完成上述复制后的工程如下图所示:在这里插入图片描述

添加 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输出的需要,也即函数名前不加下划线。如下图是修改前:
    asm修改前如下图是修改后:
    asm修改后
  2. include文件夹下的f28004x_lin.h文件需要修改一个变量名,该变量名可以任意修改,修改原因是命名重复。修改前:IDLE修改后:LIN_IDLE
  3. include文件夹下的f28004x_globalprototypes.h和source文件夹的f28004x_sysctrl.c均需要修改IDLE函数名,该变量名可以任意修改,修改原因也是命名重复。这里直接给出修改后的结果:IIDLE在这里插入图片描述

3. 从RAM执行时的配置

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

添加索引路径

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

添加数学库文件路径

同样右键点击项目浏览器中的项目名,打开Properties(属性)进行设置。
${PROJECT_ROOT}/rts2800_fpu32_eabi.lib
${PROJECT_ROOT}/rts2800_fpu32_fast_supplement_eabi.lib
在这里插入图片描述其中默认的库文件是libc.a,根据本文开头提到的官网文档,可以直接删除。
快速运行库rts2800_fpu32_fast_supplement.lib是rts2800_fpu32.lib的一个函数子集,它是对rts2800_fpu32.lib中一些函数进行重写,提高运算速度,所以添加是有次序要求,需要进行设置如下:

link order中添加这两个库,排序rts2800_fpu32_fast_supplement.lib在前rts2800_fpu32.lib在后
在这里插入图片描述

启用FPU和TMU

同样右键点击项目浏览器中的项目名,打开Properties(属性)进行设置。 关于编译器–fp_mode的设置等信息可以参考文献[4]的2.3节。
目前不推荐启用–idiv_support,在本工程中启用该选项会导致程序无法正确运行。
在这里插入图片描述fp_mode--fp_mode

定义_LAUNCHXL_F280049C

这一步不是必须的。
在这里插入图片描述
官方的例程基于ControlCard编写,如果想直接在LaunchPad上运行,需要定义这样一个指令。如果自己完全从零开始编辑代码,不需要做这一步。
在这里插入图片描述

配置仿真器

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

右键点击工程名,选择New—>TargetConfiguration File,File name取名任意,这里取为LaunchPad.ccxml,点击Finish。
新建仿真器
两线制仿真器设置

文件管理

  • 将4个.cmd文件选中,右键,选择Exclude from Build。4个文件中的许多对存储区的定义是冲突的,这样操作后,他们就不参加编译了。后续将根据需要再将有用的那个加回来。在这里插入图片描述
  • 同样,C_lib文件夹也是不需要参与编译的,右键进行同样的设置。

添加CMD文件

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

4. 从FLASH执行时的配置

当代码调试完毕,需要将代码烧录到FLASH中,这样DSP就可以脱离仿真器运行了。配置步骤与从RAM中执行相似,具体如下:
首先切换到FLASH配置界面
在这里插入图片描述
然后重复与RAM中执行类似的配置,具体包括以下几步,本节不在赘述:

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

声明_FLASH和code_start

为了使程序正确的从flash启动,编程时通常有一些特殊的代码需要运行(通常TI都已经在库函数中提供)。为了确保这些代码能够正确编译,执行本步骤。
在这里插入图片描述
在这里插入图片描述

添加cmd文件

与之前相同,只不过这次是将FLASH相关的cmd加进来。
在这里插入图片描述
至此,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
  • 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
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

修订历史

  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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/319363
推荐阅读
相关标签
  

闽ICP备14008679号