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

依次选择或填写你的芯片型号,仿真器型号,工程名以及输出文件格式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 peripheralsDevice_init();// Initialize GPIO and configure the GPIO pin as a push-pull outputDevice_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 Foreverfor (;;){}
}

库函数支撑文件拷贝

将以下三个文件夹下的头文件全部复制到工程文件下下的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文件夹,是一个相对路径。这也是为了工程的可移植。

  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文件夹下的头文件过多,这里就不展开了。

尝试第一次编译,编译通过。

截至到现在,工程仍然只适用于库函数编程

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

寄存器支撑文件拷贝

  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中。
  4. 将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 peripheralsDevice_init();InitSysCtrl();// Initialize GPIO and configure the GPIO pin as a push-pull outputDevice_initGPIO();InitGpio(); //初始化GPIO// Initialize PIE and clear PIE registers. Disables CPU interrupts.Interrupt_initModule();InitPieCtrl(); //初始化PIEIER = 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 Foreverfor (;;){;}
}

进行第四次编译,出现报错。这是因为eabi和coff格式下,对汇编源文件的不同要求导致的[5]。

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

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

SysConfig配置

在前面所创建的工程模板下,新建一个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 peripheralsDevice_initGPIO(); // Initialize GPIO and configure the GPIO pin as a push-pull outputInterrupt_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 ISRBoard_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就解决了这个问题,根据模块根据功能自动生成代码,并且能够快速对多种处理器开发。

2023年1月5日更新

最近翻了翻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

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

  1. C2000控制器的PWM互补驱动信号配置及连接说明

    1.关于PWM互补信号输出框图如下: 1.1配置模式1: 代码寄存器配置,AQ模块 EPwmxRegs.AQCTLA.bit.CAU =1; //AQ_CLEAR EPwmxRegs.AQCTLA.b ...

  2. 解决 Visual Studio 2017 RC 不兼容低版本 Visual Studio 创建的 MVC 4 项目的问题

    解决 Visual Studio 2017 RC 不兼容低版本 Visual Studio 创建的 MVC 4 项目的问题 参考文章: (1)解决 Visual Studio 2017 RC 不兼容低 ...

  3. 微型计算机的台式兼容是,微型计算机的台式兼容机是自己根据需要选择各个部件,配置出自己的计算机...

    微型计算机的台式兼容机是自己根据需要选择各个部件,配置出自己的计算机 更多相关问题 边际技术替代率的概念及递减规律. 所有的Y系列的三相异步电动机属于高耗能落后机电设备(产品). 边际替代率的概念及边 ...

  4. 兼容Tomcat和Weblogic的Spring 数据源JNDI配置

    http://linhao315.iteye.com/blog/1293787 众所周知,Tomcat和Weblogic中查找JNDI的名称是不一样的,以Spring配置为例,在Weblogic中,需 ...

  5. 0918 iOS10兼容/iOS系统过高或过低配置包/混合引擎的在线视频连麦互动直播/源码管理工具/Xcode8插件升级/导航栏渐变

    1 兼容iOS 10 资料整理笔记 http://www.jianshu.com/p/42e506998082 iOS developerDiskImage 这是由于真机系统过高或者过低,Xcode中 ...

  6. 兼容 Spring Boot 1.x 和 2.x 配置类参数绑定的工具类 SpringBootBindUtil

    为了让我提供的通用 Mapper 的 boot-starter 同时兼容 Spring Boot 1.x 和 2.x,增加了这么一个工具类. 在 Spring Boot 中,能够直接注入 XXProp ...

  7. 【Android 安全】DEX 加密 ( Application 替换 | 兼容 ContentProvider 操作 | 源码资源 )

    文章目录 一. 命中 ActivityThread 中 installProvider 方法的分支三 1. 原理分析 2. 代码实现 二. 在 ContextImpl 的 createPackageC ...

  8. linux怎样自动检查link文件_自动共享和上传文件到兼容的托管站点 | Linux 中国

    Anypaste 将会根据你想上传的文件的类型来自动挑选合适的托管站点.简单地说,照片将被上传到图像托管站点,视频被传到视频站点,代码被传到 pastebin. -- Sk(作者) 前阵子我们写了一个 ...

  9. SAP产品的Field Extensibility

    SAP开发人员的工作职责,除了实现软件的功能性需求外,还会花费相当的精力实现一些非功能性需求,来满足所谓的SAP Product Standard(产品标准).这些产品标准,包含在SAP项目实施中大显 ...

最新文章

  1. 利用三个点(trsf)来实现各种规则图形的实现
  2. 【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 批量方法委托 )
  3. JVM运行时数据区概览
  4. 【Paddle】解压文件到指定文件夹
  5. 九度OJ 1054:字符串内排序
  6. React - 状态提升
  7. 1001 害死人不偿命的(3n+1)猜想 (15分)
  8. mysql中文时间转换,MySQL 当中 日期 字符串 时间戳互转
  9. 熬夜整理出30张可视化大屏模板,不敲一个代码就能直接套用
  10. placeholder在不同浏览器下的表现及兼容方法 placeholder兼容
  11. PKM全民推广系列三:PKM搜索
  12. 深圳CPDA数据分析认证:数据分析知识很难学么?
  13. opencv python 的基本操作案例(一) 记录,可查看
  14. win8用分区助手开不了机处理
  15. android 模拟器传文件夹里,夜神安卓模拟器和电脑互传文件的操作流程
  16. java微信提现_关于Java调用微信、支付宝支付提现
  17. 什么是user agent(用户代理)
  18. 《Verilog数字系统设计教程》夏宇闻 第四版思考题答案(第3章)
  19. 透过结构看思考与表达
  20. <datart二开>翻牌器侧(纵)轴对齐方式

热门文章

  1. 乐山计算机学校老师最受欢迎,乐山市计算机学校优秀教师白杉杉
  2. windows系统C盘越来越大怎么办(包括win10)
  3. 客户端与服务器信息交互的流程,客户端与服务器的交互流程
  4. 万维网、因特网、互联网
  5. setInterval定时器封装(settimeout\requestAnimationFrame),代码抽离,浏览器切换后定时器停止执行
  6. protobuf 微信小程序_Protobuf在微信小游戏开发中的使用技巧
  7. PHP云任务Q助手Tools程序源码+多功能
  8. RTL-SDR 学习——什么是RTL-SDR(1)
  9. 安全测试涉及的测试对象有哪些?
  10. JAVA+Selenium+Chrome+Chromedriver 模拟浏览器