TI DSP TMS320F280025 Note1:工程模板Template创建

news2024/12/30 3:09:45

TMS320F280025工程模板Template创建


文章目录

  • TMS320F280025工程模板Template创建
  • 新建一个ccs工程
  • 为需要添加的一些文件新建文件夹
  • 从c2000中拷贝官方基础文件到工程中
    • cmd链接文件
    • common头文件和源文件
    • headers头文件和源文件
    • 库函数文件
    • 添加driverlib.lib文件
  • 添加文件的路径
  • 文件移动、删除、屏蔽
    • 把创建工程生成的main.c文件移动到User目录下
    • 删除新建工程自动生成的RAM_lnk.cmd文件
    • 屏蔽掉bios.cmd和ram.cmd文件,bios和nobios、ram和flash都只能存在一个,屏蔽掉不需要的
    • 删除、屏蔽后即可编译成功了
  • 添加_FLASH宏定义符号
  • 例子:点个灯
    • SystemDriver.c
    • SystemDriver.h
    • GpioDriver.c
    • GpioDriver.h
    • main.c
    • main.h
    • 现象


软件版本:CCS12.0.0.00009
官方C200开发工具:C2000Ware_5_02_00_00
硬件平台:LAUNCHXL-F280025C开发板

该方法新建的工程支持寄存器开发,同时也支持库函数开发,新建后移动该工程也不需要重新修改路径,路径使用变量定义,使用方便、移植性能高

新建一个ccs工程

在这里插入图片描述
选择自己的芯片型号280025C,仿真器型号XDS110 USB,并给工程命名,命名只能是英文
在这里插入图片描述

编译一下新建的工程:
在这里插入图片描述

新建CCS工程后工程已经包含一些文件:
在这里插入图片描述

includes:工程包含的一些路径,如工程路径、头文件路径等
DEBUG:包含编译过程中生成的一些文件和结果文件
targetConfigs:调试器配置文件
280025_RAM_lnk.cmd:链接命令文件(.cmd文件)。它定义了内存布局和部分配置,来指导编译器和链接器如何在微控制器上安排代码和数据。文件分为两个主要部分:MEMORY和SECTIONS。一般不使用这个连接文件,后面会删除这个文件,使用官方提供的其他链接文件
main.c:主文件,主函数文件

为需要添加的一些文件新建文件夹

创建方法1:
点中工程->右键->新建->文件夹
在这里插入图片描述

选择路径(建在那个文件夹层级下)-> 填写文件名 ->完成
在这里插入图片描述

创建方法2:
直接找到工作目录下的这个工程文件,之间新建文件夹即可
在这里插入图片描述

创建后的文件层次:
在这里插入图片描述

ChipDevice:包含TI官方提供的的一些文件
ChipDevice/cmd:存放链接命令文件(.cmd文件)。它定义了内存布局和部分配置,来指导编译器和链接器如何在微控制器上安排代码和数据。
ChipDevice/common:存放官方common源文件和头文件
ChipDevice/driverlib:存放官方库函数相关的源文件和头文件
ChipDevice/headers:存放官方headers源文件和头文件
ChipDevice/lib:存放官方或第三方的库文件,比如:库函数库
Public:公共文件夹
User:存放用户自己编写的驱动代码

从c2000中拷贝官方基础文件到工程中

cmd链接文件

工程路径,cmd文件,按照自己工作目录修改

E:\ti\workspace\Template_demo\ChipDevice\cmd

C2000存放路径,按照存放目录修改

E:\ti\c2000\C2000Ware_5_02_00_00\device_support\f28002x\common\cmd
E:\ti\c2000\C2000Ware_5_02_00_00\device_support\f28002x\headers\cmd

common/cmd文件为FLASH/RAM相关的链接文件,flash表示下载代码到flash的链接文件、,ram表示下载代码到ram的链接文件
headers/cmd文件为是否带操作系统相关的链接文件,bois表示带操作系统、nobois表示不带操作系统
可以根据自己的需要拷贝相关链接文件
在这里插入图片描述

common头文件和源文件

