DSP开发,使用CCS软件建立工程以及烧录

article/2025/10/1 19:00:25

DSP开发,使用CCS软件建立工程以及烧录

  • 1 概述
    • 1.1 资源概述
    • 1.2 DSP介绍
  • 2 工程建立步骤
  • 4 烧录到flash中
  • 4.1 通过增减文件实现
    • 4.2 增加预编译宏
  • 5 独立下载工具
    • 5.1 Uniflash
    • 5.2 C2prog
  • 6 程序源码
    • 6.1main()函数
    • 6.2 leds.c文件
    • 6.3 leds.h文件

1 概述

实验的代码已经上传。

1.1 资源概述

开发板: 普中DSP开发板
CCS版本:6.1.3
主控芯片型号:TMS320F28335
开发板

1.2 DSP介绍

德州仪器DSP在电机控制领域使用非常多,在最近20年接近霸主的存在,计算能力屌爆早期的arm,典型的型号有2407和2812。但是最近两年arm上升势头非常明显,差距越来越小,而且在外设方面完爆DSP。加上中美贸易战,导致中国很多公司开始去美国化,在新一代的产品中不再选用德州仪器的DSP,而是选择ST的ARM芯片或者国产的一些arm芯片。但是旧的基于DSP平台开发的产品还是要维护,新的平台也需要从dsp上迁移过来,所以有必要熟悉DSP的应用。

2 工程建立步骤

1,在需要建立的工程的文件夹内新建一个工程文件夹,此文件夹名字以及所在路径不能包含中文名。
新建一个文件夹
2,打开CCS软件,在弹出的Workspace内指向刚才建立的文件夹。
文件路径
3,建立新工程
建立新工程
4,填入工程的相关信息,器件型号,工程名字,路径以及工程类型。进行第4步,在选择编译器的时候,需要特别注意,尽量使用与原工程相同或者相近版本的编译器,否则将会出现不可预知的错误。
工程信息
5,新建后的工程,只包含两个文件以及一个文件夹,文件为系统必须的头文件路径,RAM连接的配置文件28335_RAM_Ink.cmd。
工程文件
cmd文件可以在工程选项里边进行选择。
cmd文件选择
6,在工程文件夹下建立4个文件夹,其中LIB拷贝TI官方的库C文件,头文件以及汇编文件。这里的C文件用到哪些拷贝哪些,缺失或者多余将会导致报错,报错的类型是变量没有定义或者被重复定义。头文件需要全部进行拷贝,即使那些看起来风马牛不相及的文件,因为这些文件在系统初始化或者中断向量表中均有引用。(stm32的arm工程只需要拷贝需要的文件)。
建立文件夹
Lib->include文件夹的头文件
头文件清单
Lib->source文件夹的库函数文件,IQmath.lib为数学函数库,官方已经封装好。本例程中没有使用到复杂的数学计算,也可以不要。
库函数文件
user里边放置main.c文件,Hardware里边放置和硬件相关的文件,这里放置LED.c和LED.h。添加完后整个工程的结构是这样的
工程结构
7,增加头文件路径,选中工程,右键,点击Properties。
Properties
选择头文件路劲,其中workspace是相对路径,库文件必须在工程文件夹下,工程建立完成后即使挪动工程也不会导致头文件路径失效,browse是绝对路径,必须确保库文件路径不发生变化,否则将导致报错,variables是环境变量定义的库函数路径。还不知怎么使用。
头文件路劲
8,编译工程,没有错误和警告,编译完成后在工程树下可以看到生成了可供烧录的out文件。
编译结果
烧录用的.OUT文件
bin文件
9,烧录下载,这里和arm不同,这里只是烧录到了DSP的RAM,而不是FLASH。当断电或者重启时,程序将丢失,重新引导Flash里边的程序,如果要烧录到Flash需要进行另外的操作。点击烧录后会弹出对话框,配置调试的参数。
对话款
点击YES,在新弹出的对话框中填入文件名,并确认
对话框
10,选择仿真器和芯片型号型号,插入仿真器,点击右侧的 Test Connection。
仿真器
若正常,在最后的几行将会弹出仿真器连接成功提示信息
仿真器连接成功
11,再点击下载调试按钮,将会打开下载调试界面,可以单步调试添加断点等。在这里插入图片描述

