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

DSP开发,使用CCS软件建立工程1概述1.1资源概述2工程建立步骤1概述实验的代码已经上传。1.1资源概述开发板:普中DSP开发板CCS版本:6.1.3主控芯片型号:TMS320F283352工程建立步骤1,在需要建立的工程的文件夹内新建一个工程文件夹。2,打开CCS软件,在弹出的Workspace内指向刚才建立的文件夹。3,建立新工程4,填入工程的相关信息5,新建后的工程,只包含两个文件以及一个文件夹,系统必须的头文件,RAM连接的配置文件6,在工程文件

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

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_ */
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)
blank

相关推荐

  • oracle截取字符添加数据库,oracle截取字符串前几位的方法_数据库[通俗易懂]

    oracle截取字符添加数据库,oracle截取字符串前几位的方法_数据库[通俗易懂]数据库关系的6个性质_数据库数据库关系的6个性质:1、每一列中的分量为同一类型的数据,来自同一个域;2、不同的列可出自同一个域;3、列的次序可以任意交换;4、任意两个元组不能完全相同;5、行的次序可以任意交换;6、每一个分量都必须是不可分的数据库。oracle截取字符串前几位的方法Oracle提前某数据的前几位用substr函数。如test表中数据如下:现要提取dept字段中的前两位,可用如下…

    2022年10月22日
  • 【转载】究竟什么才是高精度地图(雷锋网)

    【转载】究竟什么才是高精度地图(雷锋网)原文地址:究竟什么才是高精度地图(一)究竟什么才是高精度地图(二)究竟什么才是高精度地图(三)究竟什么才是高精度地图(一)导语:如果有一张辅助的高精度地图,能否避免特斯拉ModelS的事故?

  • flowable入门

    flowable入门在使用flowable框架的时候,首先需要引入flowable的jar包,flowablemaven仓库地址为:  org.flowable  flowable-engine  6.0.0.RC1新建flowable.cfg.xml文件,如下图所示:flowable.cfg.xml文件内容如下所示:

  • sdn和nfv是什么_他她它怎么区分

    sdn和nfv是什么_他她它怎么区分那到底什么是NFV(网络功能虚拟化),它和之前的SDN(Software-definedNetworking)软件定义网络概念是一回事吗?它们有什么区别?SDN-诞生于校园,成熟于数据中心:SDN初始于园区网络,一群研究者(斯坦福的达人们)在进行科研时发现,每次进行新的协议部署尝试时,都需要改变网络设备的软件,这让他们非常郁闷,于是乎,他们开始考虑让这些网络硬件设备可编程化,并且可以被集中的一个盒子所管理和控制,就这样,诞生了当今SDN的基本定义和元素·分离控制和转发的功能·

  • 官网svn提交到代码库,但是不能同步到web目录

    官网svn提交到代码库,但是不能同步到web目录

  • biting的意思_什么是bit

    biting的意思_什么是bitCM3的存储器系统支持所谓的“位带”(bit-band)操作。通过它,实现了对单一比特的原子操作。位带操作仅适用于一些特殊的存储器区域中。 位带区与位带别名区的膨胀关系图      在位带区中,每个比特都映射到别名地址区的一个字——这是个只有LSB才有效的字。 支持位带操作的两个内存区的范围是:0x200

    2022年10月13日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号