直接把C2000中evice_support目录下该芯片的common目录下的include和source文件夹拷贝到该工程的common目录下
在这里插入图片描述

headers头文件和源文件

直接把C2000中device_support目录下该芯片的headers目录下的include和source文件夹拷贝到该工程的headers目录下
在这里插入图片描述

库函数文件

直接把C2000中的driverlib目录下该芯片的driverlib文件夹拷贝到该工程的headers目录下
在这里插入图片描述

把拷贝的driverlib文件夹下的css文件夹删掉
在这里插入图片描述

添加driverlib.lib文件

把\driverlib\f28002x\driverlib\ccs\Debug下的driverlib.lib文件拷贝到工程lib目录下
在这里插入图片描述

添加文件的路径

在这里插入图片描述

在这里插入图片描述

添加刚才拷贝的文件的路径

${PROJECT_ROOT}/ChipDevice/lib

在这里插入图片描述

${PROJECT_ROOT}/ChipDevice/headers

${PROJECT_ROOT}/ChipDevice/headers/source

${PROJECT_ROOT}/ChipDevice/headers/include

${PROJECT_ROOT}/ChipDevice/driverlib

${PROJECT_ROOT}/ChipDevice/driverlib/inc

${PROJECT_ROOT}/ChipDevice/cmd

${PROJECT_ROOT}/ChipDevice/common

${PROJECT_ROOT}/ChipDevice/common/source

${PROJECT_ROOT}/ChipDevice/common/include

${PROJECT_ROOT}/ChipDevice

${PROJECT_ROOT}/User

${PROJECT_ROOT}/Public
在这里插入图片描述

添加后一定要记得应用到工程

文件移动、删除、屏蔽

把创建工程生成的main.c文件移动到User目录下

点中文件,右键

在这里插入图片描述
在这里插入图片描述

删除新建工程自动生成的RAM_lnk.cmd文件

在这里插入图片描述

屏蔽掉bios.cmd和ram.cmd文件,bios和nobios、ram和flash都只能存在一个,屏蔽掉不需要的

在这里插入图片描述

删除、屏蔽后即可编译成功了

在这里插入图片描述

如果不屏蔽尽、删除生成的cmd文件,编译会因为有多个链接文件,重叠而报错
如下
在这里插入图片描述

添加_FLASH宏定义符号

把代码下载到FLASH才需要添加,如果下载到RAM可以不用添加,但前面屏蔽的cmd文件要改为屏蔽flash相关的cmd文件
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

至此,工程模板建立完成

例子:点个灯

按我的习惯,把头文件放到main.h中,不同类型的驱动都新建一个文件夹保存
新建main.h文件,系统初始化驱动文件夹和文件、gpio驱动文件夹和文件
在这里插入图片描述

记得添加路径

在这里插入图片描述

SystemDriver.c

#include "SystemDriver.h"

void Init_SysInit(void)
{
        //
    //Step 1. Initialize System Control:                                第一步。初始化系统控制:
    //PLL, WatchDog,enabe Peripheral Clocks                             锁相环,WatchDog,启用外围时钟
    //This example function is found in the f28004x_sysctrl.c file.     这个示例函数可以在f28004x_sysctrl.c文件中找到。
    //
    InitSysCtrl();

    //
    //Step 2. Initialize GPIO       步骤2。初始化GPIO
    //
    InitGpio();

    //
    //Step 3. Clear all __interrupts and initialize PIE vector table:   第三步。清除所有__interrupts并初始化PIE向量表:
    //Disable CPU __interrupts                                          禁用CPU __interrupts
    //
    DINT;

    //
    //Initialize the PIE control registers to their default state.  将PIE控制寄存器初始化为其默认状态。
    //The default state is all PIE interrupts disabled and flags    默认状态是禁用所有PIE中断和标志
    //are cleared.                                                  清除
    //
    InitPieCtrl();

    //
    //Disable CPU interrupts and clear all CPU interrupt flags:
    //禁用CPU中断并清除所有CPU中断标志:
    IER = 0x0000;
    IFR = 0x0000;

    //
    //Initialize the PIE vector table with pointers to the shell Interrupt
    //Service Routines (ISR).
    //用指向shell中断服务例程(ISR)的指针初始化PIE向量表。
    InitPieVectTable();

    EINT;           // Enable Global interrupt INTM
    ERTM;           // Enable Global realtime interrupt DBGM
}