4 烧录到flash中

4.1 通过增减文件实现

1,增加C文件,Memcopy.c
在这里插入图片描述
2,增加cmd文件28335.cmd,屏蔽旧的cmd文件28335_RAM_Ink.cmd,CMD文件为分配内存用。
文件处理
3,main函数中增加初始化操作代码;

	MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);InitFlash();

4,编译下载,程序烧录,烧录时间比烧录RAM长很多,这个过程注意不要断电,不要断开仿真下载器,也不要进行复位,否则将可能导致芯片被锁死,无法再次下载程序。另外烧录的密码也不要设置全0,否则芯片将会琐事死。
5,通过指定Cmd文件路径和在工程中增加cmd文件效果是等效的。如果是放在工程里边记得将不用的cmd文件无效掉。
指定路径

4.2 增加预编译宏

1,增加两套编译参数,复制于Debug。
编译参数
2,在Flash设置里边增加预编译全局宏。预编译参数宏
3,将代码写为宏定义的方式,使用ifdef,endif。在Ram配置里边,没有定义FlashProg,因此为灰色,在Flash配置里边有定义,此段代码将会被编译。
预编译
4,在配置参数配置过程中,不要使用Release,此种方式将会进行极简的优化,在闪灯的程序中,直接跳过了Delay函数,导致LED灯常亮。这里的Delay函数用的是简单的循环,被编译器优化了,而用系统的Systick实现的延时函数不会出现这个问题。

	while(1){LED1_TOGGLE;LED7_TOGGLE;delay();}

5,选择工程右键,可以选择不同的编译模式
编译模式设置

5 独立下载工具

5.1 Uniflash

TI官方提供了独立的下载工具Uniflash,可以对下载进行更多的设置,如设置密码,擦除选项,导出out或者bin文件等。
下载工具
另外官网提供一个较低版本的Uniflash(3.4.1),这个版本感觉更加好用一些,且支持XDS100 V1.0,上面那个版本是不支持的。这个软件相对于C2PROG的最大好处是支持芯片的单独擦除工作。
烧录
当芯片为28379D双核芯片时,需要选择对应的CPU下载文件,CPU01和CPU02,下载两次。设置保持默认即可。
双核芯片下载
使用此软件进行烧录时,需要注意烧录完成后,需要拔出仿真器,否则程序可能无法正常运行。可能是不会对其自动复位。
而下面讲的C2PROG却不会有这个问题,下完后就自行跑起来了。

5.2 C2prog

支持C2prog通过串口进行下载,支持out文件。这个下载器下载速度比官方提供的UNIFLASH还要快。
C2
boot跳线设置,不同的DSP拨码方式不相同。制作单板硬件时,通常时将前面三个直接拉到高,GPIO84通过跳线或者拨码进行设置。boot
注意使用串口下载时必须使用下述的端口,其它的端口会显示不能连接。不同的DSP对应的脚位也不同,具体参考数据手册。
端口
串口说明,一般来说电脑端或者USB转串口线都是公头,开发板端是母头,2和3的定义不同,恰好交叉。使用USB转串口线可以直插开发板通讯,如果是台式机自带串口连接开发板则需要使用直连线而不是交叉线。
串口定义说明
C2PROG这个软件支持使用仿真器通过JTAG下载DSP程序。
JTAG下载程序
支持的仿真器类型XDS系列的仿真器基本都支持
仿真器类型
双核F28379D需要分别选择对应的内核和烧录程序进行下载,因为两个CPU有各自独立的CPU内核。
独立的Flash
烧录CPU1
烧录CPU1
烧录CPU2
烧录CPU2

6 程序源码

