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

2022-07-22 16:15:07 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

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文件可以在工程选项里边进行选择。

6,在工程文件夹下建立4个文件夹,其中LIB拷贝TI官方的库C文件,头文件以及汇编文件。这里的C文件用到哪些拷贝哪些,缺失或者多余将会导致报错,报错的类型是变量没有定义或者被重复定义。头文件需要全部进行拷贝,即使那些看起来风马牛不相及的文件,因为这些文件在系统初始化或者中断向量表中均有引用。(stm32的arm工程只需要拷贝需要的文件)。

Lib->include文件夹的头文件

Lib->source文件夹的库函数文件,IQmath.lib为数学函数库,官方已经封装好。本例程中没有使用到复杂的数学计算,也可以不要。

user里边放置main.c文件,Hardware里边放置和硬件相关的文件,这里放置LED.c和LED.h。添加完后整个工程的结构是这样的

7,增加头文件路径,选中工程,右键,点击Properties。

选择头文件路劲,其中workspace是相对路径,库文件必须在工程文件夹下,工程建立完成后即使挪动工程也不会导致头文件路径失效,browse是绝对路径,必须确保库文件路径不发生变化,否则将导致报错,variables是环境变量定义的库函数路径。还不知怎么使用。

8,编译工程,没有错误和警告,编译完成后在工程树下可以看到生成了可供烧录的out文件。

烧录用的.OUT文件

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函数中增加初始化操作代码;

代码语言:javascript复制
	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实现的延时函数不会出现这个问题。

代码语言:javascript复制
	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还要快。

boot跳线设置,不同的DSP拨码方式不相同。制作单板硬件时,通常时将前面三个直接拉到高,GPIO84通过跳线或者拨码进行设置。

注意使用串口下载时必须使用下述的端口,其它的端口会显示不能连接。不同的DSP对应的脚位也不同,具体参考数据手册。

串口说明,一般来说电脑端或者USB转串口线都是公头,开发板端是母头,2和3的定义不同,恰好交叉。使用USB转串口线可以直插开发板通讯,如果是台式机自带串口连接开发板则需要使用直连线而不是交叉线。

C2PROG这个软件支持使用仿真器通过JTAG下载DSP程序。

支持的仿真器类型XDS系列的仿真器基本都支持

双核F28379D需要分别选择对应的内核和烧录程序进行下载,因为两个CPU有各自独立的CPU内核。

烧录CPU1

烧录CPU2

6 程序源码

6.1main()函数

代码语言:javascript复制
#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的文件,因此取名时一定要取个不一样的名字。

代码语言:javascript复制
#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文件

代码语言:javascript复制
#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_ */

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/125882.html原文链接:https://javaforall.cn

0 人点赞