SystemDriver.h

#ifndef SYSTEM_DRIVER_H_
#define SYSTEM_DRIVER_H_


#include "f28x_project.h"
#include "driverlib.h"
#include "device.h"

void Init_SysInit(void);
#endif /* SYSTEM_DRIVER_H_ */

GpioDriver.c

#include "GpioDriver.h"
#include "main.h"

void GpioDriver_Init(void)
{
    EALLOW;

    /*
     * 设置GPIO31、34为输出模式,正常输出,禁止上拉
     */
    //GpioCtrlRegs.GPAGMUX2.bit.GPIO31 = 0;           //默认为0  定义GPIO复位类型的引脚 复用选择:SYSRSn
    GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0;            // 默认为0   定义GPIO的引脚Mux复用选择
    //GpioCtrlRegs.GPAPUD.bit.GPIO31 = 1;             // 0:开启上拉功能    1:表示禁止上拉。
    //GpioCtrlRegs.GPAODR.bit.GPIO31 = 0;             // 0:正常输出       1:开漏输出
    GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;             // 0:配置引脚为输入。 1:配置输出引脚。
    //GpioCtrlRegs.GPAQSEL2.bit.GPIO31 = 0;           // 0,0 Sync ;     0,1 qualification(3个采样);   1,0 qualification(6个采样);    1,1 Async(没有Sync或qualification);
    GpioDataRegs.GPASET.bit.GPIO31 = 1;             // 1将强制GPIO输出数据锁存为1
    //GpioDataRegs.GPACLEAR.bit.GPIO31 = 1;

    //GpioCtrlRegs.GPBGMUX1.bit.GPIO34 = 0;           //默认为0  定义GPIO复位类型的引脚 复用选择:SYSRSn
    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;            // GPIO的引脚Mux复用选择
    //GpioCtrlRegs.GPBPUD.bit.GPIO34 = 1;             // 0:开启上拉功能    默认1:表示禁止上拉
    //GpioCtrlRegs.GPBODR.bit.GPIO34 = 0;             // 默认0:正常输出       1:开漏输出
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;             // 0:配置引脚为输入。 1:配置输出引脚。
    //GpioCtrlRegs.GPBQSEL1.bit.GPIO34 = 0;         // 0,0 Sync ;     0,1 qualification(3个采样);   1,0 qualification(6个采样);    1,1 Async(没有Sync或qualification);
    //GpioDataRegs.GPBSET.bit.GPIO34 = 1;           // 写1将强制GPIO输出数据锁存为
    GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;           //写1将强制GPIO0输出数据锁存为0。
    EDIS;
}

GpioDriver.h

#ifndef _GPIO_DRIVER_H
#define _GPIO_DRIVER_H

#include "f28x_project.h"
#include "driverlib.h"
#include "device.h"



#define LED1_ON()          (GpioDataRegs.GPACLEAR.bit.GPIO31 = 1)
#define LED1_OFF()         (GpioDataRegs.GPASET.bit.GPIO31 = 1)
#define LED1_TOGGLE()        (GpioDataRegs.GPATOGGLE.bit.GPIO31 = 1)
#define LED1_STATUS         (GpioDataRegs.GPADAT.bit.GPIO31)

#define LED2_ON()          (GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1)
#define LED2_OFF()         (GpioDataRegs.GPBSET.bit.GPIO34 = 1)
#define LED2_TOGGLE()        (GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1)
#define LED2_STATUS         (GpioDataRegs.GPBDAT.bit.GPIO34)


#endif 

main.c

#include"main.h"
/**
 * main.c
 */
void main()
{

    Init_SysInit();
    GpioDriver_Init();
    while(1){
        LED1_ON() ;
        LED2_TOGGLE();
        DELAY_US(1000000);
    }



}

main.h

#ifndef _MAIN_H__
#define _MAIN_H__