6.1main()函数

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "leds.h"
/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,通过循环占用CPU,达到延时功能
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void delay(void)
{Uint16 		i;Uint32      j;for(i=0;i<32;i++)for (j = 0; j < 100000; j++);
}
/*******************************************************************************
* 函 数 名         : main
* 函数功能		   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main()
{InitSysCtrl();LED_Init();while(1){LED1_TOGGLE;delay();}
}

6.2 leds.c文件

特别需要注意的是,库函数中有一个叫led.c和led.h的文件,因此取名时一定要取个不一样的名字。

#include "leds.h"
/*******************************************************************************
* 函 数 名         : LED_Init
* 函数功能		   : LED初始化函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void LED_Init(void)
{EALLOW;SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟//LED1端口配置GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;//设置为通用GPIO功能GpioCtrlRegs.GPCDIR.bit.GPIO68=1;//设置GPIO方向为输出GpioCtrlRegs.GPCPUD.bit.GPIO68=0;//使能GPIO上拉电阻//LED2端口配置GpioCtrlRegs.GPCMUX1.bit.GPIO67=0;GpioCtrlRegs.GPCDIR.bit.GPIO67=1;GpioCtrlRegs.GPCPUD.bit.GPIO67=0;//LED3端口配置GpioCtrlRegs.GPCMUX1.bit.GPIO66=0;GpioCtrlRegs.GPCDIR.bit.GPIO66=1;GpioCtrlRegs.GPCPUD.bit.GPIO66=0;//LED4端口配置GpioCtrlRegs.GPCMUX1.bit.GPIO65=0;GpioCtrlRegs.GPCDIR.bit.GPIO65=1;GpioCtrlRegs.GPCPUD.bit.GPIO65=0;//LED5端口配置GpioCtrlRegs.GPCMUX1.bit.GPIO64=0;GpioCtrlRegs.GPCDIR.bit.GPIO64=1;GpioCtrlRegs.GPCPUD.bit.GPIO64=0;//LED6端口配置GpioCtrlRegs.GPAMUX1.bit.GPIO10=0;GpioCtrlRegs.GPADIR.bit.GPIO10=1;GpioCtrlRegs.GPAPUD.bit.GPIO10=0;//LED7端口配置GpioCtrlRegs.GPAMUX1.bit.GPIO11=0;GpioCtrlRegs.GPADIR.bit.GPIO11=1;GpioCtrlRegs.GPAPUD.bit.GPIO11=0;GpioDataRegs.GPCSET.bit.GPIO68=1;GpioDataRegs.GPCSET.bit.GPIO67=1;GpioDataRegs.GPCSET.bit.GPIO66=1;GpioDataRegs.GPCSET.bit.GPIO65=1;GpioDataRegs.GPCSET.bit.GPIO64=1;GpioDataRegs.GPASET.bit.GPIO10=1;GpioDataRegs.GPASET.bit.GPIO11=1;EDIS;
}

6.3 leds.h文件

#ifndef _LEDS_H_
#define _LEDS_H_
#include "DSP2833x_Device.h"     // DSP2833x 头文件
#include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件#define LED1_OFF		(GpioDataRegs.GPCSET.bit.GPIO68=1)
#define LED1_ON			(GpioDataRegs.GPCCLEAR.bit.GPIO68=1)
#define LED1_TOGGLE		(GpioDataRegs.GPCTOGGLE.bit.GPIO68=1)#define LED2_OFF		(GpioDataRegs.GPCSET.bit.GPIO67=1)
#define LED2_ON			(GpioDataRegs.GPCCLEAR.bit.GPIO67=1)
#define LED2_TOGGLE		(GpioDataRegs.GPCTOGGLE.bit.GPIO67=1)#define LED3_OFF		(GpioDataRegs.GPCSET.bit.GPIO66=1)
#define LED3_ON			(GpioDataRegs.GPCCLEAR.bit.GPIO66=1)
#define LED3_TOGGLE		(GpioDataRegs.GPCTOGGLE.bit.GPIO66=1)#define LED4_OFF		(GpioDataRegs.GPCSET.bit.GPIO65=1)
#define LED4_ON			(GpioDataRegs.GPCCLEAR.bit.GPIO65=1)
#define LED4_TOGGLE		(GpioDataRegs.GPCTOGGLE.bit.GPIO65=1)#define LED5_OFF		(GpioDataRegs.GPCSET.bit.GPIO64=1)
#define LED5_ON			(GpioDataRegs.GPCCLEAR.bit.GPIO64=1)
#define LED5_TOGGLE		(GpioDataRegs.GPCTOGGLE.bit.GPIO64=1)#define LED6_OFF		(GpioDataRegs.GPASET.bit.GPIO10=1)
#define LED6_ON			(GpioDataRegs.GPACLEAR.bit.GPIO10=1)
#define LED6_TOGGLE		(GpioDataRegs.GPATOGGLE.bit.GPIO10=1)#define LED7_OFF		(GpioDataRegs.GPASET.bit.GPIO11=1)
#define LED7_ON			(GpioDataRegs.GPACLEAR.bit.GPIO11=1)
#define LED7_TOGGLE		(GpioDataRegs.GPATOGGLE.bit.GPIO11=1)void LED_Init(void);#endif /* LED_H_ */

