可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置

可移植bit-field与driverlib兼容的C2000控制器工程模板创建及sysconfig配置

  • 前言
  • 步骤
    • 创建工程
    • 库函数支撑文件拷贝
    • 寄存器支撑文件拷贝
    • SysConfig配置
  • 总结
  • 2023年1月5日更新
  • 参考博文及资料

前言

迄今为止只学过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
可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第1张图片
依次选择或填写你的芯片型号,仿真器型号,工程名以及输出文件格式output format。在output format有legacy coff和eabi elf之分。eabi elf是未来主流的格式,TI讲持续更新它并添加新的语言特性;而legacy coff不会有额外的更新,但不至于被取缔[1]。因此推荐大家还是选用eabi模式。

创建完工程以后,在工程下新建4个文件夹,分别命名cmd、inc、lib、src,分别用于存放cmd文件、头文件、库、源文件。
可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第2张图片
这时候可以在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文件夹内,并添加头文件路径。

  1. C2000Ware_< version>\driverlib\f28004x\driverlib
  2. C2000Ware_< version>\driverlib\f28004x\driverlib\inc
  3. C2000Ware_< version>\device_support\f28004x\common\include

${PROJECT_ROOT}/inc表示该工程文件夹下的inc文件夹,是一个相对路径。这也是为了工程的可移植。
可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第3张图片

  1. 将C2000Ware_< version>\device_support\f28004x\common\cmd\28004x_generic_ram_lnk.cmd文件复制到工程文件夹下的cmd文件夹去。
  2. 将C2000Ware_< version>\device_support\f28004x\common\source\device.c文件复制到工程文件夹下的src文件中去。
  3. 将C2000Ware_< version>\driverlib\f28004x\driverlib\ccs\Debug\driverlib_eabi.lib文件复制到工程文件夹下的lib文件中去。

至此,工程文件如下。由于inc文件夹下的头文件过多,这里就不展开了。
可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第4张图片

尝试第一次编译,编译通过。
可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第5张图片
截至到现在,工程仍然只适用于库函数编程

接下来继续添加寄存器编程的相关文件,以兼容两种编程方式。

寄存器支撑文件拷贝

  1. 将C2000Ware_< version>\device_support\f28004x\headers\include下的所有文件拷贝到工程文件下的inc文件中去。
  2. 将C2000Ware_< version>device_support\f28004x\headers\source
    下的f28004x_globalvariabledefs.c拷贝到src中。
  3. 将C2000Ware_< version>device_support\f28004x\common\source下的以下文件拷贝到src中。
    可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第6张图片
  4. 将C2000Ware_< version>device_support\f28004x\headers\cmd下的f28004x_headers_nonbios.cmd拷贝到cmd中。

在main.c的测试代码中添加#include “F28x_Project.h”
尝试第二次编译,出现以下报错。
可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第7张图片

这是由于寄存器编程和库函数编程中存在重复的定义。
在这里插入图片描述

因此需要编辑工程属性,添加预定义_DUAL_HEADERS
可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第8张图片

尝试第三次编译,编译通过
可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第9张图片

修改测试代码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]。

可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第10张图片

将src\f28004x_usdelay.asm文件中函数名前的下划线删去,再进行第五次编译。编译通过。

可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第11张图片

至此,该工程文件已经能够同时兼容库函数编程与寄存器编程了。

SysConfig配置

在前面所创建的工程模板下,新建一个syscfg文件。注意文件的后缀名是.syscfg,命名任意。这时候会弹出一个弹窗,点击yes将SysConfig添加到该工程的toolchain。

可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第12张图片
可以看到工程下多了一个Generated Source,并且打开工程属性,Build下也新加了SysConfig菜单。
可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第13张图片
在Build -> SysConfig -> Basic Options下添加meta data file路径。
C2000Ware_< version>.metadata\sdk.json
并且根据自己的C2000器件类型,填写device family类型或者board类型。我选用的芯片是280049C,因此填写的就是F28004x.[7]
可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第14张图片
右键创建的.syscfg文件,open with SysConfig Editor。任意配置一个模块以测试。SysConfig的使用教程参阅[6] [8]。
可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第15张图片
然后在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界面进行的配置选项,自动生成代码或更新代码文件。
可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第16张图片
编译工程,编译通过。

总结

C2000ware有两种开发方式,bit-field和driverlib。

bit-field开发方式能够加深对各个模块的理解和学习,但难度较大,需要熟悉寄存器,并且要经常查阅芯片手册。当需要利用多种芯片开发时,尤其是没有学过的芯片,这种方式就显得很慢了,还需要我们再去过一便手册。

driverlib开放方式相对于bit-field开发方式来讲,就摒弃了对模块寄存器的读写,只需要几条库函数,就能完成写几十条甚至几百条操作寄存器的功能,开发速度更快。但前提条件时要知道,配置某一种模块某种功能时,究竟该调用什么库函数。

TI研发的SysConfig就解决了这个问题,根据模块根据功能自动生成代码,并且能够快速对多种处理器开发。

2023年1月5日更新

最近翻了翻TI的编译器文档[9],文档中提到了在不同输出各式coff和eabi情况下,某些内存段的命名需要更改。
可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第17张图片
注意到ram_cmd文件本身就有上面段的替代只不过是用条件编译来写的。
可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第18张图片
因此只需要在条件编译中再增加__TI_EABI__。
可移植bit-field与driverlib兼容的C2000控制器工程模板创建及SysConfig配置_第19张图片

参考博文及资料

[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

你可能感兴趣的:(DSP280049C学习笔记,c++,dsp开发,库函数和寄存器兼容编程)