#include "f28x_project.h"

//#include <math.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdint.h>

#include "driverlib.h"
#include "device.h"
#include "SystemDriver.h"
#include "GpioDriver.h"


#endif

现象

LED1常亮,2每隔1s反转
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2052024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【微信小程序】生命周期

1. 什么是生命周期 2. 生命周期的分类 3. 什么是生命周期函数 4. 生命周期函数的分类 5. 应用的生命周期函数 小程序的应用生命周期函数需要在app.js中进行声明&#xff0c;示例代码如下&#xff1a; 6. 页面的生命周期函数 小程序的页面生命周期函数需要在页面的 .js 文件…

将 hugo 博客搬迁到服务器

1. 说明 在 Ubuntu 22.04 上使用 root 账号&#xff0c;创建普通账号&#xff0c;并赋予 root 权限。 演示站点&#xff1a;https://woniu336.github.io/ 魔改hugo主题: https://github.com/woniu336/hugo-magic 2. 服务器配置 建立 git 用户 adduser git安装 git sudo apt …

蓝图中结构体改变后,要重新创建widget

发现了一个怪现象&#xff0c;在更改结构体后&#xff0c;界面上出不来相应的信息了&#xff0c;断掉传递到界面上的线后&#xff0c;再重新连接&#xff0c;发现错误“只有完全匹配的结构才是兼容的”&#xff0c;删除后&#xff0c;重新创建widget&#xff0c;正常。 如下图…

【STM32项目】在FreeRtos背景下的实战项目的实现过程(二)

个人主页~ 实战项目的实现过程&#xff08;一&#xff09;~ 实战项目的实现过程 二、初步了解各个外设硬件1、OLED模块2、GPS模块3、MPU6050模块4、超声测距模块5、温度测控模块6、语音模块7、SIM模块8、按键模块 三、查阅资料1、查看手册2、查找例程 四、研究硬件功能1、OLED…

OpenCv图像处理: 时域滤波与频域滤波

时域滤波&#xff1a; 空间域滤波的步骤一般如下&#xff1a; 1. 选择滤波器 选择一种低通滤波器&#xff0c;常见的包括&#xff1a; 均值滤波&#xff08;平均滤波器&#xff09;高斯滤波&#xff08;Gaussian filter&#xff09; 2. 定义滤波器核 根据选择的滤波器类型&…

【卡码网Python基础课 19.洗盘子】

目录 题目描述与分析一、栈二、栈的操作三、代码编写 题目描述与分析 题目描述&#xff1a; 在餐厅里&#xff0c;洗盘子的工作需要使用到栈这种数据结构。 假设你手里有一个盘子堆放区。现在需要模拟洗盘子的过程&#xff0c;每个盘子都有一个编号。 盘子堆放区操作说明&…

同一台电脑上安装不同版本的nodejs(搭配VSCode)

今天拉取了一个前后端分离的项目&#xff0c;运行前端的时候&#xff0c;出现node版本不匹配的情况。 本文章将从安装node.js开始到VSCode使用进行讲解 1、去官网下载node版本 以16版本为例&#xff0c;需要哪个版本&#xff0c;就在网址上把版本号替换即可 https://nodejs.o…

在ADS中使用传输端口参数构建理想元器件模型---以3dB电桥为例

在ADS中使用传输端口参数&#xff08;S、Z、Y、ABCD&#xff09;构建理想元器件模型—以3dB电桥为例 本文工程文件下载&#xff1a;在ADS中使用传输端口参数构建理想元器件模型-以3dB电桥为例-工程文件 目录 在ADS中使用传输端口参数&#xff08;S、Z、Y、ABCD&#xff09;构建…

8月18日笔记

目标不出网场景 在目标环境完全不出网的情况下&#xff0c;即所有的网络通信如SMB&#xff08;Server Message Block&#xff09;、DNS&#xff08;Domain Name System&#xff09;甚至包括TCP&#xff08;Transmission Control Protocol&#xff09;都不允许与外部网络进行交…

使用极限网关实现 ES 跨集群搜索