http://chatgpt.dhexx.cn/article/kv8OE0DQ.shtml

相关文章

浅谈DSP开发创建第一个工程Hello World

浅谈DSP开发创建第一个工程Hello World 本教程以TI公司的TMS320F2812芯片为例进行演示开发环境搭建(CCS)CMD文件概述编写第一个工程Hello World概述 本教程以TI公司的TMS320F2812芯片为例进行演示 开发环境搭建(CCS) 首先开发环境问题&#xff1a;目前最新TI官方发布的开发环…

DSP(数字信号处理器)技术概要

数字信号处理器(digital signal processor,DSP)是一种用于数字信号处理的可编程微处理器&#xff0c;它的诞生与快速发展&#xff0c;使各种数字信号处理算送得以实时实现&#xff0c;为数字信号处理的研究和应用打开了新局面&#xff0c;提供了低成本的实际工作环境和应用平台…

DSP_1 环境搭建

1、打开ccs6.0&#xff0c;将DSP281x_common、DSP281x_headers两个库文件导入到根目录当中。 2、在project的Properties当中添加库文件路径&#xff0c;使编译器能够找到这些文件。 3、exclude那些重定义的文件&#xff0c;即可。 4、编译的过程分为compile与link&#xff0c…

从BES蓝牙耳机开发中谈DSP开发与嵌入式ARM的区别

对比下DSP开发与嵌入式ARM的区别&#xff0c;DSP开发&#xff0c;发开算法&#xff0c;注意链接文件的使用。 一先看BES的DSP开发 1 lds链接文件之代码段text 存放可执行代码和浮点数常量 2 data数据段 3 .bss段 存放没有初始化的全局变量和静态变量。 二 ARM开发 主要是配置…

用于多核DSP开发的核间通信

TI的多核DSP以TMS320C6678为例&#xff0c;它是多核同构的处理器&#xff0c;内部是8个相同的C66x CorePac。对其中任意一个核的开发就和单核DSP开发的流程是类似的。   但是如果仅仅只是每个核独立开发&#xff0c;那么很难体现出多核的优势。要充分发挥多核处理器的性能&am…

近期C6000 DSP开发小结

使用C开发DSP 如果你也跟我一样刚开始接触C6000系列的DSP&#xff0c;我觉得可以尝试一下用C来开发&#xff0c;虽然说这么做代码的执行效率可能会比C或者纯汇编的开发来得低&#xff0c;但它胜在能够让整个工程的脉络更加清晰。 面向C6000开发的cl6x编译器对C有比较好的支持。…

【DSP开发】CCS5.5测试代码运行时间

1、进入CCS环境&#xff0c;load已有工程.out文件&#xff0c;找到要查看的代码执行周期的地方。 2、选择CCS菜单中的Run——Clock——Enable 3、选择Run——Clock——Setup 4、在左下角观察时钟周期 5、 至此就可以解决在代码中引入<time.h>后输出为0的情况&#xff…

ADI DSP开发环境(CCES)下的程序烧录问题(以ADSP-SC589为例)

在CCES环境下将程序烧录到flash主要有两种方式。 1.通过命令窗口 首先在对项目编译产生文件的属性设置为Release。 在编译完成后&#xff0c;找到每个CORE单独生成的DXE文件&#xff1a; 文件通常位于项目目录下每个core的Release文件中。 安装SC589评估板的驱动&#xff…