使用 ES 的小伙伴&#xff0c;有没有在用跨集群搜索的&#xff1f; 熟悉 ES 的小伙伴都知道&#xff0c;ES 本身就能实现跨集群搜索&#xff0c;那为啥还要聊这个&#xff1f;试想一下&#xff0c;如果集群都上线投产了&#xff0c;才出现跨集群搜索需求&#xff0c;那么可能出…

重磅!RISC-V+OpenHarmony平板电脑发布

仟江水商业电讯&#xff08;8月18日 北京 委托发布&#xff09;RISC-V作为历史上全球发展速度最快、创新最为活跃的开放指令架构&#xff0c;正在不断拓展高性能计算领域的边界。OpenHarmony是由开放原子开源基金会孵化并运营的开源项目&#xff0c;已成为发展速度最快的智能终…

Chapter 40 Socket网络编程

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、Socket网络编程二、Socket服务端编程三、Socket客户端编程四、服务端与客户端相互通讯 前言 在现代计算机网络中&#xff0c;Socket&#xff08;套接字&#xff09…

【题解】—— LeetCode一周小结33

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结32 12.实现一个魔法字典 题目链接&#xff1a;676. 实现一个魔…

Kettle根据时间戳同步数据实现

1 Kettle总体步骤 更多数据实时同步方案&#xff0c;请参考笔者的另一篇博文&#xff1a;大数据时代&#xff0c;数据实时同步解决方案的思考—最全的数据同步总结 由于Kettle自身的特殊性以及在多个步骤中kettle自身处理数据库事务的特殊性&#xff0c;尝试了很多种方案&…

win11内存占用高的解决办法

win11莫名奇妙的总是内存爆满&#xff0c;真的抽象&#xff0c;16g根本不够用。尝试各种方法看看能不能解决… 方法一 关闭快速启动 win11系统&#xff0c;自带快速开机功能&#xff0c;可能用较大内存&#xff0c;关闭看看。控制面板找到电源设置关闭快速启动。 如果没找到要…

C++ | Leetcode C++题解之第345题反转字符串中的元音字母

题目&#xff1a; 题解&#xff1a; class Solution { public:string reverseVowels(string s) {auto isVowel [vowels "aeiouAEIOU"s](char ch) {return vowels.find(ch) ! string::npos;};int n s.size();int i 0, j n - 1;while (i < j) {while (i < …

Leetcode JAVA刷刷站(48)旋转图像

一、题目概述 二、思路方向 要在原地顺时针旋转一个 n x n 的二维矩阵 90 度&#xff0c;你可以通过一系列交换操作来实现。这里的关键在于理解旋转后的矩阵与原矩阵之间的元素对应关系。 假设原矩阵为 matrix&#xff0c;其中 matrix[i][j] 表示第 i 行第 j 列的元素。旋转 90…

【每日一题 | 数据结构】压缩矩阵存储算法

题型方法讲解 首先明确&#xff0c;压缩矩阵存储算法是408考试中的重点、难点、高频考点&#xff0c;甚至曾经达成了连续五年考到程度&#xff0c;让同学们感到恐惧。很多同学都会把这类题型当成一个记公式的题&#xff0c;其实不然&#xff0c;这个视频将会告诉你如何用推导的…

485总线常开+常闭,8路C型继电器输出模块DAM-3018CA

阿尔泰科技 型号&#xff1a;DAM-3018CA 概述&#xff1a; DAM-3018CA为8路C型继电器输出模块&#xff0c;每通道具有LED指示灯指示&#xff0c;RS485通讯接口&#xff0c;带有标准ModbusRTU协议。配备良好的人机交互界面&#xff0c;使用方便&#xff0c;性能稳定。 产品图…

Leetcode JAVA刷刷站(50)Pow(x, n)

一、题目概述 二、思路方向 方法1&#xff1a;递归&#xff08;考虑正负n&#xff09; 这种方法利用递归的思想&#xff0c;将问题分解为更小的子问题。同时&#xff0c;考虑到n可能是负数&#xff0c;我们可以先处理n的符号&#xff0c;然后将问题转化为正数幂的问题。 publi…