DSP开发环境及工具之CCS

DSP开发环境及工具之CCS CCS( Code Composer Studio)是美国德州仪器(TI)公司的嵌入式处理器的开发环境,可以用于TI公司的各个系列处理器的软件开发和调试,如DSP,MCU,ARM等。 主要的操作都是在这个窗口之间做相应的切换。 创建工程文件 或者

【FPGA-DSP】第二期:DSP开发流程【全过程】

目录 1. System Generator安装 1.1 system generator的安装 1.1.1 vivado安装System Generator 1.1.2 System Generator配置 1.3 启动 2. FPGA-DSP开发流程 2.1 FPGA-DSP 开发流程介绍 2.2 FPGA-DSP 实际开发流程 1. 软件启动 2. matlab编写 3. Simulink仿真 Simu…

DSP开发笔记一

前言 ​ 本笔记首先对DSP的特点及其选型进行了描述&#xff0c;然后重点记录DSP开发环境的搭建及基础工程示例&#xff0c;对为DSP开发新手有一定的指导作用。 1. DSP简介 1.1 主要特点 在一个指令周期内可完成一次乘法和一次加法&#xff1b;程序和数据空间分开&#xff0…

UML状态图示例

状态图是用于表示对象状态的UML图。 在图书管理系统中&#xff0c;图书有不同的状态&#xff0c;我们可以用状态图表示如下&#xff1a;

数据库课程设计——宾馆管理系统UML状态图

客户账号状态图 前台登录状态图 客户预订状态图 会员卡状态图

【转】超详细的UML状态图符号,初学者也能轻松看懂状态图

UML状态图&#xff0c;用于显示状态机&#xff0c;即描述一个对象所处的可能状态以及状态之间的转移。用状态图建模可以帮助开发人员分析复杂对象的各种状态的转换&#xff0c;以及对象何时执行怎样的动作。那状态图又是怎样表示这些信息的呢&#xff1f;要想看明白其中的奥妙&…

菜鸟实战UML——状态图

状态图 状态图(Statechart Diagram)&#xff1a;是描述一个实体基于事件反应的动态行为&#xff0c;显示了该实体如何根据当前所处的状态对不同的事件做出反应。通常我们创建一个UML状态图是为了以下的研究目的&#xff1a;研究类、角色、子系统、或组件的复杂行为。 理解&am…

UML——活动图和状态图

目录 活动图 活动图的基本要素 状态图 状态图的基本要素 状态图与活动图之间的区别 活动图 概念&#xff1a;活动图本质上是一种流程图&#xff0c;它描述活动的序列&#xff0c;即系统从一个活动到另一个活动的控制流。 作用 描述一个操作的执行过程中所完成的工作或者…

UML状态图 2021.07.18

概述 UML状态图主要用于描述对象具有的各种状态、状态之间的转换过程以及触发状态转换的各种事件和条件。 UML 状态图的目的: UML 状态图可以捕获对象、子系统和系统的生命周期&#xff0c;可以告知一个对象可以拥有的状态&#xff0c;并且事件(如消息的接收&#xff0c;时间…

UML状态机图

状态机图&#xff08;State Machine Diagram&#xff09;也叫状态图、有限状态机图&#xff08;Finite Diagram&#xff09;&#xff0c;是一种描述所有状态及状态之间流转规则的图形。在软件设计领域&#xff0c;“状态”在业务系统中无处不在&#xff1a;订单要有状态&#x…

UML—状态图

【内容】 1.什么是状态图 状态图描述一个特定对象的所有可能状态以及由于各种事件的发生而引起的状态之间的转移。状态图侧重于从行为的结果来描述&#xff0c;只涉及一个特定的对象&#xff0c;常用于动态特性建模。 2.状态图的组成 &#xff08;1&#xff09;起点、终点 …

UML——状态图

7 状态图&#xff08;Stage Diagram&#xff09; 7.1 概述 状态图主要用于描述对象的状态变化以确定何种行为改变了对象状态&#xff0c;以及对象状态变化对系统的影响。 通常只用于描述单个对象的行为。 状态图在描述单个复杂对象的行为时非常有助于我们理解一个对象的行为…